删除约束注意:

网上说是 ALTER TABLE 表名 DROP CONSTRAINT 约束名;

这里的CONSTRAINT 是指primary key,foreign key,unique,等实际的约束,删除的时候需要用对应的替换(注意:唯一性约束用 INDEX)

  1. USE work;
  2.  
  3. /*创建选修数据表*/
  4. DROP TABLE IF EXISTS sc;
  5. CREATE TABLE sc(
  6. sno CHAR(8) COMMENT '学号',
  7. cno CHAR(3) COMMENT '课程号',
  8. grade     SMALLINT COMMENT '成绩'
  9. );
  10.  
  11. /*创建学生数据表*/
  12. DROP TABLE IF EXISTS student;
  13. CREATE TABLE student(
  14. sno CHAR(8) COMMENT'学号',
  15. sname VARCHAR(20) COMMENT '姓名',
  16. sgender CHAR(2) COMMENT '性别',
  17. sage INT COMMENT '年龄',
  18. sdept VARCHAR(30)    COMMENT '所系',
  19. sedat VARCHAR(30) COMMENT '入学日期'
  20. );
  21.  
  22. /*创建课程数据表*/
  23. DROP TABLE IF EXISTS course;
  24. CREATE TABLE course(
  25. cno CHAR(3) COMMENT '课程号',
  26. cname VARCHAR(30) COMMENT '课程名',
  27. ccredit SMALLINT COMMENT '学分'
  28. );
  29.  
  30. /*插入数据*/
  31. INSERT INTO student(sno,sname,sgender,sage,sdept,sedat)
  32. VALUES
  33. ('','王力','男',19,'计算机','2013/9/11'),
  34. ('','张红','女',20,'计算机','2013/9/11'),
  35. ('','孙国庆','男',18,'信息','2013/9/11');
  36. INSERT INTO course(cno,cname,ccredit)
  37. VALUES
  38. ('','数据结构',4),
  39. ('','数据库',3),
  40. ('','C语言程序设计',6);
  41. INSERT INTO sc(sno,cno,grade)
  42. VALUES
  43. ('','',''),
  44. ('','',''),
  45. ('','',''),
  46. ('','','');
  47.  
  48. /*修改表结构*/
  49. ALTER TABLE student ADD sphone char(11);
  50. ALTER TABLE student MODIFY COLUMN sphone char(20);
  51. ALTER TABLE student DROP COLUMN sphone;
  52.  
  53. /*对数据表添加修改约束*/
  54. -- 添加主键约束
  55. ALTER TABLE student ADD CONSTRAINT pk_student PRIMARY KEY(sno);
  56. ALTER TABLE course ADD CONSTRAINT pk_course PRIMARY KEY(cno);
  57. ALTER TABLE sc ADD CONSTRAINT pk_sc PRIMARY KEY(sno,cno);
  58.  
  59. -- 当主表中的数据删除,从表的对应行也删除
  60. -- 添加外键约束
  61. ALTER TABLE sc ADD CONSTRAINT fk_student_sc FOREIGN KEY(sno) REFERENCES student(sno) ON DELETE CASCADE;
  62. ALTER TABLE sc ADD CONSTRAINT fk_course_sc FOREIGN KEY(cno) REFERENCES course(cno) ON DELETE CASCADE;
  63.  
  64. -- 添加非空约束
  65. ALTER TABLE student MODIFY COLUMN sname VARCHAR(20) NOT NULL;
  66. ALTER TABLE course MODIFY COLUMN cname VARCHAR(30) NOT NULL;
  67.  
  68. -- 添加唯一约束
  69. -- ALTER TABLE course ADD UNIQUE(cname);
  70. ALTER TABLE course ADD CONSTRAINT u_cname UNIQUE(cname);
  71.  
  72. -- 添加CHECK约束
  73. ALTER TABLE student ADD CONSTRAINT ck_sgender CHECK(sgender in('男','女'));
  74. ALTER TABLE student ADD CONSTRAINT ck_sage CHECK(sage BETWEEN 15 AND 35);
  75.  
  76. /*删除刚刚添加的约束*/
  77.  
  78. -- 先删除外键约束才能删除主表的主键约束
  79. ALTER TABLE sc DROP FOREIGN KEY fk_student_sc;
  80. ALTER TABLE sc DROP FOREIGN KEY fk_course_sc;
  81.  
  82. ALTER TABLE student DROP PRIMARY KEY;
  83. ALTER TABLE course DROP PRIMARY KEY;
  84. ALTER TABLE sc DROP PRIMARY KEY;
  85.  
  86. ALTER TABLE student MODIFY COLUMN sname VARCHAR(20) NULL;
  87. ALTER TABLE course MODIFY COLUMN cname VARCHAR(30) NULL;
  88.  
  89. ALTER TABLE course DROP INDEX u_cname;
  90. -- 不能删除,报错ALTER TABLE course DROP INDEX(cname);
  91.  
  92. -- mysql数据库不支持check约束,添加也无效,删除更不支持
  93. /*ALTER TABLE student DROP CHECK ck_sgender;
  94. ALTER TABLE student DROP CHECK ck_sage;*/
  95.  
  96. SELECT * FROM student;
  97. SELECT * FROM course;
  98. SELECT * FROM sc;

