MySQL学习笔记整理2 实战篇 解决实际问题
本文是继 SQL入门学习笔记整理1 的第二篇,主要讲述单表查询以及多表查询的详细介绍。看到这篇文章的博友们,这篇文章花了我不少时间,希望看到的博友可以耐心完。
一、 查询相关
1. 单表查询
1.1 is null和is not null
is null表示为空
is not 表示不为空
示例:
查询学号为空的数据
SELECT * FROM students WHERE stuNO IS NULL;
格式
SELECT * FROM 表名 WHERE 要判断是否为空的字段名 IS NULL;
1.2 别名
将查询到的字段名以新的字段名显示,但没有修改字段名
示例
给字段stuNO起别名为学号
SELECT stuNO AS 学号 FROM students;
格式
SELECT 字段1 AS 别名1, 字段2 AS 别名2 FROM 表名;
1.3 去重复distinct
示例:
去掉 name 重复的数据
SELECT DISTINCT name FROM students;
-格式
SELECT DISTINCT 字段 FROM 表名;
1.4 比较运算符
> ,=, <=, = ,!=, <>
依次意为:大于,小于,大于等于,小于等于,等于,不等于,不等于
示例:
查找年龄大于等于18的学生信息
SELECT * FROM students WHERE age >=18;
格式:
SELECT * FROM 表名 WHERE 条件字段 比较运算符 条件;
1.5 AND和OR
AND等价于 &&
OR等价于 ||
示例
查找年龄大于等于18并且名字是王五的学生信息
SELECT * FROM students WHERE age >=18 AND name='王五';
格式:
SELECT * FROM 表名 WHERE 条件1 AND 条件2;
1.6 IN 查询多个值
示例
查询年龄是18,21,22的学生信息
SELECT * FROM students WHERE age in(18,21,22);
格式
SELECT * FROM students WHERE age in(字段1,字段2,字段3);
1.7 BETWEEN x AND y 包含x和y
示例
查询年龄在18到22岁的学生信息(包含18和22)
SELECT * FROM students WHERE age BETWEEN 18 AND 22;
格式:
SELECT * FROM 表名 WHERE 字段 BETWEEN 值1 AND 值2;
1.8 模糊查询 LIKE
_ 代表单个未知字符
% 代表0或多个未知字符
示例
查询姓王的学生信息
SELECT * FROM students WHERE name LIKE '王%';
格式:
SELECT * FROM 表名 WHERE 字段 LIKE '所求的值%';
1.9 排序 ORDER BY
asc升序 (默认是升序)
desc 降序
示例:
将学生信息按年龄降序进行排序
SELECT * FROM students ORDER BY age desc ;
格式
SELECT * FROM 表名 ORDER BY 字段名 DESC/ASC ;
1.10 分页查询
示例
查询年龄升序排序的学生信息表的第一页第一行数据
SELECT * FROM students ORDER BY age LIMIT 1,1;
格式
SELECT * FROM 表名 ORDER BY 字段 LIMIT 页数,行数;
2. 分组查询
2.1 GROUP BY 分组字段名
应用场景:通常GROUP BY会和聚合函数一起使用,例如 查询每个部门的最高工资的人员信息等。
示例:查询每个部门的最高工资
SELECT depName as 部门名, MAX(sal) as 最高工资 FROM dep GROUP BY depName;
格式
SELECT 字段1, MAX(字段2) FROM 表名 GROUP BY 要分组的字段;
Tip:示例中的as就是前面提到别名,通常我们为了让查询的结果更清晰一目了然,我们会给字段起别名,这样查询结果就会如下图。
聚合函数是什么?例如max()、avg()、count()这些都是,还有很多,详细的以后再写吧。其实就类似于做 exsl时用的函数。
GROUP BY补充
如果需要使用多个字段进行分组,直接在group by 后面写多个字段名 通过逗号分隔
2.2 HAVING
实例
查询每个部门的平均工资,要求平均工资大于2000
SELECT depName,AVG(sal) FROM dep GROUP BY depName HAVING AVG(sal)>=2000;
格式:
SELECT *FROM 表名 WHERE 条件 GROUP BY 分组字段 HAVING 聚合函数
where 后面只能写普通字段的条件,不能写集合函数
having 后面可以写普通字段条件,也可以也聚合函数,但是推荐在
having后面写聚合函数,having写在group by 的后面
2.3 子查询
普通查询 VS 子查询 示例:
查询员工表工资最高的员工信息
普通查询
SELECT MAX(sal) FROM emp;
SELECT * FROM emp WHERE sal=5000; #这里的5000是上一条SQL查询的结果
子查询
SELECT * FROM emp WHERE sal = (SELECT MAX(sal) FROM emp);
Tip:最直观的看出SQL语句少了一条,子查询基本是解决一切的日常问题了。所以学数据库其他内、外连接查询都可以不用会但是子查询必须要熟练。
子查询可写在什么位置?
写在WHERE 或HAVING的后面 当做查询条件的值
写在创建表的时候,把查询结果保持成一张新的表
3. 关联查询
同时查询多张表的数据称为关联查询
示例
查询每一个员工的姓名和对应的部门名称
SELECT e.ename,d.dname
FROM emp e, dept d
WHERE e.deptno=d.deptno;
Tip:这种sql在写的时候比较难在脑子里勾像,我写这种sql的思维是分段写,一上面这个例子为例,我会先把SELECT、FROM 、FROM 这个三个关键字写在三行上,这样再像填空一样去补充完整sql,当我写完这三个关键字我就去读题目,首先是写要查询的字段,将题目要求的信息字段罗列在SELECT的后面,这个过程中我能发现每个字段在哪个表里,这样以来我就明白FROM后面要写几个表(这里的空格直接写别名相当于省略了AS ),写完这个步骤我就知道WHERE 后面要怎么去写条件了。
4. 等值链接、内连接和外链接
在这里说一嘴,学号上面的子查询基本就够用了,不管是等值链接、内连接还是外链接无论什么方法我们的目的都是为了查询到我们想要数据而已。因此他们的作用是一样的,只是告诉你有多种办法实现而已,而且每种实现的难易度也都不一样。
下面我关于这三种办法我只罗列出格式,想试的自己去试吧。
等值链接格式:
SELECT * FROM A,B WHERE A.x=B.x AND A.age = 18;
内连接格式:
SELECT * FROM A JOIN B ON A.x=B.x WHERE A.age=18;
外链接 (左/右外链接):
SELECT * FROM A LEFT/RIGHT JOIN B ON A.x=B.x WHERE A.age=18
Tip:等值链接和内连接查询到的是交集部分数据,外链接查询到的是一张表全部数据+另外一表表的交集数据即,如果想查询的数据为两张表的交集数据使用等值连接或内连接(推荐);如果查询的数据是一张表的全部数据和另外一张表的交集数据则使用外连接