From 05b10bb2abcd33d4823d992a71c1d44406854104 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9E=97=E9=91=AB?= <1057759237@qq.com> Date: Wed, 8 Mar 2023 12:35:00 +0800 Subject: [PATCH 1/2] =?UTF-8?q?02=E6=9E=97=E9=91=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...5\350\257\242\344\275\234\344\270\232 .md" | 118 ++++++++++++++++++ 1 file changed, 118 insertions(+) create mode 100644 "02 \346\236\227\351\221\253/20230306 \345\255\220\346\237\245\350\257\242\344\275\234\344\270\232 .md" diff --git "a/02 \346\236\227\351\221\253/20230306 \345\255\220\346\237\245\350\257\242\344\275\234\344\270\232 .md" "b/02 \346\236\227\351\221\253/20230306 \345\255\220\346\237\245\350\257\242\344\275\234\344\270\232 .md" new file mode 100644 index 0000000..4433219 --- /dev/null +++ "b/02 \346\236\227\351\221\253/20230306 \345\255\220\346\237\245\350\257\242\344\275\234\344\270\232 .md" @@ -0,0 +1,118 @@ +# 1.笔记 + +```sql +子查询类型 +1.where +把内层查询的结果作为外层查询的比较条件 +例子 +SELECT goods_id,goods_name,shop_price + FROM goods + WHERE goods_id = (SELECT MAX(goods_id) FROM goods +); +2.from +把内层的查询结果当成临时表,供外层sql再次查询。查询结果集可以当成表看待 +例子 +SELECT goods_id,goods_name,cat_id,shop_price FROM + +(SELECT goods_id,goods_name,cat_id,shop_price FROM goods ORDER BY cat_id ASC,goods_id DESC) AS tmp + +GROUP BY cat_id; + +3.any , in + ANY关键词必须后面接一个比较操作符。ANY关键词的意思是“对于在子查询返回的列中的任一数值,如果比较结果为TRUE的话,则返回TRUE + 例子 +SELECT cat_id,cat_name +FROM category +WHERE cat_id > ANY (SELECT num FROM nums); + +//in型 +SELECT cat_id,cat_name +FROM category +WHERE cat_id IN (SELECT num FROM nums); + +4.from 前子查询 +SELECT c.cat_id,c.cat_name, +(SELECT cat_name FROM goods g WHERE g.cat_id = c.cat_id) cat_name +FROM category c + +5.exists +把外层sql的结果,拿到内层sql去测试,如果内层的sql成立,则该行取出。内层查询是exists后的查xu +SELECT c.cat_id,c.cat_name +FROM category c +WHERE EXISTS (SELECT 1 FROM goods g WHERE g.cat_id = c.cat_id +); + +二. +1、in 的效果 跟 =any是一样的 +2、not in 和 <> any 的效果是一样的 +``` + +# 2.作业 + +```sql +CREATE database class1 charset utf8; +use class1; +CREATE TABLE stuinfo( +stuno VARCHAR(20), +stuname VARCHAR(20), +stusex VARCHAR(1), +stuage int, +stuaddress varchar(20), +stuseat int +); +SELECT * FROM stuinfo; +CREATE TABLE stuexam( +examno int, +stuno varchar(20), +writtenexam int, +labexam INT +); +SELECT * FROM stuexam + +CREATE TABLE stumarks( +examno int, +stuid varchar(20), +score int ); +SELECT * FROM stumarks + +INSERT into stuinfo VALUES('s2501','张秋利','男',20,'美国硅谷',1),('s2502','李斯文','女',18,'湖北武汉',2),('s2503','马文才','男',18,'湖南长沙',3),('s2504','欧阳俊雄','女',21,'湖北武汉',4),('s2505','梅超风','男',20,'湖北武汉',5),('s2506','陈旋风','男',19,'美国硅谷',6); + +INSERT into stuexam VALUES(1,'s2501',50,70),(2,'s2502',60,65),(3,'s2503',86,70),(4,'s2504',40,80),(5,'s2505',70,85),(6,'s2506',85,90) + +INSERT INTO stumarks VALUES(1,'s2501',88),(2,'s2501',92),(3,'s2501',53),(4,'s2502',60),(5,'s2502',99),(6,'s2503',82) + + +-- 1.查询出年龄比班上平均年龄大的学生的信息 +SELECT avg(stuage) FROM stuinfo +SELECT * FROM stuinfo WHERE stuage>(SELECT avg(stuage) FROM stuinfo) +-- 2.查询出每个学生的学号,姓名,性别和选修课程的最高分(stuMarks) +SELECT stuseat,stuname,stusex,max(stumarks.score) FROM stuinfo INNER join stuexam on stuinfo.stuno = stuexam.stuno INNER JOIN stumarks on stuexam.stuno = stumarks.stuid GROUP BY stuid +-- 3.查询出每个学生的学号,姓名,性别和考试平均分(stuExam) + +-- 4.查询性别是男并且年龄大于等于20的学生的信息(用两种方法实现:普通查询和子查询) +SELECT * FROM stuinfo WHERE stusex='男' and stuage>=20 +-- 5.查询出年龄比所有男生年龄都大的女生的信息 +select * from stuinfo where stuAge >any(select stuAge from stuinfo where stuSex='男') and stuSex='女'; +-- 6.查询出所有选修课程都及格的学生的信息 (stuMarks) +SELECT * FROM stuinfo INNER JOIN stumarks on stuinfo.stuno=stumarks.stuid WHERE score>=60 GROUP BY score +-- 7.查询出参加考试的学生的信息(用表连接,in二种方法做)(stuMarks) +SELECT a.* FROM stuinfo a right join stumarks on a.stuno=stumarks.stuid GROUP BY stuno +-- 8.查询出没有参加考试的学生的信息(用表连接,in二种方法做)(stuMarks) +select a.*,score from stuinfo a left join stumarks b on a.stuNO=b.stuID where score is null group by stuNO; +-- 9.将有一门成绩成绩大于90分的学生的基本信息查询出来(stuMarks) +select a.*,score from stuinfo a right join stumarks b on a.stuNO=b.stuID +where score>90; +-- 10.查询出平均成绩在80分以上的学生的基本信息(stuMarks) +select * from stuinfo where stuNO=any +(select stuID from stumarks group by stuID having avg(score)>80) + +-- 11.查询出某同学所有考试成绩比“张秋利”同学所有分数都高的学生基本信息(stuMarks) + +-- 12.查询出某同学所有考试成绩只需要比“张秋利”同学某个分数高的学生基本信息(stuMarks) + +-- 13.查询班上比所有男生年龄都要大的女生的信息 +select * from stuinfo where stuAge >any(select stuAge from stuinfo where stuSex='男')and stuSex='女'; + +-- 14.查询出只是比某个男生年龄大的女生的信息 +select * from stuinfo where stuAge >any(select min(stuAge) from stuinfo where stuSex='男')and stuSex='女'; +``` -- Gitee From 644377dd7d909484f9be1748bf5a5affdeae200a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9E=97=E9=91=AB?= <1057759237@qq.com> Date: Thu, 9 Mar 2023 07:23:01 +0800 Subject: [PATCH 2/2] =?UTF-8?q?02=E6=9E=97=E9=91=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...8 \345\244\247\344\275\234\344\270\232.md" | 104 ++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 "02 \346\236\227\351\221\253/20230308 \345\244\247\344\275\234\344\270\232.md" diff --git "a/02 \346\236\227\351\221\253/20230308 \345\244\247\344\275\234\344\270\232.md" "b/02 \346\236\227\351\221\253/20230308 \345\244\247\344\275\234\344\270\232.md" new file mode 100644 index 0000000..7c43f2c --- /dev/null +++ "b/02 \346\236\227\351\221\253/20230308 \345\244\247\344\275\234\344\270\232.md" @@ -0,0 +1,104 @@ +# 作业 + +```sql +CREATE database xiaoshuo charset utf8; +use xiaoshuo + +CREATE TABLE author( +author_id int PRIMARY KEY, +author_name varchar(20) NOT null, +credits int, +vip_id varchar(20) NOT null, +FOREIGN KEY(vip_id) REFERENCES vip(vip_id) ); +desc author +SELECT * FROM author + + +CREATE TABLE vip( +vip_id varchar(20) PRIMARY key, +vip_name varchar(20) not null ); + +CREATE TABLE type( +type_id varchar(20) PRIMARY key, +type_name varchar(20) not null ); + + +CREATE TABLE story( +story_id int PRIMARY KEY auto_increment, +author_id int, +type_id varchar(20), +story_name varchar(50), +views_number int, +FOREIGN KEY(author_id) REFERENCES author(author_id), +FOREIGN key(type_id) REFERENCES type(type_id) ); + + +INSERT into vip VALUES('vip01','青铜段位'),('vip02','白银段位'),('vip03','黄金段位'),('vip04','钻石段位') + +INSERT into author VALUES(1001,'朱逸群',600,'vip01'),(1002,'范建',8510,'vip04'),(1003,'史珍香',981,'vip02'),(1004,'范统',2364,'vip02'),(1005,'杜子藤',257,'vip01'),(1006,'刘产',678,'vip02'),(1007,'杜琦燕',438,'vip03') + +INSERT into type VALUES('lo1','玄幻'),('lo2','奇幻'),('lo3','武侠'),('lo4','仙侠'),('lo5','都市') + + +INSERT into story VALUES(1,1002,'lo3','母猪产后与护理师的二三事',6541),(2,1005,'lo4','拖拉机大战蜘蛛侠',563),(3,1003,'lo1','这只小龙虾不正经',8754),(4,1006,'lo4','一个爹爹三个娃',36354),(5,1006,'lo1','皇上滚开本宫只劫财',3674),(6,1005,'lo5','给长城贴瓷砖的小太监',6541),(7,1003,'lo3','不科学御兽',1257),(8,1005,'lo1','镜面管理局',3216),(9,1004,'lo2','关于我成为灭魂师之后',1147),(10,1004,'lo5','公子别秀',2078) + + + +-- 1. 根据前面提供的表结构和表数据,创建数据库并分别创建这张四张表;并插入相关数据。(提醒:外键请注意建表顺序和插入数据的顺序) (30分) + +-- 2. 将story 表中的story_name字段类型改成varchar(40) 。(2分) +ALTER TABLE story MODIFY column story_name varchar(40) +desc story +-- 3. 在author表中增加一个性别字段 字段名:author_sex,类型: char(10),要求默认值为'男'。 (3分) +ALTER TABLE author ADD COLUMN author_sex char(10) DEFAULT '男' +SELECT * FROM author +-- 4. 将作家编号为1005、1007的作家性别改为'女' 。(2分) +UPDATE author set author_sex='女' WHERE author_id=1005 +UPDATE author set author_sex='女' WHERE author_id=1007 + +-- 5. 作家杜子腾,写了一篇名为《拜登夸我很帅》的都市小说,有854个浏览量,请将这条信息插入到story表。(3分) +INSERT into story VALUES(11,1005,'lo5','拜登夸我很帅',854) +SELECT * FROM story + +-- 6. 《拖拉机大战蜘蛛侠》这篇小说,浏览量涨了100,请更新story表中的相关数据。(2分) +UPDATE story set views_number = views_number+100 WHERE story_name='拖拉机大战蜘蛛侠' +-- 7. 请删除story表的中《皇上滚开本宫只劫财》这篇小说相关数据。(2分) +desc story +DELETE FROM story WHERE story_name='皇上滚开本宫只劫财' +-- 8. 查询 浏览量大于 8000的小说的作者编号和小说作品名称。(2分) +SELECT author_id,story_name FROM story WHERE views_number>8000 +-- 9. 查询积分大于1000 并且会员等级高于vip03的作家所有信息。(3分) +SELECT * FROM author WHERE vip_id>'vip03' and credits>1000 +-- 10. 查询姓名以杜字开头的作家的姓名,积分和等级编号。(3分) +SELECT author.author_name,credits,vip_id FROM author WHERE author_name LIKE '杜%' +-- 11. 查询积分在100、1000之间的作家信息,以积分降序排列。 (3分) +SELECT * FROM author WHERE credits BETWEEN 100 and 1000 ORDER BY credits +-- 12. 查询出小说的总浏览量,最高浏览量,最小浏览量,平均浏览量,给字段用上中文别名。(3分) +SELECT sum(views_number) '总浏览量',max(views_number) '最高浏览量',min(views_number) '最小浏览量',avg(views_number) '平均浏览量' FROM story +-- 13. 查询各种等级的作家的平均积分和作家数量,并对查询结果使用中文别名。(3分) +select avg(credits) 平均积分,count(author_name) 作家数量 +from author +group by vip_id +-- 14. 查询小说数量大于等于2的分类编号和小说数量。(4分) +select type_id 分类编号,count(story_name) 小说数量 from story group by type_id +having count(story_name)>=2; +-- 15. 查询所有小说中浏览量最少的书的作品编号、作品名称和类型编号、浏览量。(4分) +select story_id 作品编号,story_name 作品名称,type_id 类型编号,views_number 浏览量 from story +having min(views_number); + +-- 16. 查询积分比刘产高的作者所有信息。(5分) +select * from author +where credits>(select credits from author where author_name='刘产'); + +-- 17. 查询出哪些白银作家是没有写小说的,显示这些作家的姓名、等级名称。(8分) +-- 18. 找出写过作品浏览量大于5000的作家的所有作品中浏览量不到1000的作品信息(8分) +select * from story a right join +(select * from author a where author_id=any +(select author_id from story +where views_number>5000) +) b +on a.author_id=b.author_id +where views_number<1000 + +-- 19. 查询所有小说的小说编号、小说名称、浏览量、分类名称、作者姓名、作者积分、作者等级名称,结果字段要用中文别名,并按浏览量降序排列,如果浏览量一样的,再按积分降序排列。(10分) +``` -- Gitee