--------------------------------DEMO2-------------------------------

  1. USE work;
  2.  
  3. -- 查询全体学生的详细信息
  4. SELECT * FROM student;
  5.  
  6. -- 检索全体学生的学号、姓名
  7. SELECT sno,sname FROM student;
  8.  
  9. -- 线索已选课程的课程号,要求显示的课程号不重复
  10. SELECT DISTINCT(cno) FROM sc;
  11.  
  12. -- 查询全体学生的姓名及出生日期
  13. -- SELECT YEAR(CURDATE())- sage AS 出生年份 FROM student;
  14.  
  15. -- 查询成绩大于80分的学生的学号、课程号及成绩
  16. SELECT sno,cno,grade FROM sc WHERE grade > 80;
  17.  
  18. -- 查询成绩介于70~80分的学生的学号、课程号及成绩
  19. SELECT sno,cno,grade FROM sc WHERE grade BETWEEN 70 AND 80;
  20.  
  21. -- 查询选修了课程号为"101",且成绩大于80分的学生的学号
  22. SELECT sno FROM sc WHERE cno = 101 AND grade > 80;
  23.  
  24. -- 查询"数据结构" "C语言程序设计"课程的详细信息
  25. SELECT * FROM course WHERE cname = '数据结构' OR cname = 'C语言程序设计';
  26.  
  27. -- 检索姓王的同学的详细信息(like,模糊查询,'%'代表任意0个或多个字符)
  28. SELECT * FROM student WHERE sname like '王%';
  29.  
  30. -- 检索名字中第二个字是"力""历"的学生的详细信息('_'代表任意单个字符)
  31. SELECT * FROM student WHERE sname like '_力%' OR '_历%';
  32.  
  33. -- 查询全体学生的姓名及其年龄,并按学生的年龄降序排列(升序ASC,降序DESC)
  34. SELECT sname,sage FROM student ORDER BY sage DESC;
  35.  
  36. -- 查询学生总人数
  37. SELECT COUNT(sno) FROM student;
  38.  
  39. -- 计算选修'101'号课程的学生的平均成绩、最高分和最低分
  40. SELECT MAX(grade) AS 最高分,MIN(grade) AS 最低分,AVG(grade) AS 平均成绩 FROM sc WHERE cno = '';
  41.  
  42. -- 汇总总分大于200分的学生的学号及总成绩
  43. SELECT sno AS 学号,SUM(grade) AS 总成绩 FROM sc GROUP BY sno HAVING SUM(grade) > 200;
  44.  
  45. -- 统计各个课程的选课人数
  46. SELECT cno AS 课程号,COUNT(*) AS 选课人数 FROM sc GROUP BY cno;
  47.  
  48. -- 检索多于2名学生选修的并以1结尾的课程号和平均成绩
  49. -- 数据量不够,我自己改成了至少1人选修的以1开头的课程号和平均成绩,
  50. SELECT cno AS 课程号, AVG(grade) AS 平均成绩 FROM sc WHERE cno like '1%' GROUP BY cno HAVING COUNT(cno) > 0;

