diff --git "a/03 \346\236\227\345\261\225/20230307 \345\255\220\346\237\245\350\257\242\347\273\203\344\271\240.md" "b/03 \346\236\227\345\261\225/20230307 \345\255\220\346\237\245\350\257\242\347\273\203\344\271\240.md" index 209ee4350e385285c73bcf43827fbb90e7051449..73cc9cc6bf731cdd9956ad06046f635640bb5ece 100644 --- "a/03 \346\236\227\345\261\225/20230307 \345\255\220\346\237\245\350\257\242\347\273\203\344\271\240.md" +++ "b/03 \346\236\227\345\261\225/20230307 \345\255\220\346\237\245\350\257\242\347\273\203\344\271\240.md" @@ -1,3 +1,35 @@ + +笔记 +-- 子查询 +用于偏复杂的查询 +格式 +select 字段列表 from 表名 where 条件(select 字段列表 from 表名 where 条件); + +---------------------------------------------------------------------------------- +-- 自查询 +就是自己 join 自己. 而且是 inner join 根据字段的不同获取不同的值. + +举例子: 当两张表一样的时候就是自查询 + +SELECT b.name from shopping as a,shopping as b where + +根据不同的where 字段数据进行筛选. 查询自身 一般用作父类与子类查询,例如查询同一列里面的 +学校-大学-中学-小学 +大学里分林科大,湖大,中南,长理. +这样的一列. 然后进行查询,也就是每个字段都会重复再重复 , 有限制条件时. 就等于是 inner join +而且和 union all 还不一样. union all 是累计去重, 做简单的加法. +运算符号: +和:and && +或:or || +非:not ! +异或:xor (二选一[有我没他,有他没我]) +比大小: < 小于 , <= 小于等于, > 大于, >= 大于等于, <>与 != 不等于, <=> 安全等于,= 等于 +运算符:+ 加,- 减,* 乘,/ 除(全部保留),div 除(只保留整数,四舍五入),%余(显示余数) +是NULL值:IS NULL +在多少与多少之间:BETWEEN 最小值 AND 最大值 +集合匹配:in(.....) (与in后面的集合中所匹配的值,多选一) +去重:select distin 字段名 + ```sql CREATE DATABASE caogao charset utf8; USE caogao; @@ -18,7 +50,7 @@ VALUES ( 's2505', '梅超风', '男', 20, '湖北武汉', 5 ), ( 's2506', '陈旋风', '男', 19, '美国硅谷', 6 );-- 学生必修成绩 CREATE TABLE stuExam ( examNO INT ( 1 ), stuNO CHAR ( 5 ), writtenExam INT ( 3 ), -- -iabExam INT ( 3 ) ); +labExam INT ( 3 ) ); INSERT stuExam VALUES ( 1, 's2501', 50, 70 ), @@ -159,7 +191,7 @@ WHERE ) AND iabExam > ( SELECT - iabExam + labExam FROM stuexam AS a INNER JOIN ( SELECT stuNO FROM stuinfo WHERE stuName = '张秋利' ) AS b ON a.stuNO = b.stuNO diff --git "a/03 \346\236\227\345\261\225/20230308 \350\200\203\350\257\225\346\250\241\346\213\237\351\242\230.md" "b/03 \346\236\227\345\261\225/20230308 \350\200\203\350\257\225\346\250\241\346\213\237\351\242\230.md" new file mode 100644 index 0000000000000000000000000000000000000000..e643124929b9319c556bfe99e6ba6ec8977c5335 --- /dev/null +++ "b/03 \346\236\227\345\261\225/20230308 \350\200\203\350\257\225\346\250\241\346\213\237\351\242\230.md" @@ -0,0 +1,268 @@ +# 考试模拟题 + +```sql +-- **数据库名**:xiaoshuo +CREATE DATABASE xiaoshuo charset utf8; +USE xiaoshuo;-- 该数据库里有四张表:作家信息表 ( author )、作家等级信息表 ( vip )、小说作品信息表 ( story )、小说作品类型表 ( type ) +-- 1、相关表结构 +-- 1. 作家信息表 ( author ) (4分) +-- | 字段名称 | 数据类型 | 说明及要求 | +-- | ----------- | ----------- | --------------------------------- | +-- | author_id | int | 作家编号,主键 | +-- | author_name | varchar(20) | 作家姓名、非空、不能重复 | +-- | credits | int | 积分 | +-- | vip_id | varchar(20) | 等级编号,非空、外键关联等级信息表 | +-- | 作家编号 | 作家名称 | 积分 | 等级编号 | +-- | :------: | :------: | :--: | :------: | +-- | 1001 | 朱逸群 | 600 | VIP01 | +-- | 1002 | 范建 | 8510 | VIP04 | +-- | 1003 | 史珍香 | 981 | VIP02 | +-- | 1004 | 范统 | 2364 | VIP02 | +-- | 1005 | 杜子腾 | 257 | VIP01 | +-- | 1006 | 刘产 | 678 | VIP02 | +-- | 1007 | 杜琦燕 | 438 | VIP03 | +CREATE TABLE author ( + author_id INT PRIMARY KEY, + author_name VARCHAR ( 20 ) NOT NULL UNIQUE KEY, + credits INT, + vip_id VARCHAR ( 20 ) NOT NULL, + FOREIGN KEY ( vip_id ) REFERENCES vip ( vip_id ) +); +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' );-- 2. 作家等级信息表 ( vip ) (3分) +-- +-- | 字段名称 | 数据类型 | 说明及要求 | +-- | -------- | ----------- | ------------------------ | +-- | vip_id | varchar(20) | 等级编号,主键 | +-- | vip_name | varchar(20) | 等级名称,非空,不能重复 | +-- | 等级编号 | 等级名称 | +-- | :------: | :------: | +-- | VIP01 | 青铜作家 | +-- | VIP02 | 白银作家 | +-- | VIP03 | 黄金作家 | +-- | VIP04 | 钻石作家 | +CREATE TABLE vip ( vip_id VARCHAR ( 20 ) PRIMARY KEY, vip_name VARCHAR ( 20 ) NOT NULL UNIQUE KEY ); +INSERT INTO vip +VALUES + ( 'VIP01', '青铜作家' ), + ( 'VIP02', '白银作家' ), + ( 'VIP03', '黄金作家' ), + ( 'VIP04', '钻石作家' );-- +-- 3. 小说作品信息表 ( story )(4分) +-- +-- | 字段名称 | 数据类型 | 说明及要求 | +-- | ------------ | ----------- | ----------------------------- | +-- | story_id | int | 作品编号,主键,自增 | +-- | author_id | int | 作家编号,外键,关联作家信息表 | +-- | type_id | varchar(20) | 类型编号,外键,关键作品类型表 | +-- | story_name | varchar(50) | 作品名称 | +-- | views_number | int | 浏览量 | +-- | 作品编号 | 作家编号 | 类型编号 | 作品名称 | 订阅数 | +-- | :------: | :------: | :------: | :----------------------: | :----: | +-- | 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 | +CREATE TABLE story ( + story_id INT AUTO_INCREMENT PRIMARY KEY, + author_id INT NOT NULL, + type_id VARCHAR ( 20 ) NOT NULL, + story_name VARCHAR ( 50 ), + views_number INT, + FOREIGN KEY ( type_id ) REFERENCES type ( type_id ), + FOREIGN KEY ( author_id ) REFERENCES author ( author_id ) +); +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' ); + -- 4. 小说作品类型表 ( type )(2分) +-- +-- | 字段名称 | 数据类型 | 说明及要求 | +-- | --------- | ----------- | ------------------------ | +-- | type_id | varchar(20) | 类型编号,主键 | +-- | type_name | varchar(20) | 类型名称,非空,不能重复 | +-- | 类型编号 | 类型名称 | +-- | :------: | :------: | +-- | L01 | 玄幻 | +-- | L02 | 奇幻 | +-- | L03 | 武侠 | +-- | L04 | 仙侠 | +-- | L05 | 都市 | +CREATE TABLE type ( type_id VARCHAR ( 20 ) PRIMARY KEY, type_name VARCHAR ( 20 ) ); +INSERT INTO type +VALUES + ( 'L01', ' 玄幻' ), + ( 'L02', ' 奇幻' ), + ( 'L03', ' 武侠' ), + ( 'L04', ' 仙侠' ), + ( 'L05', ' 都市' ); + -- 2. 将 story 表中的 story_name 字段类型改成 varchar(40) 。(2分) +ALTER TABLE story MODIFY story_name VARCHAR ( 40 ); +-- 3. 在 author 表中增加一个性别字段 字段名: author_sex ,类型: char(10),要求默认值为'男'。 (3分) +ALTER TABLE author ADD author_sex CHAR ( 10 ) NOT NULL; +ALTER TABLE author ALTER author_sex +SET DEFAULT ( '男' ); +-- 4. 将作家编号为1005、1007的作家性别改为'女' 。(2分) +UPDATE author +SET author_sex = '女' +WHERE + author_id IN ( 1005, 1007 ); + -- 5.作家杜子腾,写了一篇名为《拜登夸我很帅》的都市小说,有854个浏览量,请将这条信息插入到 story 表。(3分) +INSERT INTO story +VALUES + ( NULL, 1005, 'L05', '拜登夸我很帅', 854 ); + -- 6. 《拖拉机大战蜘蛛侠》这篇小说,浏览量涨了100,请更新story表中的相关数据。(2分) +UPDATE story +SET views_number = 100 + views_number +WHERE + story_name = ' 拖拉机大战蜘蛛侠 '; + -- 7. 请删除 story 表的中《皇上滚开本宫只劫财》这篇小说相关数据。(2分) +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 + credits > 1000 + AND vip_id > 'vip03'; + -- 10. 查询姓名以杜字开头的作家的姓名,积分 和 等级编号。(3分) +SELECT + a.author_name 姓名, + a.credits 积分, + a.vip_id 等级编号 +FROM + author a +WHERE + a.author_name LIKE '杜%'; + -- 11. 查询积分在100、1000之间的作家信息,以积分降序排列。 (3分) +SELECT + * +FROM + author a +WHERE + a.credits BETWEEN 100 + AND 1000 +ORDER BY + a.credits DESC; + -- 12. 查询出小说的 总浏览量,最高浏览量,最小浏览量,平均浏览量,给字段用上中文别名。(3分) +SELECT + SUM( a.views_number ) 总浏览量, + MAX( a.views_number ) 最高浏览量, + MIN( a.views_number ) 最小浏览量, + AVG( a.views_number ) 平均浏览量 +FROM + story a + -- 13. 查询各种等级的作家的 平均积分 和 作家数量 ,并对查询结果使用中文别名。(3分) +SELECT + vip_id, + avg( a.credits ) 平均积分, + count(*) 作家数量 +FROM + AUTHOR a +GROUP BY + a.vip_id; + -- 14. 查询小说数量大于等于2的 分类编号 和 小说数量 。(4分) +SELECT + * +FROM + ( SELECT type_id 分类编号, count(*) 小说数量 FROM story a GROUP BY a.type_id ) a +WHERE + 小说数量 >= 2; +-- 15. 查询所有小说中浏览量最少的书的 作品编号、作品名称 和 类型编号、浏览量。(4分) +SELECT + a.author_id 作品编号, + a.story_name 作品名称, + a.type_id 类型编号, + a.views_number 浏览量 +FROM + story a +WHERE + a.views_number =( + SELECT + MIN( a.views_number ) + FROM + story a + ); +-- 16. 查询积分比 刘产 高的作者所有信息。(5分) +SELECT * FROM author WHERE credits >( SELECT credits FROM author WHERE author_name = ' 刘产' ); +-- 17. 查询出哪些 白银作家 是没有写小说的,显示这些作家的姓名、等级名称。(8分) +SELECT + * +FROM + author a +WHERE + a.author_id NOT IN ( SELECT DISTINCT author_id FROM story ) + AND a.vip_id =( + SELECT + vip_id + FROM + vip + WHERE + vip_name = '白银作家'); +-- 18. 找出写过作品浏览量大于5000的作家的所有作品中浏览量不到1000的作品信息(8分) +SELECT + * +FROM + story a +WHERE + a.author_id = ANY ( SELECT a.author_id FROM story a WHERE a.views_number > 5000 ) + AND a.views_number < 1000; +-- 19.查询所有小说的 小说编号、小说名称、浏览量、分类名称、作者姓名、作者积分、作者等级名称,结果字段要用中文别名,并按浏览量降序排列,如果浏览量一样的,再按积分降序排列。(10分) +SELECT + a.story_id 小说编号, + a.story_name 小说名称, + a.views_number 浏览量, + d.type_name 分类名称, + b.author_name 作者姓名, + b.credits 作者积分, + c.vip_name 作者等级名称 +FROM + story a, + author b, + vip c, + type d +WHERE + a.author_id = b.author_id + AND b.vip_id = c.vip_id + AND a.type_id = d.type_id +ORDER BY + a.views_number DESC, + b.credits DESC; + +``` +