删除约束注意:

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

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

 USE work;

 /*创建选修数据表*/
DROP TABLE IF EXISTS sc;
CREATE TABLE sc(
sno CHAR(8) COMMENT '学号',
cno CHAR(3) COMMENT '课程号',
grade     SMALLINT COMMENT '成绩'
); /*创建学生数据表*/
DROP TABLE IF EXISTS student;
CREATE TABLE student(
sno CHAR(8) COMMENT'学号',
sname VARCHAR(20) COMMENT '姓名',
sgender CHAR(2) COMMENT '性别',
sage INT COMMENT '年龄',
sdept VARCHAR(30)    COMMENT '所系',
sedat VARCHAR(30) COMMENT '入学日期'
); /*创建课程数据表*/
DROP TABLE IF EXISTS course;
CREATE TABLE course(
cno CHAR(3) COMMENT '课程号',
cname VARCHAR(30) COMMENT '课程名',
ccredit SMALLINT COMMENT '学分'
); /*插入数据*/
INSERT INTO student(sno,sname,sgender,sage,sdept,sedat)
VALUES
('','王力','男',19,'计算机','2013/9/11'),
('','张红','女',20,'计算机','2013/9/11'),
('','孙国庆','男',18,'信息','2013/9/11');
INSERT INTO course(cno,cname,ccredit)
VALUES
('','数据结构',4),
('','数据库',3),
('','C语言程序设计',6);
INSERT INTO sc(sno,cno,grade)
VALUES
('','',''),
('','',''),
('','',''),
('','',''); /*修改表结构*/
ALTER TABLE student ADD sphone char(11);
ALTER TABLE student MODIFY COLUMN sphone char(20);
ALTER TABLE student DROP COLUMN sphone; /*对数据表添加修改约束*/
-- 添加主键约束
ALTER TABLE student ADD CONSTRAINT pk_student PRIMARY KEY(sno);
ALTER TABLE course ADD CONSTRAINT pk_course PRIMARY KEY(cno);
ALTER TABLE sc ADD CONSTRAINT pk_sc PRIMARY KEY(sno,cno); -- 当主表中的数据删除,从表的对应行也删除
-- 添加外键约束
ALTER TABLE sc ADD CONSTRAINT fk_student_sc FOREIGN KEY(sno) REFERENCES student(sno) ON DELETE CASCADE;
ALTER TABLE sc ADD CONSTRAINT fk_course_sc FOREIGN KEY(cno) REFERENCES course(cno) ON DELETE CASCADE; -- 添加非空约束
ALTER TABLE student MODIFY COLUMN sname VARCHAR(20) NOT NULL;
ALTER TABLE course MODIFY COLUMN cname VARCHAR(30) NOT NULL; -- 添加唯一约束
-- ALTER TABLE course ADD UNIQUE(cname);
ALTER TABLE course ADD CONSTRAINT u_cname UNIQUE(cname); -- 添加CHECK约束
ALTER TABLE student ADD CONSTRAINT ck_sgender CHECK(sgender in('男','女'));
ALTER TABLE student ADD CONSTRAINT ck_sage CHECK(sage BETWEEN 15 AND 35); /*删除刚刚添加的约束*/ -- 先删除外键约束才能删除主表的主键约束
ALTER TABLE sc DROP FOREIGN KEY fk_student_sc;
ALTER TABLE sc DROP FOREIGN KEY fk_course_sc; ALTER TABLE student DROP PRIMARY KEY;
ALTER TABLE course DROP PRIMARY KEY;
ALTER TABLE sc DROP PRIMARY KEY; ALTER TABLE student MODIFY COLUMN sname VARCHAR(20) NULL;
ALTER TABLE course MODIFY COLUMN cname VARCHAR(30) NULL; ALTER TABLE course DROP INDEX u_cname;
-- 不能删除,报错ALTER TABLE course DROP INDEX(cname); -- mysql数据库不支持check约束,添加也无效,删除更不支持
/*ALTER TABLE student DROP CHECK ck_sgender;
ALTER TABLE student DROP CHECK ck_sage;*/ SELECT * FROM student;
SELECT * FROM course;
SELECT * FROM sc;

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

USE work;