--------------------------------DEMO3-------------------------------

  1. -- 检索所有学生的选课信息,包括学号、姓名、课程号、课程名和成绩
  2. SELECT
  3. s.sno AS 学号 ,
  4. s.sname AS 姓名,
  5. c.cno AS 课程号,
  6. c.cname AS 课程名,
  7. sc.grade AS 成绩
  8. FROM
  9. Student s,
  10. Course c,
  11. SC
  12. WHERE
  13. s.sno = sc.sno
  14. AND c.cno = sc.cno;
  15.  
  16. -- 查询选修了"C语言程序设计"的学生学号和姓名。
  17. SELECT
  18. s.sno AS 学号,
  19. s.sname AS 姓名
  20. FROM
  21. Student s,
  22. Course c,
  23. SC
  24. WHERE
  25. s.sno = sc.sno
  26. AND c.cno = sc.cno
  27. AND c.cname = 'C语言程序设计';
  28.  
  29. -- 查询与"张红"在同一个系的学生学号、姓名和所属系。
  30. SELECT
  31. sno AS 学号,
  32. sname AS 姓名,
  33. sdept AS
  34. FROM
  35. student
  36. WHERE
  37. sdept = (
  38. SELECT
  39. sdept
  40. FROM
  41. student
  42. WHERE
  43. sname = '张红'
  44. );
  45. -- 查询其它系中比信息系的所有学生年龄都大的学生的学号、姓名和年龄
  46. SELECT
  47. sno AS 学号,
  48. sname AS 姓名,
  49. sage AS 年龄
  50. FROM
  51. student
  52. WHERE
  53. sage > (
  54. SELECT
  55. max(sage)
  56. FROM
  57. student
  58. WHERE
  59. sdept = '信息'
  60. )
  61. AND sdept <> '信息';
  62.  
  63. -- 查询比"王力"年纪大的男学生信息
  64. SELECT
  65. *
  66. FROM
  67. student
  68. WHERE
  69. sage > (
  70. SELECT
  71. sage
  72. FROM
  73. student
  74. WHERE
  75. sname = '王力'
  76. )
  77. AND sgender = '男';
  78.  
  79. -- 查询每个学生选修课程的学号和课程号和成绩,要求该选修课程的成绩超过他选修课程的平均成绩
  80. SELECT
  81. sc.sno AS 学号,
  82. sc.cno AS 课程号,
  83. sc.grade AS 成绩
  84. FROM
  85. (
  86. SELECT
  87. AVG(grade) avg,
  88. sno
  89. FROM
  90. SC
  91. GROUP BY
  92. sno
  93. ) av,
  94. sc
  95. WHERE
  96. av.sno = sc.sno
  97. AND grade >= av.avg;
  98.  
  99. -- 检索最高分与最低分之差大于10分的学生的学号、最高分和最低分
  100. SELECT DISTINCT
  101. sc.sno AS 学号,
  102. m.max AS 最高分,
  103. m.min AS 最低分
  104. FROM
  105. (
  106. SELECT
  107. MIN(grade) min,
  108. MAX(grade) max,
  109. sno
  110. FROM
  111. SC
  112. GROUP BY
  113. sno
  114. ) m,
  115. sc
  116. WHERE
  117. sc.sno = m.sno
  118. AND (m.max - m.min) > 10;
  119.  
  120. -- 检索选修2门以上课程的学生的学号和总成绩(不统计不及格的课程),并要求按总成绩的降序排列出来.
  121. SELECT
  122. sc.sno AS 学号,
  123. SUM(grade) AS 总成绩
  124. FROM
  125. (
  126. SELECT
  127. sno,
  128. count(cno) c
  129. FROM
  130. sc
  131. GROUP BY
  132. sno
  133. HAVING
  134. COUNT(*) > 2
  135. ) cn,
  136. sc
  137. WHERE
  138. cn.sno = sc.sno
  139. AND grade >= 60
  140. GROUP BY
  141. sc.sno
  142. ORDER BY
  143. 总成绩 DESC;
  144.  
  145. -- 查询选修了全部课程的学生学号和姓名
  146. -- 第一步:查询出成绩表中的学号和对应选课数量 SELECT sno,COUNT(cno) FROM sc GROUP BY sno;
  147. -- 第二步:查询出课程表中所有课程的数量 SELECT count(cno) FROM course;
  148. -- 查询到 选课数量 所有课程的数量 相等(代表选修了全部课程) 的学生的学号,和在student表中与该学号相同学号的 学生姓名就行了
  149. SELECT
  150. a.sno AS 学号,
  151. student.sname AS 姓名
  152. FROM
  153. (
  154. SELECT
  155. sno,
  156. COUNT(cno) count
  157. FROM
  158. sc
  159. GROUP BY
  160. sno
  161. ) a,
  162. student
  163. WHERE
  164. a.count = (SELECT COUNT(cno) FROM course)
  165. AND a.sno = student.sno;
  166.  
  167. -- 查询至少选修了学生"20132001"选修的全部课程的学生的学号和姓名
  168. SELECT DISTINCT
  169. scx.sno AS 学号,
  170. sname AS 姓名
  171. FROM
  172. sc scx,
  173. student
  174. WHERE
  175. NOT EXISTS (
  176. SELECT
  177. *
  178. FROM
  179. sc scy
  180. WHERE
  181. scy.sno = ''
  182. AND NOT EXISTS (
  183. SELECT
  184. *
  185. FROM
  186. sc scz
  187. WHERE
  188. scz.sno = scx.sno
  189. AND scz.cno = scy.cno
  190. )
  191. )
  192. AND scx.sno = student.sno;

