From e65054dd6dd0bdd441d9114a5a83bd440379d702 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=8E=E5=AD=90=E9=BE=99?= <19505971158@163.com> Date: Thu, 23 Mar 2023 21:30:23 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...20230311 MySQl\344\275\234\344\270\232.md" | 114 ++++++++ ...0230321 MySQL \344\275\234\344\270\232.md" | 256 ++++++++++++++++++ 2 files changed, 370 insertions(+) create mode 100644 "28 \351\273\216\345\255\220\351\276\231/20230311 MySQl\344\275\234\344\270\232.md" create mode 100644 "28 \351\273\216\345\255\220\351\276\231/20230321 MySQL \344\275\234\344\270\232.md" diff --git "a/28 \351\273\216\345\255\220\351\276\231/20230311 MySQl\344\275\234\344\270\232.md" "b/28 \351\273\216\345\255\220\351\276\231/20230311 MySQl\344\275\234\344\270\232.md" new file mode 100644 index 0000000..4e56177 --- /dev/null +++ "b/28 \351\273\216\345\255\220\351\276\231/20230311 MySQl\344\275\234\344\270\232.md" @@ -0,0 +1,114 @@ +```mysql +CREATE DATABASE qwer charset utf8; +use qwer; + +create table stuinfo( +stuNO varchar(255), +stuName varchar(255), +stuAge int, +stuAddress varchar(255), +stuSeat int, +stuSex 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); + +CREATE TABLE stuExam( +examNO INT, +stuNO VARCHAR(255), +writtenExam INT, +labExam INT +); +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 stuNo 学号,writtenExam 笔试,labExam 机试 from stuexam; + +-- 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; + +-- 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 stuAge desc,stuSeat; + +-- 23显示笔试第一名的学生的考试号,学号,笔试成绩和机试成绩 +select * from stuexam where writtenExam=(select max(writtenExam) from stuexam); + +-- 24.显示机试倒数第一名的学生的考试号,学号,笔试成绩和机试成绩 +select * from stuexam where labExam=(select min(labExam) from stuexam); + +-- 25.查询每个地方的学生的平均年龄 +select stuAddress,ROUND(avg(stuAge),2) from stuinfo GROUP BY stuAddress; + +-- 26.查询男女生的分别的年龄总和 +select stuSex,sum(stuAge) from stuinfo GROUP BY stuSex; + +-- 27.查询每个地方的男女生的平均年龄和年龄的总和 +select stuAddress,stuSex,ROUND(avg(stuAge),2),sum(stuAge) from stuinfo GROUP BY stuAddress,stuSex; + +``` + diff --git "a/28 \351\273\216\345\255\220\351\276\231/20230321 MySQL \344\275\234\344\270\232.md" "b/28 \351\273\216\345\255\220\351\276\231/20230321 MySQL \344\275\234\344\270\232.md" new file mode 100644 index 0000000..a633c2f --- /dev/null +++ "b/28 \351\273\216\345\255\220\351\276\231/20230321 MySQL \344\275\234\344\270\232.md" @@ -0,0 +1,256 @@ +```mysql +-- 0.创建数据库练习 +-- 1.直接创建数据库db3 +create database db3 charset utf8; +-- 2.判断是否存在并创建数据库db4 +create database if not exists db4 charset utf8; +-- 3.查看所有的数据库 +show databases; +-- 4.删除db3数据库 +drop database db3; +-- 5.查看正在使用的数据库 +select database(); +-- 6.使用db4数据库 +use db4; +-- +-- +-- 1.创建表练习 +-- - 需求:设计一张学生表,请注重数据类型、长度的合理性 +-- +-- 1.编号 +-- 2.姓名,姓名最长不超过10个汉字 +-- 3.性别,因为取值只有两种可能,因此最多一个汉字 +-- 4.生日,取值为年月日 +-- 5.入学成绩,小数点后保留两位 +-- 6.邮件地址,最大长度不超过 64 +-- 7.家庭联系电话,不一定是手机号码,可能会出现 - 等字符 +-- 8.学生状态(用数字表示,正常、休学、毕业...) +create table stu( + id int, + `name` varchar (10), + sex varchar(1), + birthday date, + score double(5,2), + address varchar(64), + phonum varchar(20), + state int +); +-- 2.更改表练习 + -- 1.修改stu表名为student +alter table stu rename to student; + -- 2.给学生表添加一列remark,类型为varchar(20) +alter table student add remark varchar(20); + -- 3.修改remark列的类型是varchar(100) +alter table student modify remark varchar(100); + -- 4.修改remark列的名变为intro,类型varchar(30) +alter table student change remark intro varchar(30); + -- 5.删除intro列 +alter table student drop intro; +-- 3.添加数据 + -- 1.创建表 +create table lipu( + id int, + `name` varchar (10), + age int, + sex enum('男','女'), + address varchar(64), + math double(5,2), + english double(5,2) +); + + + -- 2.插入部分数据,给id name age sex赋值 + /* + 1.在mysql中插入字符数据,数据使用单引号或者双引号都可以,建议使用单引号 + 2.在mysql中插入的数据是date类型,那么将数据书写在单引号或者双引号都可以 + */ + + -- 3.插入所有的字段,不写字段名 + -- 4.插入所有的字段,写出字段名 + -- 5.批量插入数据 + -- 插入数据注意 + -- 6.插入数据时 省略列名,那么如果不需要给列赋值那么使用null + + insert into lipu VALUES + (1,'柳岩',20,'女','湖南',85,90), + (2,'舞岩',20,'男','武汉',57,53), + (3,'赵丽颖',30,'女','湖南',45,75), + (4,'赵匡胤',30,'男','福建',47,63), + (5,'赵磊',27,'男','福建',28,43), + (6,'韩立',27,'男','福建',96,75), + (7,'独孤女侠',28,'女','广东',17,17), + (8,'阿斯蒂芬',30,'女','云南',55,14), + (9,'李寻欢',43,'男','北京',47,28), + (10,'胡歌',43,'男','上海',78,68); + +-- 4.修改数据 + + -- 1.修改数据:修改性别都变为女 +update lipu set sex='女'; + -- 2.修改数据:带条件修改id是2的学生性别变为男 +update lipu set sex='男' where id=2; + -- 3.一次修改多个列,把id为3的学生,年龄改成26岁,address改成北京 +update lipu set age=26,address='北京' where id=3; +-- 5.删除数据 + -- 1.带条件删除数据,删除id是3的记录 +delete from lipu where id=3; + -- 2.带条件删除数据,删除id是1和2的记录 id in(1,2) : 表示id的值是1或者2 +delete from lipu where id in (1,2); + + -- 3.不带条件删除 + -- 还可以使用:DDL + -- 这里的table可以省略 +-- 6.查询数据 + + + -- 1.查询多个字段 + -- * 表示所有字段 +select * from lipu; + -- 2.写出查询每列的名称 +select id,`name`,age,sex,address,math,english from lipu; + -- 3.查询表中name和age列,name列的别名为姓名,age列的别名为年龄 + -- 使用as起给字段和表起别名 + -- as可以省略 +select `name` 姓名,age 年龄 from lipu; + + -- 4.去重 + -- 对age去重 +select distinct age from lipu; + + -- 对age和address去重 + -- 如果多个字段一起去重,如果所有的字段值全部一样才会去重 +select distinct age,address from lipu; + + +-- 7.带条件的查询 + -- 1.查询数学成绩大于80学生 +select * from lipu where math>80; + -- 2.查询英语成绩小于等于80学生 +select * from lipu where english<80; + -- 3.查询年龄等于20的学生 +select * from lipu where age=20; + -- 4.查询年龄不等于20的学生 +select * from lipu where age !=20; + + -- 5.查询年龄大于35并且性别是男的学生 +select * from lipu where age>35 and sex='男'; + -- 6.查询年龄大于35或者性别是男的学生 +select * from lipu where age>35 or sex='男'; + -- 7.查询id是1 3 5的学生 +select * from lipu where id in (1,3,5); + + -- 8.查询id不是1 3 5的学生 + -- not in 是in的取反,表示不在什么其中 +select * from lipu where id not in (1,3,5); + -- 范围查询 + -- 9.英语成绩在75和90之间 +select * from lipu where english between 75 and 90; + + -- 模糊查询 使用like + -- 10.查询姓赵的学生 + -- name like '赵%' 表示name的值以赵开始,后面是什么都可以 + -- %在模糊查询中表示任意个数的字符 +select * from lipu where name like '赵%'; + + -- 11.查询包含岩 + -- name like '%岩%' 表示name的值只要含有岩即可,前后%表示匹配任意多个字符 +select * from lipu where name like '%岩%'; + + -- 12.查询姓赵并且是三个字的学生 + -- _下划线在模糊查询中表示单个字符 +select * from lipu where name like '赵__'; + + -- 排序 + -- desc表示降序 + -- 13.按照年龄降序排序 +select * from lipu ORDER BY age desc; + -- 14.先按照年龄降序排序,如果年龄相同在按照数学降序排序 +select * from lipu ORDER BY age desc,math desc; + -- 15.先按照年龄降序排序,如果年龄相同在按照数学升序排序 +select * from lipu ORDER BY age desc,math asc; + + -- 聚合函数 + -- 16.查询学生总数即有多少名学生 +select count(id) from lipu; + -- 17.查询数学成绩总分数 +select sum(math) from lipu; + -- 18.查询数学成绩最高分数 +select max(math) from lipu; + -- 19.统计数学和英语总和值 + -- 实现一:分别统计数学和英语的每个总成绩,然后进行相加 +select sum(math)+sum(english) from lipu; + + -- 实现二:分别统计每个人的数学和英语成绩,然后将每个人的数学和英语成绩相加 +select sum(ifnull(math,0)+ ifnull(english,0)) from lipu; + /* + 结果是:380 少了柳岩的90 + sum(math+english): + 问题原因: + + + + 解决上述问题:使用mysql自带函数:ifnull(字段值,默认值) + 说明: + ifnull(字段值,默认值) + 如果字段值是null,那么使用默认值作为ifnull函数的整体结果 + 如果字段值不是null,那么使用字段值作为ifnull函数的整体结果 + 举例: + ifnull(english,0): + 1)假设english的值是null===>ifnull(null,0)===>整体结果是0 + 2)假设english的值是80===>ifnull(80,0)===>整体结果是80 + */ + + + + -- 分组 + -- 准备数据 + create table car( + id int, + color char(2), + price float + ); + + insert into car(id,color,price) values(1,'黄色',16); + insert into car(id,color,price) values(2,'黄色',16); + insert into car(id,color,price) values(3,'蓝色',5); + insert into car(id,color,price) values(4,'红色',60); + insert into car(id,color,price) values(5,'白色',8); + insert into car(id,color,price) values(6,'红色',60); + + -- 1.查询每种颜色车辆的总价 +select color,sum(price) from car GROUP BY color; + -- 2.查询每种颜色车辆总价大于30车辆的颜色和总价 +select color,sum(price) from car GROUP BY color HAVING sum(price)>30; + -- 3.注意:分组查询的结果最好是分组字段和聚合函数,不要是其他字段 + + -- 4.where后面不能使用聚合函数 报错的 + + -- 小结:where是在分组前筛选,having是在分组后筛选 + -- 5.查询车的单价大于15的每种颜色车辆总价大于30车辆的颜色和总价 +select color,sum(price) from car where price>15 GROUP BY color HAVING sum(price)>30; + + -- 分页 + -- 1.分页查询数据,每页显示2条数据 + -- 第一页 + -- 0 表示起始索引,对应第一行数据 + -- 2表示每页显示2条数据 +select * from car limit 0,2; + + -- 当起始索引是0的情况下可以不写索引0,写法如下, + -- 下面的2表示每页显示的数据行数 +select * from car limit 2; + -- 第二页 + -- 第一个2表示起始索引,对应三行数据 + -- 第二个2表示每页显示两条数据,对于第二个参数每个公司基本是固定的,最后一页剩下几行数据 + -- 就会显示几行数据 + + -- 第三页 + /* + 公式: 起始索引 = (当前页码-1)*每页显示的条数 + 0 1 2 + 2 2 2 + 4 3 2 + */ + +``` + -- Gitee