diff --git "a/06 \351\202\271\347\244\274\346\235\255/20230321 \344\275\234\344\270\232.md" "b/06 \351\202\271\347\244\274\346\235\255/20230321 \344\275\234\344\270\232.md" new file mode 100644 index 0000000000000000000000000000000000000000..c5ec7783b5fc482271b516f4188012221bbad117 --- /dev/null +++ "b/06 \351\202\271\347\244\274\346\235\255/20230321 \344\275\234\344\270\232.md" @@ -0,0 +1,223 @@ +```sql +#0.创建数据库练习 +# 1.直接创建数据库db3 +create database db3 charset uft8; +# 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 if not exists student( +id int, +name VARCHAR(10), +sex VARCHAR(1), +birthday date, +score double(5,2), +email VARCHAR(64), +tel VARCHAR(20), +status int +); +desc student; +#2.更改表练习 + -- 1.修改student表名为stu + alter table student rename to stu; + -- 2.给学生表添加一列remark,类型为varchar(20) + alter table stu add remark VARCHAR(20); + -- 3.修改remark列的类型是varchar(100) + alter table stu modify remark VARCHAR(100); + -- 4.修改remark列的名变为intro,类型varchar(30) + alter table stu change remark intro VARCHAR(30); + desc stu; + -- 5.删除intro列 + alter table stu drop intro; + + #3.添加数据 + -- 1.创建表 + create table if not exists abc( + id int , + name VARCHAR(10), + age int, + sex VARCHAR(1) + ); + -- 2.插入部分数据,给id name age sex赋值 + /* + 1.在mysql中插入字符数据,数据使用单引号或者双引号都可以,建议使用单引号 + 2.在mysql中插入的数据是date类型,那么将数据书写在单引号或者双引号都可以 + */ + insert into abc VALUES(1,'赵六',30,'男','北京'); + -- 3.插入所有的字段,不写字段名 + insert into abc VALUES (2,'李四',19,'女','上海'); + -- 4.插入所有的字段,写出字段名 +insert into abc (id,name,age,sex,address) VALUES(3,'王五',20,'男','广州'); + -- 5.批量插入数据 + insert into abc (id,name,age,sex,address) VALUES(3,'王五',20,'男','深圳'),(4,'王五',20,'男','美国'),(5,'王五',20,'男','福建'); + -- 插入数据注意 + -- 6.插入数据时 省略列名,那么如果不需要给列赋值那么使用null + insert into abc VALUES(6,'王五',20,'男','福建'),(7,'王五',20,'男','福建'),(8,null,20,'男','福建'); + select * from abc; + +#4.修改数据 + -- 1.修改数据:修改性别都变为女 + update abc set sex='女'; + -- 2.修改数据:带条件修改id是2的学生性别变为男 + update abc set sex='男' where id=2; + -- 3.一次修改多个列,把id为3的学生,年龄改成26岁,address改成北京 + alter table abc add address VARCHAR(20); + update abc set age=26,address='北京' where id=3; + + #5.删除数据 + -- 1.带条件删除数据,删除id是3的记录 + delete from abc where id=3; + -- 2.带条件删除数据,删除id是1和2的记录 id in(1,2) : 表示id的值是1或者2 + delete from abc where id in (1,2); + -- 3.不带条件删除 + -- 还可以使用:DDL + -- 这里的table可以省略 + delete from abc; + + #6.查询数据 + + -- 1.查询多个字段 + -- * 表示所有字段 +select * from abc; + -- 2.写出查询每列的名称 +select id,name,age,sex,address from abc; +desc abc; + -- 3.查询表中name和age列,name列的别名为姓名,age列的别名为年龄 + -- 使用as起给字段和表起别名 + -- as可以省略 +select `name`as 姓名,age as年龄 from abc; + -- 4.去重 + -- 对age去重 +select distinct age from abc; + -- 对age和address去重 + -- 如果多个字段一起去重,如果所有的字段值全部一样才会去重 + select distinct age,address from abc; + +# 7.带条件的查询 + -- 1.查询数学成绩大于80学生 + select * from abc where marks='数学' and score>80; + -- 2.查询英语成绩小于等于80学生 + select * from abc where marks='英语' and score<=80; + -- 3.查询年龄等于20的学生 +select * from abc where age=20; + -- 4.查询年龄不等于20的学生 +select * from abc where !(age=20); -- 取反 +select * from abc where age!=20; + -- 5.查询年龄大于35并且性别是男的学生 +select * from abc where sex='男' and age>35; + -- 6.查询年龄大于35或者性别是男的学生 +select * from abc where sex='男' or age>35; + -- 7.查询id是1 3 5的学生 +select *from abc where id in (1,3,5); + -- 8.查询id不是1 3 5的学生 + -- not in 是in的取反,表示不在什么其中 +select *from abc where id not in (1,3,5); + -- 范围查询 + -- 9.英语成绩在75和90之间 +select * from abc where (score between 75 and 90) and marks='英语'; + + -- 模糊查询 使用like + -- 10.查询姓赵的学生 + -- name like '赵%' 表示name的值以赵开始,后面是什么都可以 + -- %在模糊查询中表示任意个数的字符 +select * from abc where name like '赵%'; + -- 11.查询包含岩 + -- name like '%岩%' 表示name的值只要含有岩即可,前后%表示匹配任意多个 + select *from abc where name like '%岩%'; + + +# 字符 + -- 12.查询姓赵并且是三个字的学生 + -- _下划线在模糊查询中表示单个字符 +select *from abc where name like '赵__'; + -- 排序 + -- desc表示降序 + -- 13.按照年龄降序排序 +select * from abc order by age desc; + -- 14.先按照年龄降序排序,如果年龄相同在按照数学降序排序 +select * from abc order by age desc,marks desc; + -- 15.先按照年龄降序排序,如果年龄相同在按照数学升序排序 + select * from abc order by age desc,marks asc; + + -- 聚合函数 + -- 16.查询学生总数即有多少名学生 +select count(*) from abc; + -- 17.查询数学成绩总分数 +select sum(score) from abc where marks='数学'; + -- 18.查询数学成绩最高分数 +select max(score) from abc where marks='数学'; + -- 19.统计数学和英语总和值 + -- 实现一:分别统计数学和英语的每个总成绩,然后进行相加 + + + -- 分组 + -- 准备数据 + 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.查询每种颜色车辆的总价 + + -- 2.查询每种颜色车辆总价大于30车辆的颜色和总价 +select color,sum(price) sum from car GROUP BY color having sum>30; + -- 3.注意:分组查询的结果最好是分组字段和聚合函数,不要是其他字段 + -- 4.where后面不能使用聚合函数 报错的 + -- 小结:where是在分组前筛选,having是在分组后筛选 + + #5.查询车的单价大于15的每种颜色车辆总价大于30车辆的颜色和总价 +select color,sum(price) sum from car where price>15 GROUP BY color having sum>30; + + + -- 分页 + -- 1.分页查询数据,每页显示2条数据 + -- 第一页 + -- 0 表示起始索引,对应第一行数据 + -- 2表示每页显示2条数据 + select *from car limit 0,2; + + -- 当起始索引是0的情况下可以不写索引0,写法如下, + -- 下面的2表示每页显示的数据行数 +select *from car limit 2; + -- 第二页 + select * from car limit 2,2; + -- 第一个2表示起始索引,对应三行数据 + -- 第二个2表示每页显示两条数据,对于第二个参数每个公司基本是固定的,最后一页剩下几行数据 + -- 就会显示几行数据 + + -- 第三页 + /* + 公式: 起始索引 = (当前页码-1)*每页显示的条数 + 0 1 2 + 2 2 2 + 4 3 2 + */ +select * from car limit 4,2; +``` +