From a47d5aa79b944af601045cf3e8f022c0619845f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E4=BD=B3=E6=80=A1?= <3197656261@qq.com> Date: Sun, 12 Mar 2023 15:34:58 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=A7=E4=BD=9C=E4=B8=9A=E5=92=8C=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...63\350\201\224\346\237\245\350\257\242.md" | 67 ++++++- ...08\345\244\247\344\275\234\344\270\232.md" | 187 ++++++++++++++++++ .../2023.03.10\344\275\234\344\270\2321.md" | 90 +++++++++ 3 files changed, 342 insertions(+), 2 deletions(-) create mode 100644 "49.\346\235\216\344\275\263\346\200\241/2023.03.08\345\244\247\344\275\234\344\270\232.md" create mode 100644 "49.\346\235\216\344\275\263\346\200\241/2023.03.10\344\275\234\344\270\2321.md" diff --git "a/49.\346\235\216\344\275\263\346\200\241/2023.02.28 \345\205\263\350\201\224\346\237\245\350\257\242.md" "b/49.\346\235\216\344\275\263\346\200\241/2023.02.28 \345\205\263\350\201\224\346\237\245\350\257\242.md" index 471064a..38b2d62 100644 --- "a/49.\346\235\216\344\275\263\346\200\241/2023.02.28 \345\205\263\350\201\224\346\237\245\350\257\242.md" +++ "b/49.\346\235\216\344\275\263\346\200\241/2023.02.28 \345\205\263\350\201\224\346\237\245\350\257\242.md" @@ -2,6 +2,69 @@ +```sql +多表查询就是同时查询两个或两个以上的表,因为有的时候用户在查看数据的时候,需要显示的数据来自多张表。外键约束对多表查询并无影响。 + +分类 +交叉连接查询 (产生笛卡尔积,了解) +语法:select * from A,B; +内连接查询(使用的关键字inner join --inner可以省略) +隐式内连接 : select * from A,B where 条件; + +显式内连接 : select * from A inner join B on 条件; +外连接查询 (使用的关键字 outer join --outer 可以省略) +左外连接 :left outer join + + select * from A left outer join B on 条件; + +右外连接 :right outer join + + select * from A right outer join B on 条件; + +满外连接 :full outer join + + select * from A full outer join B on 条件; +子查询 +select 的嵌套 + +表自关联: +将一张表当成多张表来用 + +函数 +分组函数 +AVG(x) :求平均值 +SUM(x):求总和 +MAX(x):求最大值 +MIN(x):求最小值 +COUNT(x):统计记录数 +日期时间函数 +CURDATE() 当前日期 +CURTIME() 当前时间 +NOW() 当前日期+时间 +year() 取年 +month() 取月 +day() 取天 +DATEDIFF(date1,date2)/TIMEDIFF(time1,time2) 返回两个时间的间隔 + +###### 条件判断 +(1)IF(value,t,f):如果value是true,那么整个表达式的结果是t,否则就是f +(2)IFNULL(value1,value2) +(3) +CASE WHEN 条件1 THEN result1 + WHEN 条件2 THEN result2 … + ELSE resultn +END 相当于JAVA中if..else if... + +(4) +CASE expr +WHEN 常量值1 THEN 值1 +WHEN 常量值2 THEN 值2 … +ELSE 值n +END +``` + + + # 作业 1. 设有一数据库,包括四个表:学生表(Student)、课程表(Course)、成绩表(Score)以及教师信息表(Teacher)。四个表的结构分别如表1-1的表(一)~表(四)所示,数据如表1-2的表(一)~表(四)所示。用SQL语句创建四个表并完成相关题目。 @@ -88,13 +151,13 @@ create table Teacher( -- 1,查询所有学生,都学了哪些课程,要显示学生信息和课程信息/ ```sql - # 不会写 +select a.*,b.son,b.con,c.* from student a inner join score b on student.son=score.son inner course c on score.con=course.con ; ``` -- 2,查询没有学生的教师的所有信息 ```sql -#不会写 + ``` - 表(一)Student diff --git "a/49.\346\235\216\344\275\263\346\200\241/2023.03.08\345\244\247\344\275\234\344\270\232.md" "b/49.\346\235\216\344\275\263\346\200\241/2023.03.08\345\244\247\344\275\234\344\270\232.md" new file mode 100644 index 0000000..fddaeee --- /dev/null +++ "b/49.\346\235\216\344\275\263\346\200\241/2023.03.08\345\244\247\344\275\234\344\270\232.md" @@ -0,0 +1,187 @@ +```mysql +# # MySQL基础结课考试 +# +# ## 考试时间 120 分钟 总分:100分 +# +# **场景**: +# +# 你在一个软件公司上班,今天公司接一个新业务。要用MySQL给一个小说网站设计一个数据库。 +# +# **数据库名**:xiaoshuo +# +# 该数据库里有四张表:作家信息表 ( author )、作家等级信息表 ( vip )、小说作品信息表 ( story )、小说作品类型表 ( type ) +# +# ### 1、相关表结构 +# +# 1. 作家信息表 ( author ) (4分) +# +# | 字段名称 | 数据类型 | 说明及要求 | +# | ----------- | ----------- | --------------------------------- | +# | author_id | int | 作家编号,主键 | +# | author_name | varchar(20) | 作家姓名、非空、不能重复 | +# | credits | int | 积分 | +# | vip_id | varchar(20) | 等级编号,非空、外键关联等级信息表 | +# +# 2. 作家等级信息表 ( vip ) (3分) +# +# | 字段名称 | 数据类型 | 说明及要求 | +# | -------- | ----------- | ------------------------ | +# | vip_id | varchar(20) | 等级编号,主键 | +# | vip_name | varchar(20) | 等级名称,非空,不能重复 | +# +# +# 3. 小说作品信息表 ( story )(4分) +# +# | 字段名称 | 数据类型 | 说明及要求 | +# | ------------ | ----------- | ----------------------------- | +# | story_id | int | 作品编号,主键,自增 | +# | author_id | int | 作家编号,外键,关联作家信息表 | +# | type_id | varchar(20) | 类型编号,外键,关键作品类型表 | +# | story_name | varchar(50) | 作品名称 | +# | views_number | int | 浏览量 | +# +# 4. 小说作品类型表 ( type )(2分) +# +# +# | 字段名称 | 数据类型 | 说明及要求 | +# | --------- | ----------- | ------------------------ | +# | type_id | varchar(20) | 类型编号,主键 | +# | type_name | varchar(20) | 类型名称,非空,不能重复 | +# +# ### 2、对应的表数据 +# +# 1. 作家信息表 (4分) +# +# +# | 作家编号 | 作家名称 | 积分 | 等级编号 | +# | :------: | :------: | :--: | :------: | +# | 1001 | 朱逸群 | 600 | VIP01 | +# | 1002 | 范建 | 8510 | VIP04 | +# | 1003 | 史珍香 | 981 | VIP02 | +# | 1004 | 范统 | 2364 | VIP02 | +# | 1005 | 杜子腾 | 257 | VIP01 | +# | 1006 | 刘产 | 678 | VIP02 | +# | 1007 | 杜琦燕 | 438 | VIP03 | +# +# 2. 等级信息表(2分) +# +# | 等级编号 | 等级名称 | +# | :------: | :------: | +# | VIP01 | 青铜作家 | +# | VIP02 | 白银作家 | +# | VIP03 | 黄金作家 | +# | VIP04 | 钻石作家 | +# +# 3. 小说作品信息表(5分) +# +# | 作品编号 | 作家编号 | 类型编号 | 作品名称 | 订阅数 | +# | :------: | :------: | :------: | :----------------------: | :----: | +# | 1 | 1002 | L03 | 母猪产后与护理师的二三事 | 6541 | +# | 2 | 1005 | L04 | 拖拉机大战蜘蛛侠 | 563 | +# | 3 | 1003 | L01 | 这只小龙虾不正经 | 8754 | +# | 4 | 1006 | L04 | 一个爹爹三个娃 | 36354 | +# | 5 | 1006 | L01 | 皇上滚开本宫只劫财 | 3674 | +# | 6 | 1005 | L05 | 给长城贴瓷砖的小太监 | 6541 | +# | 7 | 1003 | L03 | 不科学御兽 | 1257 | +# | 8 | 1005 | L01 | 镜面管理局 | 3216 | +# | 9 | 1004 | L02 | 关于我成为灭魂师之后 | 1147 | +# | 10 | 1004 | L05 | 公子别秀 | 2078 | +# +# 4. 作品类型(3分) +# +# | 类型编号 | 类型名称 | +# | :------: | :------: | +# | L01 | 玄幻 | +# | L02 | 奇幻 | +# | L03 | 武侠 | +# | L04 | 仙侠 | +# | L05 | 都市 | + + +create database xiaoshuo charset utf8; +use xiaoshuo; +create table vip( + vip_id varchar(20) primary key comment'等级编号', + vip_name varchar(20) not null unique comment'等级名称' + ); +create table type( + type_id varchar(20) primary key comment'类型编号', + type_name varchar(20) not null unique comment'类型名称' + ); +create table author( + author_id int primary key comment'作家编号', + author_name varchar(20) not null unique comment'作家姓名', + credits int comment'积分', + vip_id varchar(20) not null comment'等级编号', + foreign key (vip_id) references vip(vip_id) + ); +create table story( + story_id int primary key auto_increment comment'作品编号', + author_id int comment'作家编号', + foreign key (author_id) references author(author_id), + type_id varchar(20) comment'类型编号', + foreign key (type_id) references type(type_id), + story_name varchar(50) comment'作品名称', + views_number int comment'浏览量' + ); +insert into vip values ('VIP01','青铜玩家'),('VIP02','白影玩家'), + ('VIP03','黄金玩家'),('VIP04','钻石玩家'); +insert into type values ('L01','玄幻'),('L02','奇幻'), + ('L03','武侠'),('L04','仙侠'), + ('L05','都市'); +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 story values (1,1002,'L03','母猪产后与护理师的二三事',6541),(2,1005,'L04','拖拉机大战蜘蛛侠',563), + (3,1003,'L01','这只小龙虾不正经',8754),(4,1006,'L04','一个爹爹三个娃 ',36354), + (5,1006,'L01','皇上滚开本宫只劫财',3674),(6,1005,'L05','给长城贴瓷砖的小太监',6541), + (7,1003,'L03','不科学御兽',1257),(8,1005,'L01','镜面管理局',3216), + (9,1004,'L02','关于我成为灭魂师之后',1147),(10,1004,'L05','公子别秀 ',2078); + + +# ### 3、题目 +# +# > 所有题目要求使用SQL语句完成 +# +# 1. 根据前面提供的表结构和表数据,创建数据库并分别创建这张四张表;并插入相关数据。(提醒:外键请注意建表顺序和插入数据的顺序) (30分) +# +# 2. 将story 表中的story_name字段类型改成varchar(40) 。(2分) +alter table story modify story_name varchar(50); +# 3. 在author表中增加一个性别字段 字段名:author_sex,类型: char(10),要求默认值为'男'。 (3分) +alter table author add author_sex char(10) default'男'; +# 4. 将作家编号为1005、1007的作家性别改为'女' 。(2分) +update author set author_sex='女' where author_id in (1005,1007); +# 5. 作家杜子腾,写了一篇名为《拜登夸我很帅》的都市小说,有854个浏览量,请将这条信息插入到story表。(3分) +insert into story values (11,null,null,'拜登夸我很帅',854); +# 6. 《拖拉机大战蜘蛛侠》这篇小说,浏览量涨了100,请更新story表中的相关数据。(2分) +update story set views_number=views_number+100 where story_name='拖拉机大战蜘蛛侠'; +# 7. 请删除story表的中《皇上滚开本宫只劫财》这篇小说相关数据。(2分) +delete from story where story_name='皇上滚开本宫只劫财'; +# 8. 查询 浏览量大于 8000的小说的作者编号和小说作品名称。(2分) +select story_id,story_name,views_number from story where views_number>8000; +# 9. 查询积分大于1000 并且会员等级高于vip03的作家所有信息。(3分) +select * from author where credits>1000 and vip_id>'vip03'; +# 10. 查询姓名以杜字开头的作家的姓名,积分和等级编号。(3分) +select 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 desc; +# 12. 查询出小说的总浏览量,最高浏览量,最小浏览量,平均浏览量,给字段用上中文别名。(3分) +select sum(views_number),max(views_number),min(views_number),avg(views_number) from story; +# 13. 查询各种等级的作家的平均积分和作家数量,并对查询结果使用中文别名。(3分) +select vip_id,avg(credits) 平均积分,count(vip_id)作家数量 from author group by vip_id; +# 14. 查询小说数量大于等于2的分类编号和小说数量。(4分) +select type_id,count(type_id) from story group by type_id having count(type_id)>=2; +# 15. 查询所有小说中浏览量最少的书的作品编号、作品名称和类型编号、浏览量。(4分) +select story_id ,story_name,type_id, views_number from story WHERE views_number=(select min(views_number) from story); +# 16. 查询积分比刘产高的作者所有信息。(5分) +select * from author where credits>(select credits from author where author_name='刘产'); +# 17. 查询出哪些白银作家是没有写小说的,显示这些作家的姓名、等级名称。(8分) +select author_name,author.vip_id from author inner join vip on author.vip_id = vip.vip_id + inner join story on author.author_id = story.author_id where vip.vip_id='VIP02' and story_name is null; +# 18. 找出写过作品浏览量大于5000的作家的所有作品中浏览量不到1000的作品信息(8分) +select * from story where views_number in(select views_number from story where author_id in(select author_id from story where views_number>5000)) having views_number<1000; +# 19. 查询所有小说的小说编号、小说名称、浏览量、分类名称、作者姓名、作者积分、作者等级名称,结果字段要用中文别名,并按浏览量降序排列,如果浏览量一样的,再按积分降序排列。(10分) +select story_id 小说编号,story_name 小说名称, views_number 浏览量, type.type_id 分类名称, author_name 作者名字, credits 作者积分, vip_name 作者等级名称 +from author,type,story,vip where author.author_id=story.author_id and vip.vip_id=author.vip_id and type.type_id=story.type_id order by views_number desc ,credits desc ; +``` \ No newline at end of file diff --git "a/49.\346\235\216\344\275\263\346\200\241/2023.03.10\344\275\234\344\270\2321.md" "b/49.\346\235\216\344\275\263\346\200\241/2023.03.10\344\275\234\344\270\2321.md" new file mode 100644 index 0000000..cae33c7 --- /dev/null +++ "b/49.\346\235\216\344\275\263\346\200\241/2023.03.10\344\275\234\344\270\2321.md" @@ -0,0 +1,90 @@ +```mysql +create database c charset utf8; +use c ; +create table stuinfo( + stuNo varchar(5) primary key, + stuName varchar(4), + stuAge char(2), + stuAddress varchar(4), + stuSeat int, + stuSex int +); +insert into stuinfo values ('s2501','张秋利',20,'美国硅谷',1,1), + ('s2502','李斯文',20,'湖北武汉',2,0), + ('s2503','马文才',18,'湖南长沙',3,1), + ('s2504','欧阳俊雄',21,'湖北武汉',4,0), + ('s2505','梅超风',20,'湖北武汉',5,1), + ('s2506','陈旋风',19,'美国硅谷',6,1), + ('s2507','陈风',20,'美国硅谷',7,0); +create table stuexam( + examNO int, + stuNo varchar(5), + writtenExam int, + labExam int, + foreign key (stuNo) references stuinfo(stuNO) +); +insert into stuexam values (1,'s2501',50,70), + (2,'s2502',60,65), + (3,'s2503',86,85), + (4,'s2504',40,80), + (5,'s2505',70,90), + (6,'s2506',85,90); +# 1.查询学生信息表(stuinfo)中所有列信息,给每列取上中文名称 +select stuNO 学号 ,stuName 姓名,stuAge 年龄,stuAddress 家庭住址,stuSeat 座位号,stuSex 性别 from stuinfo; +# 2.查询学生信息表(stuinfo)中的姓名,年龄和地址三列的信息 +select stuName,stuAge,stuAddress from stuinfo ; +# 3.查询学生分数表(stuexam)中的学号,笔试和机试三列的信息,并为这三列取中文名字 +select stuName 姓名,stuAge 年龄,stuAddress 地址 from stuinfo; + +# 5.查询学生分数表(stuexam)中的学生的学号,笔试,机试以及总分这四列的信息 +select stuNo 学号,writtenExam 笔试,labExam 机试,writtenExam+labExam 总分 from stuexam; + +# 6.查询学生信息表(stuInfo)中学生来自哪几个地方 +select stuAddress from stuinfo group by stuAddress; +# 7.查询学生信息表(stuInfo)中学生有哪几种年龄,并为该列取对应的中文列名 +select stuAge 年龄 from stuinfo group by stuAge; +# 8.查询学生信息表(stuInfo)中前3行记录 + +select * from stuinfo limit 0,3; +# 9.查询学生信息表(stuInfo)中前4个学生的姓名和座位号 +select stuName,stuSeat from stuinfo limit 0,4; +# 11.将地址是湖北武汉,年龄是20的学生的所有信息查询出来 +select * from stuinfo where stuAddress='湖北武汉' and stuAge=20; +# 12.将机试成绩在60-80之间的信息查询出来,并按照机试成绩降序排列 +select * from stuexam where labExam between 60 and 80 order by labExam desc ; +# 13.查询来自湖北武汉或者湖南长沙的学生的所有信息 +select * from stuinfo where stuAddress="湖北武汉" or stuAddress="湖南长沙"; +# 14.查询出笔试成绩不在70-90之间的信息,并按照笔试成绩升序排列 +select * from stuexam where writtenExam not between 70 and 90 order by writtenExam asc; +# 15.查询年龄没有写的学生所有信息 +select * from stuinfo where stuAge is null; +# 16.查询年龄写了的学生所有信息 +select * from stuinfo where stuAge is not null; +# 17.查询姓张的学生信息 +select * from stuinfo where stuName like "张%"; +# 18.查询学生地址中有‘湖’字的信息 +select * from stuinfo where stuAddress like "%湖%"; +# 19.查询姓张但名为一个字的学生信息 +select * from stuinfo where stuName like '张_'; +# 20.查询姓名中第三个字为‘俊’的学生的信息,‘俊’后面有多少个字不限制 +select * from stuinfo where stuName like "__俊%"; +# 21.按学生的年龄降序显示所有学生信息 +select * from stuinfo order by stuAge desc; +# 22.按学生的年龄降序和座位号升序来显示所有学生的信息 +select * from stuinfo order by stuSeat asc ,stuAge desc; +# 23显示笔试第一名的学生的考试号,学号,笔试成绩和机试成绩 +select examNO, stuNo,writtenExam,labExam +from stuexam where writtenExam=(select max(writtenExam)from stuexam); + +# 24.显示机试倒数第一名的学生的考试号,学号,笔试成绩和机试成绩 +select examNO, stuNo,writtenExam,labExam +from stuexam where writtenExam=(select min(writtenExam)from stuexam); +# 25.查询每个地方的学生的平均年龄 +select avg(stuAge),stuAddress from stuinfo group by stuAddress; + +# 26.查询男女生的分别的年龄总和 +select sum(stuAge) from stuinfo group by stuSex; +# 27.查询每个地方的男女生的平均年龄和年龄的总和 +select stuAddress,stuSex,avg(stuAge),sum(stuAge) +from stuinfo group by stuAddress,stuSex; +``` \ No newline at end of file -- Gitee