MySQL学习
一、基础语法学习
1.1 select
select * from 表名
1.2 update
UPDATE 表名 SET field1=value1,field2=value2,.. WHERE 条件;
1.3 insert
insert into 表名 (field1,field2,..) values (value1,value2,...)
1.4 delete
DELETE FROM 表名 WHERE field = value
1.5 group by
- 默认只显示分组后的第一个成员信息,如果需要显示全部信息需要使用group_concat。对显示的字段添加group_concat。
SELECT s.sex,GROUP_CONCAT(s.name) FROM students s JOIN course c ON s.course_id = c.id GROUP BY s.sex;
- 多个分组参数
前一个分组参数条件相同,才会进行下一个分组。
1.6 聚合函数
- COUNT
- SUM
- MAX
- MIN
- AVG
1.7 mysql语句执行顺序
- 先执行on筛选条件,然后join,避免产生大量数据
- 接着where,group by,having,select,distinct,order by,limit。
- 过滤条件排序:on,where,having
1.8 其他关键字
- distinct
去重
mysql中的distinct的用法
SELECT DISTINCT age FROM students;
//这是多个字段的去重,只有多个字段完全一致才会被去重。
SELECT DISTINCT age,id FROM students;
- having
条件筛选,在聚合函数后执行,而where是在聚合函数之前执行的,having要写在group by后面。
MySQL中having的用法
SELECT COUNT(age) nums,GROUP_CONCAT(NAME) FROM students GROUP BY age HAVING nums >=2 ;
- limit n,m,n表示从第几行开始,n从0开始,m表示返回几行数据。
MySQL中的limit用法详解
SELECT * FROM students LIMIT 1,5;
1.9 符号
- <>:表示不包含
1.10 时间查询
- Date(arg) = “xxxx”
arg是时间参数
二、复杂查询
2.1 多表联查之内外连接查询
2.1.1 交叉连接
- 返回连接表的笛卡尔积
- SELECT * FROM students CROSS JOIN course;
2.1.2 内连接
- 通过on后面设置连接条件移除不符合条件的数据行,不设置条件和交叉链接一样的。
- 也可以使用where设置条件,但是on是标准写法。
- SELECT s.name,c.course_name FROM students s INNER JOIN course c ON s.course_id=c.id;
2.1.3 外连接
外连接将表分为基表和参考表,在基表的基础上返回符合条件的记录。有左外连接和右外连接。
2.1.3.1 左外连接
- 左边的表为基表,左边的表的数据都会展示,若左表数据对应的右表数据为空则右表对应数据显示nul,若左表的数据对应右表的数据有多行,则数据会多条展示。
INSERT INTO students (NAME,age,sex,height) VALUES ("jack",23,"男",189);
SELECT * FROM students;
SELECT s.name,c.course_name FROM students s LEFT JOIN course c ON s.course_id = c.id;
2.1.3.2 右外连接
- 右边的表为基表,右边的表的数据都会展示,若右表数据对应的左边表数据为空则左表对应数据显示null,若右表的数据对应左表的数据有多行,则数据会多条展示。
INSERT INTO course (course_name) VALUES ("c#");
SELECT * FROM course;
SELECT c.course_name,s.name FROM students s RIGHT JOIN course c ON s.course_id = c.id;
2.1.4 内连接和外连接的区别
内连接只包含符合条件的数据行,数据为null就不可以,但是外连接可以,数据为null依然可以展示。
2.2 多表查询之子查询
2.2.1 操作符
- IN,NOT IN
只要查询的值在/不在子查询的值范围中,就返回true - EXISTS,NOT EXISTS
子查询语句结果集不为null就返回true
2.2.2 子查询语句
- 单个字段
SELECT * FROM students WHERE id IN (SELECT id FROM students WHERE id > 9) AND sex = (SELECT sex FROM students WHERE NAME = "tom");
- 多个字段
SELECT * FROM students WHERE (id,age) > (SELECT id,age FROM students WHERE id = 4);
- any:和子查询中所有结果逐一比较,只要符合就成功返回
//查询男生中身高比只要比任意一个女生都低的男生的所有信息
SELECT * FROM students WHERE height < ANY(SELECT height FROM students WHERE sex= "女") AND sex = "男"
- all:和子查询中所有结果逐一比较,必须都满足才行
//查询男生中身高比所有女生都低的男生的所有信息
SELECT * FROM students WHERE height < ALL(SELECT height FROM students WHERE sex= "女") AND sex = "男"
2.2.3 例题
- 查询平均身高最低的年龄段学生
//查询平均身高最低的年龄段学生
SELECT MIN(res), age FROM (SELECT AVG(height) res, age FROM students GROUP BY age) AS a;
//查询平均身高最低的年龄段学生
SELECT age,AVG(height) FROM students GROUP BY age HAVING AVG(height) =
(SELECT MIN(res)FROM
(SELECT AVG(height) res FROM students GROUP BY age)AS a);
2.2.4 相关子查询
2.2.4.1 概述
参考:
MySQL子查询
- 如果子查询的执行依赖于外部查询,通常情况下都是因为子查询中的表用到了外部的表,并进行了条件关联,因此每执行一次外部查询,子查询都要重新计算一次,这样的子查询就称之为 关联子查询。
相关子查询按照一行接一行的顺序执行,主查询的每一行都执行一次子查询。
2.2.4.2 示例
- 查询每个年龄段身高大于平均身高的学生信息
SELECT * FROM students s1 WHERE height >=
(SELECT AVG(height) FROM students s2 WHERE s2.age = s1.age);
- 执行步骤
1.SELECT * FROM students
2.SELECT AVG(height) FROM students s2 WHERE s2.age = s1.age,找到该年龄段的所有学生并求平均
3.将该行学生的height 与2的结果进行比较,结束转入第二行重复上述步骤。
三、注意
3.1 中间表
中间产生的表需要重新命名才行
3.2 模糊查询
- _匹配一个字符,汉字或者英文
- %匹配多个字符
SELECT * FROM students WHERE NAME LIKE "__m"