视图与索引

  1. -- 创建视图v1,该视图包含计算机系的学生信息
  2. CREATE VIEW v1(学号,姓名,性别,年龄,系别,入学日期) AS SELECT * FROM student WHERE sdept = '计算机';
  3. -- 创建视图v2,该视图包含成绩及格同学的学号、所以选课程课课程号和成绩
  4. CREATE VIEW v2(学号,课程号,成绩) AS SELECT * FROM sc WHERE grade >= 60;
  5. -- 创建视图v3,该视图包含学号、姓名和平均成绩
  6. CREATE VIEW v3(学号,姓名,平均成绩) AS SELECT student.sno,student.sname,AVG(sc.grade) FROM student,sc WHERE student.sno = sc.sno GROUP BY student.sno;
  7. -- 利用v1视图定义一个包含计算机系学生的学号及其所学课程的课程号和成绩的视图
  8. CREATE VIEW v4(学号,课程号,成绩) AS SELECT v1.`学号`,sc.cno,sc.grade FROM v1,sc WHERE sc.sno = v1.`学号`;
  9. -- 查询计算机系中年龄大于19岁的学生信息
  10. SELECT * FROM v1 WHERE v1.`年龄` > 19;
  11. -- 查询平均成绩在85分以上的学生的学号、姓名和平均成绩
  12. SELECT * FROM v3 WHERE v3.`平均成绩` > 85;
  13. -- 利用v1视图向学生数据表中插入一条记录('20121011','李余力','男',17,'2013/9/11')
  14. INSERT INTO v1(学号,姓名,性别,年龄,入学日期) VALUES('','李余力','男',17,'2013/9/11');
  15. -- 对视图v3进行更新操作,将平均成绩提高5分。观察结果,并分析原因
  16. UPDATE v3 SET 平均成绩 = 平均成绩 + 5; -- 报错:[Err] 1288 - The target table v3 of the UPDATE is not updatable
  17. -- 原因:若视图导出时包含有分组和聚合操作,则不允许对这个视图执行更新操作。
  18. -- sc表的snocno列建普通索引
  19. ALTER TABLE sc ADD INDEX index_sno_cno(sno,cno);
  20. -- student表的sno列建聚簇索引
  21.  
  22. -- course表的cname列建唯一索引
  23. CREATE UNIQUE INDEX UK_course_cname ON course(cname);

