diff --git "a/53 \345\221\250\345\216\232\350\276\260/20230309 \347\254\254\345\205\255\346\254\241\344\275\234\344\270\232.md" "b/53 \345\221\250\345\216\232\350\276\260/20230309 \347\254\254\345\205\255\346\254\241\344\275\234\344\270\232.md" new file mode 100644 index 0000000000000000000000000000000000000000..cf562afe4ad1398d1c0854b4511e04f4fe87d26a --- /dev/null +++ "b/53 \345\221\250\345\216\232\350\276\260/20230309 \347\254\254\345\205\255\346\254\241\344\275\234\344\270\232.md" @@ -0,0 +1,62 @@ +# Create database && tables + +```sql +CREATE DATABASE d1 charset utf8; +USE d1; +CREATE TABLE sta ( itemID INT, orderid INT, itemType VARCHAR ( 10 ), itemName VARCHAR ( 10 ), theNumber INT, theMoney INT ); +INSERT INTO sta +VALUES + ( 1, 1, '文具', '笔', 72, 2 ), + ( 2, 1, '文具', '尺', 10, 1 ), + ( 3, 1, '体育用品', '篮球', 1, 56 ), + ( 4, 2, '文具', '笔', 36, 2 ), + ( 5, 2, '文具', '固体胶', 20, 3 ), + ( 6, 2, '日常用品', '透明胶', 2, 1 ), + ( 7, 2, '体育用品', '羽毛球', 20, 3 ), + ( 8, 3, '文具', '订书机', 20, 3 ), + ( 9, 3, '文具', '订书针', 10, 3 ), + ( 10, 3, '文具', '裁纸刀', 5, 5 ), + ( 11, 4, '文具', '笔', 20, 2 ), + ( 12, 4, '文具', '信纸', 50, 1 ), + ( 13, 4, '日常用品', '毛巾', 4, 5 ), + ( 14, 4, '日常用品', '透明胶', 30, 1 ), + ( 15, 4, '体育用品', '羽毛球', 20, 3 ); +CREATE TABLE TI ( orderID INT, orderData date ); +INSERT INTO ti VALUES ( 1, 20080112 ), +( 2, 20080210 ), +( 3, 20080215 ), +( 4, 20080310 ); +``` + +# Homework + +```mysql +-- 根据图示,完成下列题目: +-- +-- 1.查询所有的订单的订单的编号,订单日期,订购产品的类别和订购的产品名称,订购数量和订购单价 +SELECT ti.orderid,ti.orderData,itemType,itemName,theNumber,theMoney from ti LEFT JOIN sta on sta.orderid=ti.orderID; +-- 2.查询订购数量大于50的订单的编号,订单日期,订购产品的类别和订购的产品名称 +SELECT ti.orderid,ti.orderData,itemType,itemName,theNumber,theMoney from ti LEFT JOIN sta on sta.orderid=ti.orderID WHERE theNumber>50; +-- 3.查询所有的订单的订单的编号,订单日期,订购产品的类别和订购的产品名称,订购数量和订购单价以及订购总价 +SELECT ti.orderid,ti.orderData,itemType,itemName,theNumber,theMoney,theNumber*theMoney 订购总价 from ti LEFT JOIN sta on sta.orderid=ti.orderID; +-- 4.查询单价大于等于5 或者 数量大于等于50的订单的订单的编号,订单日期,订购产品的类别和订购的产品名称,订购数量和订购单价以及订购总价 +SELECT ti.orderid,ti.orderData,itemType,itemName,theNumber,theMoney,theNumber*theMoney 订购总价 from ti LEFT JOIN sta on sta.orderid=ti.orderID where theNumber>=50 || theMoney>=5 ; +-- 5.查询每个订单分别订购了几个产品,例如: +-- 编号 订购产品数 +-- 1 3 +-- 2 4 +SELECT itemID 编号,theNumber 订购产品数 from sta; +-- 6.查询每个订单里的每个类别的产品分别订购了几次和总数量,例如: +-- +-- 订单编号 产品类别 订购次数 总数量 +-- +-- 1 文具 2 82 +-- 1 体育用品 1 1 +-- 2 文具 2 56 +-- 2 体育用品 1 2 +-- 2 日常用品 1 20 + +SELECT orderID 订单编号,itemType 产品类别,COUNT(theNumber) 订购次数,sum(theNumber) 总数量 from sta GROUP BY orderid,itemType; + +``` + diff --git "a/53 \345\221\250\345\216\232\350\276\260/20230310 \347\254\254\344\270\203\346\254\241\344\275\234\344\270\232.md" "b/53 \345\221\250\345\216\232\350\276\260/20230310 \347\254\254\344\270\203\346\254\241\344\275\234\344\270\232.md" new file mode 100644 index 0000000000000000000000000000000000000000..7ad9de0b7a9ad2a98e9f7f0dfc2d29d3a5d25ab7 --- /dev/null +++ "b/53 \345\221\250\345\216\232\350\276\260/20230310 \347\254\254\344\270\203\346\254\241\344\275\234\344\270\232.md" @@ -0,0 +1,137 @@ +```mysql +DROP DATABASE +IF + EXISTS xiaoshuo; +CREATE DATABASE +IF + NOT EXISTS xiaoshuo CHARSET utf8; +USE xiaoshuo; +-- 作家等级信息表 ( vip ) +CREATE TABLE vip ( +vip_id VARCHAR ( 20 ) PRIMARY KEY COMMENT '等级编号,主键', +vip_name VARCHAR ( 20 ) NOT NULL UNIQUE KEY COMMENT '等级名称,非空,不能重复' +); +-- 作家信息表 ( author ) +CREATE TABLE author ( + author_id INT PRIMARY KEY COMMENT '作家编号,主键', + author_name VARCHAR ( 20 ) NOT NULL UNIQUE KEY COMMENT '作家姓名、非空、不能重复', + credits INT COMMENT '积分', + vip_id VARCHAR ( 20 ) NOT NULL COMMENT '等级编号,非空、外键关联等级信息表', + CONSTRAINT fk FOREIGN KEY ( vip_id ) REFERENCES vip ( vip_id ) +); + + +-- 小说作品类型表 ( type ) +CREATE TABLE type ( +type_id VARCHAR ( 20 ) PRIMARY KEY COMMENT '类型编号,主键', +type_name VARCHAR ( 20 ) NOT NULL UNIQUE KEY COMMENT '类型名称,非空,不能重复' +); +-- 小说作品信息表 ( story ) +CREATE TABLE story ( + story_id INT auto_increment PRIMARY KEY COMMENT '作品编号,主键,自增', + author_id INT COMMENT '作家编号,外键,关联作家信息表', + type_id VARCHAR ( 20 ) COMMENT '类型编号,外键,关键作品类型表', + story_name VARCHAR ( 50 ) COMMENT '作品名称', + views_number INT COMMENT '浏览量', + 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, 'VIP02' ), +( 1002, '范建' ,8510, 'VIP04' ), +( 1003, '史珍香', 981, 'VIP02' ), +( 1004, '范统', 2364 ,'VIP02' ), +( 1005, '杜子腾', 257, 'VIP01' ), +( 1006, '刘产' ,678 ,'VIP02' ), +( 1007, '杜琦燕', 438 ,'VIP03' ); + + +INSERT into type VALUES +('L01',' 玄幻'), +('L02',' 奇幻'), +('L03',' 武侠'), +('L04',' 仙侠'), +('L05',' 都市'); + +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 ); + + + +-- 题目 +-- 所有题目要求使用SQL语句完成 +-- 1. 根据前面提供的表结构和表数据,创建数据库并分别创建这张四张表;并插入相关数据。(提醒:外键 +-- 请注意建表顺序和插入数据的顺序) (30分) +-- 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) 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,1005,'L05','拜登夸我很帅',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 author_id,story_name from story where views_number>8000; +-- 9. 查询积分大于1000 并且会员等级高于vip03的作家所有信息。(3分) +SELECT * from author where credits>1000 && vip_id not in ('vip03','vip02','vip01') ; +-- 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 views_number 总浏览量,max(views_number) 最高浏览量 ,min(views_number) 最小浏览量,avg(views_number) 平均浏览量 from story GROUP BY story_id; +-- 13. 查询各种等级的 作家的平均积分 和 作家数量,并对查询结果使用中文别名。(3分) +SELECT DISTINCT vip_id,avg(credits) 平均积分,COUNT(credits) 作家数量 from author GROUP BY vip_id; +-- 14. 查询小说数量大于等于2的分类编号和小说数量。(4分) +SELECT type_id 分类编号,count(type_id) 小说数量 from story GROUP BY type_id HAVING 小说数量>=2; +-- 15. 查询所有小说中浏览量最少的书的作品编号、作品名称和类型编号、浏览量。(4分) +SELECT story_id,story_name,type_id,views_number from story ORDER BY views_number LIMIT 1; +-- 16. 查询积分比刘产高的作者所有信息。(5分) +SELECT * from author where credits>(SELECT credits from author where author_name='刘产'); +-- 17. 查询出哪些白银作家是没有写小说的,显示这些作家的姓名、等级名称。(8分) +SELECT story_name,vip_name FROM story s LEFT JOIN author a ON s.author_id=a.author_id LEFT JOIN vip v ON a.vip_id=v.vip_id WHERE a.author_id NOT IN ( +SELECT author_id FROM author WHERE vip_id=( +SELECT vip_id FROM vip WHERE vip_name='白银作家')); + +-- 18. 找出写过作品浏览量大于5000的作家的所有作品中浏览量不到1000的作品信息(8分) +SELECT * from story where author_id in (SELECT author_id from story where views_number>5000) && views_number<1000; +-- 19. 查询所有小说的小说编号、小说名称、浏览量、分类名称、作者姓名、作者积分、作者等级名称,结果字段要用中文别名,并按浏览量降序排列,如果浏览量一样的,再按积分降序排列。(10分) +SELECT + story_id, + story_name, + views_number, + type_name, + author_name, + credits, + vip_name +FROM + author a + LEFT JOIN story s ON a.author_id = s.author_id + LEFT JOIN vip v ON v.vip_id = a.vip_id + LEFT JOIN type t ON t.type_id = s.type_id; +``` + diff --git "a/53 \345\221\250\345\216\232\350\276\260/20230310 \347\254\254\345\205\253\346\254\241\344\275\234\344\270\232.md" "b/53 \345\221\250\345\216\232\350\276\260/20230310 \347\254\254\345\205\253\346\254\241\344\275\234\344\270\232.md" new file mode 100644 index 0000000000000000000000000000000000000000..3d1993b5684d5e6880698e499157888c6ac89f13 --- /dev/null +++ "b/53 \345\221\250\345\216\232\350\276\260/20230310 \347\254\254\345\205\253\346\254\241\344\275\234\344\270\232.md" @@ -0,0 +1,93 @@ +# 2023年3月10日作业 + +```sql +drop DATABASE if EXISTS d1; +CREATE DATABASE if not EXISTS d1 charset utf8; +use d1; +CREATE TABLE stuinfo( + stuNO VARCHAR(10), + stuname VARCHAR(10), + stuage INT, + stuaddress VARCHAR(10), + stuseat INT, + stusex INT); +CREATE TABLE stuexam( +examno int, +stuno VARCHAR(10), +writtenexam int, +labexam int +); + +INSERT INTO stuinfo +VALUES + ('s2501','张秋利',20,'美国硅谷',1,1), + ('s2502','李斯文',18,'湖北武汉',2,0), + ('s2503','马文才',22,'湖南长沙',3,1), + ('s2504','欧阳俊雄',21,'湖北武汉',4,0), + ('s2505','梅超风',20,'湖北武汉',5,1), + ('s2506','陈旋风',19,'美国硅谷',6,1), + ('s2507','陈风',20,'美国硅谷',7,0); +INSERT into stuexam VALUES +(1 ,'s2501', 50 ,70), +(2 ,'s2502', 60 ,65), +(3 ,'s2503', 85 ,98), +(4 ,'s2504', 40 ,80), +(5 ,'s2505', 70 ,90), +(6 ,'s2506', 85 ,90); + + + +-- 按图片所给的数据进行数据表的建立和数据插入,然后进行以下查询操作 +-- 1.查询学生信息表(stuinfo)中所有列信息,给每列取上中文名称 +SELECT * from stuinfo; +-- 2.查询学生信息表(stuinfo)中的姓名,年龄和地址三列的信息 +SELECT stuname,stuage,stuaddress from stuinfo; +-- 3.查询学生分数表(stuexam)中的学号,笔试和机试三列的信息,并为这三列取中文名字 +SELECT stuno,writtenexam,labexam from stuexam; +-- 5.查询学生分数表(stuexam)中的学生的学号,笔试,机试以及总分这四列的信息 +SELECT stuno,writtenexam,labexam,writtenexam+labexam from stuexam; + +-- 6.查询学生信息表(stuInfo)中学生来自哪几个地方 +SELECT stuname,stuaddress from stuinfo; +-- 7.查询学生信息表(stuInfo)中学生有哪几种年龄,并为该列取对应的中文列名 +SELECT stuname,stuage from stuinfo; +-- 8.查询学生信息表(stuInfo)中前3行记录 +SELECT * from stuinfo LIMIT 3; +-- 9.查询学生信息表(stuInfo)中前4个学生的姓名和座位号 +SELECT stuname,stuseat from stuinfo LIMIT 4; +-- 11.将地址是湖北武汉,年龄是20的学生的所有信息查询出来 +SELECT * from stuinfo WHERE stuaddress='湖北武汉'; +-- 12.将机试成绩在60-80之间的信息查询出来,并按照机试成绩降序排列 +SELECT * from stuexam where labexam between 60 and 80 ORDER BY labexam desc; +-- 13.查询来自湖北武汉或者湖南长沙的学生的所有信息 +SELECT * from stuinfo where stuaddress in ('湖南长沙','湖北武汉'); +-- 14.查询出笔试成绩不在70-90之间的信息,并按照笔试成绩升序排列 +SELECT * from stuexam where writtenexam not BETWEEN 70 and 90; +-- 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 GROUP BY stuage desc,stuseat asc; +-- 23显示笔试第一名的学生的考试号,学号,笔试成绩和机试成绩 +SELECT examno,i.stuNO,writtenexam,labexam from stuinfo i LEFT JOIN stuexam e on e.stuno=i.stuNO HAVING max(writtenexam); +-- 24.显示机试倒数第一名的学生的考试号,学号,笔试成绩和机试成绩 +SELECT examno,i.stuNO,writtenexam,labexam from stuinfo i LEFT JOIN stuexam e on e.stuno=i.stuNO HAVING min(labexam); +-- 25.查询每个地方的学生的平均年龄 +SELECT stuage from stuinfo GROUP BY stuaddress; +-- 26.查询男女生的分别的年龄总和 +SELECT stusex,SUM(stuage) from stuinfo GROUP BY stusex; +-- 27.查询每个地方的男女生的平均年龄和年龄的总和 +SELECT AVG(stuage),SUM(stuage) from stuinfo GROUP BY stusex; +``` +