-- 查询全体学生的详细信息
SELECT * FROM student; -- 检索全体学生的学号、姓名
SELECT sno,sname FROM student; -- 线索已选课程的课程号,要求显示的课程号不重复
SELECT DISTINCT(cno) FROM sc; -- 查询全体学生的姓名及出生日期
-- SELECT YEAR(CURDATE())- sage AS 出生年份 FROM student; -- 查询成绩大于80分的学生的学号、课程号及成绩
SELECT sno,cno,grade FROM sc WHERE grade > 80; -- 查询成绩介于70~80分的学生的学号、课程号及成绩
SELECT sno,cno,grade FROM sc WHERE grade BETWEEN 70 AND 80; -- 查询选修了课程号为"101",且成绩大于80分的学生的学号
SELECT sno FROM sc WHERE cno = 101 AND grade > 80; -- 查询"数据结构" 和 "C语言程序设计"课程的详细信息
SELECT * FROM course WHERE cname = '数据结构' OR cname = 'C语言程序设计'; -- 检索姓王的同学的详细信息(like,模糊查询,'%'代表任意0个或多个字符)
SELECT * FROM student WHERE sname like '王%'; -- 检索名字中第二个字是"力"或"历"的学生的详细信息('_'代表任意单个字符)
SELECT * FROM student WHERE sname like '_力%' OR '_历%'; -- 查询全体学生的姓名及其年龄,并按学生的年龄降序排列(升序ASC,降序DESC)
SELECT sname,sage FROM student ORDER BY sage DESC; -- 查询学生总人数
SELECT COUNT(sno) FROM student; -- 计算选修'101'号课程的学生的平均成绩、最高分和最低分
SELECT MAX(grade) AS 最高分,MIN(grade) AS 最低分,AVG(grade) AS 平均成绩 FROM sc WHERE cno = ''; -- 汇总总分大于200分的学生的学号及总成绩
SELECT sno AS 学号,SUM(grade) AS 总成绩 FROM sc GROUP BY sno HAVING SUM(grade) > 200; -- 统计各个课程的选课人数
SELECT cno AS 课程号,COUNT(*) AS 选课人数 FROM sc GROUP BY cno; -- 检索多于2名学生选修的并以1结尾的课程号和平均成绩
-- 数据量不够,我自己改成了至少1人选修的以1开头的课程号和平均成绩,
SELECT cno AS 课程号, AVG(grade) AS 平均成绩 FROM sc WHERE cno like '1%' GROUP BY cno HAVING COUNT(cno) > 0;

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

-- 检索所有学生的选课信息,包括学号、姓名、课程号、课程名和成绩
SELECT
s.sno AS 学号 ,
s.sname AS 姓名,
c.cno AS 课程号,
c.cname AS 课程名,
sc.grade AS 成绩
FROM
Student s,
Course c,
SC
WHERE
s.sno = sc.sno
AND c.cno = sc.cno; -- 查询选修了"C语言程序设计"的学生学号和姓名。
SELECT
s.sno AS 学号,
s.sname AS 姓名
FROM
Student s,
Course c,
SC
WHERE
s.sno = sc.sno
AND c.cno = sc.cno
AND c.cname = 'C语言程序设计'; -- 查询与"张红"在同一个系的学生学号、姓名和所属系。
SELECT
sno AS 学号,
sname AS 姓名,
sdept AS 系
FROM
student
WHERE
sdept = (
SELECT
sdept
FROM
student
WHERE
sname = '张红'
);
-- 查询其它系中比信息系的所有学生年龄都大的学生的学号、姓名和年龄
SELECT
sno AS 学号,
sname AS 姓名,
sage AS 年龄
FROM
student
WHERE
sage > (
SELECT
max(sage)
FROM
student
WHERE
sdept = '信息'
)
AND sdept <> '信息'; -- 查询比"王力"年纪大的男学生信息
SELECT
*
FROM
student
WHERE
sage > (
SELECT
sage
FROM
student
WHERE
sname = '王力'
)
AND sgender = '男'; -- 查询每个学生选修课程的学号和课程号和成绩,要求该选修课程的成绩超过他选修课程的平均成绩
SELECT
sc.sno AS 学号,
sc.cno AS 课程号,
sc.grade AS 成绩
FROM
(
SELECT
AVG(grade) avg,
sno
FROM
SC
GROUP BY
sno
) av,
sc
WHERE
av.sno = sc.sno
AND grade >= av.avg; -- 检索最高分与最低分之差大于10分的学生的学号、最高分和最低分
SELECT DISTINCT
sc.sno AS 学号,
m.max AS 最高分,
m.min AS 最低分
FROM
(
SELECT
MIN(grade) min,
MAX(grade) max,
sno
FROM
SC
GROUP BY
sno
) m,
sc
WHERE
sc.sno = m.sno
AND (m.max - m.min) > 10; -- 检索选修2门以上课程的学生的学号和总成绩(不统计不及格的课程),并要求按总成绩的降序排列出来.
SELECT
sc.sno AS 学号,
SUM(grade) AS 总成绩
FROM
(
SELECT
sno,
count(cno) c
FROM
sc
GROUP BY
sno
HAVING
COUNT(*) > 2
) cn,
sc
WHERE
cn.sno = sc.sno
AND grade >= 60
GROUP BY
sc.sno
ORDER BY
总成绩 DESC; -- 查询选修了全部课程的学生学号和姓名
-- 第一步:查询出成绩表中的学号和对应选课数量 SELECT sno,COUNT(cno) FROM sc GROUP BY sno;
-- 第二步:查询出课程表中所有课程的数量 SELECT count(cno) FROM course;
-- 查询到 选课数量 和 所有课程的数量 相等(代表选修了全部课程) 的学生的学号,和在student表中与该学号相同学号的 学生姓名就行了
SELECT
a.sno AS 学号,
student.sname AS 姓名
FROM
(
SELECT
sno,
COUNT(cno) count
FROM
sc
GROUP BY
sno
) a,
student
WHERE
a.count = (SELECT COUNT(cno) FROM course)
AND a.sno = student.sno; -- 查询至少选修了学生"20132001"选修的全部课程的学生的学号和姓名
SELECT DISTINCT
scx.sno AS 学号,
sname AS 姓名
FROM
sc scx,
student
WHERE
NOT EXISTS (
SELECT
*
FROM
sc scy
WHERE
scy.sno = ''
AND NOT EXISTS (
SELECT
*
FROM
sc scz
WHERE
scz.sno = scx.sno
AND scz.cno = scy.cno
)
)
AND scx.sno = student.sno;