MSQL基本增删改语句汇总练习的更多相关文章

  1. 第16课-数据库开发及ado.net-数据库SQl,创建数据库和表,增删改语句,约束,top和Distinct,聚合函数介绍

    第16课-数据库开发及ado.net 数据库SQl,创建数据库和表,增删改语句,约束,top和Distinct,聚合函数介绍 SQL语句入门(脚本.命令) SQL全名是结构化查询语言(Structur ...

  2. SQL增删改语句

    一,插入数据 1.使用  insert ...values 语句插入单行或多行元组数据 insert  into 表名 (列名,列名,...,列名) values 值 表名:指被插入数据的表名 列名: ...

  3. SQL 增删改语句

    阅读目录 一:插入数据 二:更新数据 三:删除数据 回到顶部 一:插入数据 把数据插入表中的最简单方法是使用基本的 INSERT 语法.它的要求是需要我们指定表名和插入到新行中的值. 1.1 插入完整 ...

  4. Oracle 操作数据库(增删改语句)

    对数据库的操作除了查询,还包括插入.更新和删除等数据操作.后3种数据操作使用的 SQL 语言也称为数据操纵语言(DML). 一.插入数据(insert 语句) 插入数据就是将数据记录添加到已经存在的数 ...

  5. MySQL 增删改语句

    # DML语言 /* 数据操作语言: 插入:insert 修改:update 删除: delete */ 一.插入语句 insert /* 语法: 方式一: insert into 表名(列名,..) ...

  6. Oracle创建表、删除表、修改表、字段增删改 语句总结

    创建表: create table 表名 ( 字段名1 字段类型 默认值 是否为空 , 字段名2 字段类型 默认值 是否为空, 字段名3 字段类型 默认值 是否为空, ...... ); 创建一个us ...

  7. SQL增删改语句常用

    创建table: create table tab_name( col1 type; 约束:主键-外键-非空-检查-唯一 col2 type; ); 删除表 : drop table tab_name ...

  8. 学习总结 DML数据库增删改语句

    insert into score t values('111','3-105',88)--插入一行数据 insert into score(sno,cno) values('111','3-105' ...

  9. MySql字段增删改语句

    新增表字段:alter table 表名 需要添加的字段信息; ALTER TABLE nation add seq VARCHAR(20) COMMENT '顺序' 字段名的修改:alter tab ...

随机推荐

  1. Using iSCSI On Ubuntu 10.04 (Initiator And Target)

    This guide explains how you can set up an iSCSI target and an iSCSI initiator (client), both running ...

  2. 剑指offer面试题23:从上到下打印二叉树(树的层序遍历)

    题目:从上往下打印出二叉树的每个节点,同一层的结点按照从左往右的顺序打印. 解题思路:二叉树的层序遍历,在打印一个节点的时候,要把他的子节点保存起来打印第一层要把第二层的节点保存起来, 打印第二层要把 ...

  3. 前端框架本质之探究——以Vue.js为例

    问:我们在使用Vue时,实际上干了什么?   答:实际上只干了一件事——new了一个Vue对象.后面的事,都交由这个对象自动去做.就好像按了下开关,机器跑起来了,剩下的事就不用我们再操心了.   各位 ...

  4. SpringMVC 全局异常处理

    在 JavaEE 项目的开发中,不管是对底层的数据库操作过程,还是业务层的处理过程,还是控制层的处理过程,都不可避免会遇到各种可预知的.不可预知的异常需要处理.每个过程都单独处理异常,系统的代码耦合度 ...

  5. Javascript高级编程学习笔记(78)—— 表单(6)HTML约束验证API

    自动切换焦点 使用JS可以极大地提升表单的易用性 其中最常用的一种就是当用户填写完当前字段后焦点自动切换到下一个字段 以下方的HTML代码为例: <input type="text&q ...

  6. 微信小程序的概要

    微信小程序的概要 学习小程序要了解一下什么事小程序,小程序开发前需要做哪些准备,微信小程序开发工具的使用,小程序中的目录结构解析,视图和渲染,事件. 小程序的配置详解,小程序的生命周期与app对象的使 ...

  7. 深度学习环境配置:Ubuntu16.04安装GTX1080Ti+CUDA9.0+cuDNN7.0完整安装教程(多链接多参考文章)

    本来就对Linux不熟悉,经过几天惨痛的教训,参考了不知道多少篇文章,终于把环境装好了,每篇文章或多或少都有一些用,但没有一篇完整的能解决我安装过程碰到的问题,所以决定还是自己写一篇我安装过程的教程, ...

  8. [原创]CobaltStrike & Metasploit Shellcode一键免杀工具

    CobaltStrike & Metasploit  Shellcode一键免杀工具 作者: K8哥哥 图片 1个月前该工具生成的exe免杀所有杀软,现在未测应该还能过90%的杀软吧. 可选. ...

  9. freemarker常见语法大全,灰常有用!

    由于公司前端使用的技术是freemarker,于是没事就在网上看看别人写的关于freemarker的文章,感觉freemarker灰常简单,比jsp好用,jsp太乱太臃肿了,另外推荐大家看看freem ...

  10. input01.sh: line 11: warning: here-document at line 4 delimited by end-of-file (wanted `EOF') input01.sh: line 12: syntax error: unexpected end of file

    写了个脚本用cat>>EOF报错如下: input01.sh: line 11: warning: here-document at line 4 delimited by end-of- ...