删除约束注意:

网上说是 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. Openvswitch手册(4): Mirror

    这一节我们来分析Mirror Mirror就是配置一个bridge,将某些包发给指定的mirrored ports 对于包的选择: select_all,所有的包 select_dst_port se ...

  2. linux下tomcat服务器的相关命令

    一:Linux下tomcat服务的启动.关闭与错误跟踪,使用PuTTy远程连接到服务器以后,通常通过以下几种方式启动关闭tomcat服务:切换到tomcat主目录下的bin目录(cd usr/loca ...

  3. Postman+Newman+jenkins实现API自动化测试

    最近自己在学习用postman+newman+jenkins实现API自动化测试,这里做个回顾和记录.(此次是在windows上进行的环境搭建) 一.说明 1.大致思路:利用postman做接口调试所 ...

  4. metools,个人工具站点分享

    需要[加密/解密][编码/解码][生成二维码]的时候不用再进百度点广告~ 也不需要去收藏夹找网址~ 我的目的大概就是如此. 项目地址:https://github.com/yimogit/metool ...

  5. 吴恩达机器学习笔记40-用调和平均数F来进行查准率和查全率之间的权衡(Trading Off Precision and Recall by F sore)

    在很多应用中,我们希望能够保证查准率和查全率的相对平衡. 我们可以将不同阀值情况下,查全率与查准率的关系绘制成图表,曲线的形状根据数据的不同而不同: 我们希望有一个帮助我们选择这个阀值的方法.一种方法 ...

  6. 嘿!我用python帮我干这些事

    python 无疑是当下火上天的语言,但是我们又不拿来工作,那么能拿来干啥呢?我是这么干的. 1. 平时工作开发用不上,就当个计算器吧! python # 加减乘除 >>> (3 + ...

  7. 《Java 多线程编程核心技术》- 笔记

    作为业务开发人员,能够在工作中用到的技术其实不多.虽然平时老是说什么,多线程,并发,注入,攻击!但是在实际工作中,这些东西不见得用得上.因为,我们用的框架已经把这些事做掉了. 比如web开发,外面有大 ...

  8. Oracle sql共享池$sqlarea分析SQL资源使用情况

    遇到需要排查一个系统使用sql的情况,可以通过查询Oracle的$sql.$ssssion.$sqlarea进行统计排查 排查时可以先看一下$sql和$session的基本信息 select * fr ...

  9. 图片格式PGM缩写

    PGM是Portable Gray Map的缩写.它是灰度图像格式中一种最简单的格式标准.另外两种与之相近的图片格式是PBM和PPM.它们分别相应着黑白图像和彩色图像. PGM的数据存放方式相比于JP ...

  10. netty中的传输

    终于在课设的闲时间把netty实战的四五章给解决了 这里来记录一下第四章里面所讲的IO 首先说到IO,我想,必须要先了解阻塞,非阻塞,同步和异步这四个词 看到一个讲的很易懂的例子:https://ww ...