视图与索引

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

    可以打包的pom.xml: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http:/ ...

  2. jenkins:一个jenkins项目远程触发另一个jenkins项目构建配置

    很多时候,我们会有这样的应用场景:一个jenkins上的项目构建后,需要远程触发另一台机子上的jenkins中某个项目的构建,可以通过Parameterized Remote Trigger Conf ...

  3. JavaScript原生实现观察者模式

    观察者模式又叫做发布订阅模式,它定义了一种一对多的关系,让多个观察者对象同时监听某一个主题对象,这个主题对象的状态发生改变时就会通知所有观察着对象. 它是由两类对象组成,主题和观察者,主题负责发布事件 ...

  4. Javascript高级编程学习笔记(75)—— 表单(3)表单字段

    表单字段 表单作为web应用中不可或缺的一部分,当然也是可以使用原生的 DOM 元素来访问的 除了标准的访问方式之外,每个表单都拥有一个 elements 属性,该属性保存着该表单所有 表单元素 的集 ...

  5. 迷宫-BFS

    迷宫问题 Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit Status Descript ...

  6. C++ Opencv 傅里叶变换的代码实现及关键函数详解

    一.前言 最近几天接触了图像的傅里叶变换,数学原理依旧不是很懂,因此不敢在这里妄言.下午用Opencv代码实现了这一变换,有一些经验心得,愿与大家分享. 二.关键函数解析 2.1copyMakeBor ...

  7. 怎么随时获取Spring的上下文ApplicaitonContext,和Spring管理的Bean

    BeanFactory接口 Interface BeanFactory getBean <T> T getBean(String name, Class<T> required ...

  8. Metasploit Framework(2)Exploit模块、Payload使用

    文章的格式也许不是很好看,也没有什么合理的顺序 完全是想到什么写一些什么,但各个方面都涵盖到了 能耐下心看的朋友欢迎一起学习,大牛和杠精们请绕道 Exploit模块分为主动和被动(Active.Pas ...

  9. java中如何模拟真正的同时并发请求?

    有时需要测试一下某个功能的并发性能,又不要想借助于其他工具,索性就自己的开发语言,来一个并发请求就最方便了. java中模拟并发请求,自然是很方便的,只要多开几个线程,发起请求就好了.但是,这种请求, ...

  10. Mac OS Eclipse 调试快捷键不好使(失效)的情况

    Eclipse调试使用的F5  F6  F8一直都好用,结果一次调试后忽然不好使. 问题原因,尚未知晓. 解决办法,重启机器.