From 8dd582fd2ed3515afde7ddda5f4c9f81891684c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9C=E6=9D=8E=E6=8C=AF=E5=8D=8E=E2=80=9D?= <877611343@qq.com> Date: Thu, 23 Mar 2023 22:43:40 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9D=8E=E6=8C=AF=E5=8D=8E=E7=9A=84=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...350\257\242\344\275\234\344\270\232.md.md" | 0 ...344\271\240\344\275\234\344\270\232.md.md" | 296 ++++++++++++++++++ 2 files changed, 296 insertions(+) rename "02 \346\235\216\346\214\257\345\215\216/20230311 MySQL\346\237\245\350\257\242\344\275\234\344\270\232.md" => "02 \346\235\216\346\214\257\345\215\216/20230311 MySQL\346\237\245\350\257\242\344\275\234\344\270\232.md.md" (100%) create mode 100644 "02 \346\235\216\346\214\257\345\215\216/20230321 MySQL\345\244\215\344\271\240\344\275\234\344\270\232.md.md" diff --git "a/02 \346\235\216\346\214\257\345\215\216/20230311 MySQL\346\237\245\350\257\242\344\275\234\344\270\232.md" "b/02 \346\235\216\346\214\257\345\215\216/20230311 MySQL\346\237\245\350\257\242\344\275\234\344\270\232.md.md" similarity index 100% rename from "02 \346\235\216\346\214\257\345\215\216/20230311 MySQL\346\237\245\350\257\242\344\275\234\344\270\232.md" rename to "02 \346\235\216\346\214\257\345\215\216/20230311 MySQL\346\237\245\350\257\242\344\275\234\344\270\232.md.md" diff --git "a/02 \346\235\216\346\214\257\345\215\216/20230321 MySQL\345\244\215\344\271\240\344\275\234\344\270\232.md.md" "b/02 \346\235\216\346\214\257\345\215\216/20230321 MySQL\345\244\215\344\271\240\344\275\234\344\270\232.md.md" new file mode 100644 index 0000000..f5dc33c --- /dev/null +++ "b/02 \346\235\216\346\214\257\345\215\216/20230321 MySQL\345\244\215\344\271\240\344\275\234\344\270\232.md.md" @@ -0,0 +1,296 @@ +```mysql + +create database if not exists ab4 charset utf8; + + +#0.创建数据库练习 + #1.直接创建数据库db3 + CREATE database ab3 charset utf8; + #2.判断是否存在并创建数据库db4 + CREATE DATABASE if not exists ab4 charset utf8; + #3.查看所有的数据库 + show databases; + #4.删除db3数据库 + drop database ab3; + #5.查看正在使用的数据库 + SELECT database(); + #6.使用db4数据库 + use ab4; +#1.创建表练习 +-- 需求:设计一张学生表,请注重数据类型、长度的合理性 + + #1.编号 + #2.姓名,姓名最长不超过10个汉字 + #3.性别,因为取值只有两种可能,因此最多一个汉字 + #4.生日,取值为年月日 + #5.入学成绩,小数点后保留两位 + #6.邮件地址,最大长度不超过 64 + #7.家庭联系电话,不一定是手机号码,可能会出现 - 等字符 + #8.学生状态(用数字表示,正常、休学、毕业...) + CREATE table stu ( + id INT, + lname VARCHAR(20), + sex enum('男','女'), + age int, + birthday date, + score double(5,2), + address VARCHAR(64), + tel VARCHAR(20), + `status` int + ); + + desc student; +#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; + insert into student VALUES + (1,'柳岩','女',43,'1980-5-16',138.78,'湖南','1377987546',1), + (2,'舞岩','男',38,'1985-6-15',111.11,'武汉','1654654135',2), + (3,'赵丽颖','女',36,'1987-7-13',123.56,'湖南','3524165465',1), + (4,'赵匡胤','男',20,'1977-5-7',133.56,'福建','16549848974',3), + (5,'赵磊','男',20,'1993-4-6',150.00,'福建','16546546',1), + (6,'韩立','男',20,'2002-11-23',150.00,'福建','1895465411',1), + (7,'独孤女侠','女',20,'2002-6-7',139.22,'广东','1356546541',1), + (8,'阿斯蒂芬','女',33,'1991-2-2',99.99,'云南','1654645646',2), + (9,'李寻欢','男',33,'1991-3-3',110.10,'北京','564654654',3), + (10,'胡歌','男',44,'1985-6-6',145.66,'上海','5465464654',1); + + create table score( + id int, + math DOUBLE comment'数学', + English DOUBLE comment'英语' + ); + insert into score VALUES + (1,88,90), + (2,90,99), + (3,55,60), + (4,40,77), + (5,66,89), + (6,95,97), + (7,58,77), + (8,99,100), + (9,100,80), + (10,100,100); +3.添加数据 + -- 1.创建表 + + -- 2.插入部分数据,给id name age sex赋值 + + create table wuhu( + id int, + name VARCHAR(5), + age int, + sex enum('男','女') + ); + ALTER table wuhu add address VARCHAR(55); + desc wuhu; + /* + 1.在mysql中插入字符数据,数据使用单引号或者双引号都可以,建议使用单引号 + 2.在mysql中插入的数据是date类型,那么将数据书写在单引号或者双引号都可以 + */ + + -- 3.插入所有的字段,不写字段名 + insert into wuhu VALUES + (1,'张三',17,'男','福建'), + (2,'李四',18,'女','福建'), + (3,'王五',19,'男','福建'), + (4,'老六',20,'女','福建'); + -- 4.插入所有的字段,写出字段名 + insert into wuhu(id,name,age,sex,address) VALUES + (5,'光头强',17,'男','福建'), + (6,'熊大哥',18,'女','福建'), + (7,'熊二哥',19,'男','福建'), + (8,'萝卜头',20,'女','福建'); + -- 5.批量插入数据 + -- 插入数据注意 + -- 6.插入数据时 省略列名,那么如果不需要给列赋值那么使用null + +4.修改数据 + SELECT * FROM wuhu; + -- 1.修改数据:修改性别都变为女 + update wuhu set sex='女'; + -- 2.修改数据:带条件修改id是2的学生性别变为男 + update wuhu set sex='男' where id=2 ; + -- 3.一次修改多个列,把id为3的学生,年龄改成26岁,address改成北京 + update wuhu set age=26,address='北京' WHERE id=3; +5.删除数据 + -- 1.带条件删除数据,删除id是3的记录 + DELETE FROM wuhu WHERE id=3; + -- 2.带条件删除数据,删除id是1和2的记录 id in(1,2) : 表示id的值是1或者2 + DELETE FROM wuhu WHERE id in(1,2); + + -- 3.不带条件删除 + DELETE FROM wuhu; + -- 还可以使用:DDL + -- 这里的table可以省略 + +6.查询数据 + + + -- 1.查询多个字段 + desc student; + -- * 表示所有字段 + + -- 2.写出查询每列的名称 +SELECT * FROM student; + -- 3.查询表中name和age列,name列的别名为姓名,age列的别名为年龄 + SELECT lname 姓名,age 年龄 FROM student; + -- 使用as起给字段和表起别名 + -- as可以省略 + + + -- 4.去重 + -- 对age去重 +SELECT DISTINCT age FROM student; + + -- 对age和address去重 + SELECT DISTINCT age,address FROM student; + -- 如果多个字段一起去重,如果所有的字段值全部一样才会去重 + + + + +7.带条件的查询 + -- 1.查询数学成绩大于80学生 +SELECT * FROM student a JOIN score b on a.id=b.id WHERE math>80; + + -- 2.查询英语成绩小于等于80学生 +SELECT * FROM student a JOIN score b on a.id=b.id WHERE English<=80; + -- 3.查询年龄等于20的学生 +SELECT * FROM student WHERE age=20; + -- 4.查询年龄不等于20的学生 +SELECT * FROM student WHERE !(age=20); + + -- 5.查询年龄大于35并且性别是男的学生 +SELECT * FROM student WHERE age>35 and sex='男'; + -- 6.查询年龄大于35或者性别是男的学生 +SELECT * FROM student WHERE age>35 or sex='男'; + -- 7.查询id是1 3 5的学生 +SELECT * FROM student WHERE id in(1,3,5); + + -- 8.查询id不是1 3 5的学生 + -- not in 是in的取反,表示不在什么其中 +SELECT * FROM student WHERE id not in(1,3,5); + -- 范围查询 + -- 9.英语成绩在75和90之间 +SELECT * FROM student a JOIN score b on a.id=b.id WHERE English BETWEEN 75 and 90; + + -- 模糊查询 使用like + -- 10.查询姓赵的学生 + -- name like '赵%' 表示name的值以赵开始,后面是什么都可以 + -- %在模糊查询中表示任意个数的字符 +SELECT * FROM student WHERE lname like '赵%'; + + -- 11.查询包含岩 + -- name like '%岩%' 表示name的值只要含有岩即可,前后%表示匹配任意多个字符 +SELECT * FROM student WHERE lname like '%岩%'; + + -- 12.查询姓赵并且是三个字的学生 + -- _下划线在模糊查询中表示单个字符 +SELECT * FROM student WHERE lname like '赵__'; + + -- 排序 + -- desc表示降序 + -- 13.按照年龄降序排序 +SELECT * FROM student ORDER BY age desc; + -- 14.先按照年龄降序排序,如果年龄相同在按照数学降序排序 +SELECT * FROM student a JOIN score b on a.id=b.id ORDER BY age desc,math desc; + -- 15.先按照年龄降序排序,如果年龄相同在按照数学升序排序 +SELECT * FROM student a JOIN score b on a.id=b.id ORDER BY age desc,math ; + + -- 聚合函数 + -- 16.查询学生总数即有多少名学生 +SELECT count(id) FROM student; + -- 17.查询数学成绩总分数 +SELECT sum(math) FROM score; + -- 18.查询数学成绩最高分数 +SELECT max(math) FROM score; + -- 19.统计数学和英语总和值 + -- 实现一:分别统计数学和英语的每个总成绩,然后进行相加 +SELECT SUM(math),SUM(English),(SUM(math)+SUM(English)) FROM score; + + -- 实现二:分别统计每个人的数学和英语成绩,然后将每个人的数学和英语成绩相加 + SELECT sum(math+english) FROM score; + /* + 结果是: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 * FROM car WHERE price>15 GROUP BY color; +SELECT color,SUM(price) FROM car GROUP BY color HAVING SUM(price)>30; + -- 分页 + -- 1.分页查询数据,每页显示2条数据 + SELECT * FROM car LIMIT 0,2; + -- 第一页 + -- 0 表示起始索引,对应第一行数据 + -- 2表示每页显示2条数据 + SELECT * FROM car LIMIT 0,2; + + + -- 当起始索引是0的情况下可以不写索引0,写法如下, + -- 下面的2表示每页显示的数据行数 + SELECT * FROM car LIMIT 2; + + -- 第二页 + -- 第一个2表示起始索引,对应三行数据 + -- 第二个2表示每页显示两条数据,对于第二个参数每个公司基本是固定的,最后一页剩下几行数据 + -- 就会显示几行数据 +SELECT * FROM car LIMIT 4,2; + -- 第三页 + /* + 公式: 起始索引 = (当前页码-1)*每页显示的条数 + 0 1 2 + 2 2 2 + 4 3 2 + */ + +``` + -- Gitee