基础知识点
【各种查询相关的关键字顺序】
SELECT
字段信息FROM
表名WHERE
普通字段条件GROUP BY
分组字段名HAVING
聚合函数条件ORDER BY
排序字段名LIMIT
跳过条数,请求条数;
【子查询(嵌套查询)】
说明:
- 可以将一条
SQL
语句查询的结果当作另外一条SQL
语句条件的值;
示例:
// 1.查询工资大于2号部门平均工资的员工信息: //这是SQL语句1,被嵌套在SQL语句2中: select avg(sal) from emp where dept_id=2; //这是SQL语句2,里面包含了SQL语句1: select * from emp where sal>(select avg(sal) from emp where dept_id=2); // 2.查询工资高于程序员最高工资的员工信息: //这是SQL语句1,被嵌套在SQL语句2中: select max(sal) from emp where job="程序员"; //这是SQL语句2,里面包含了SQL语句1: select * from emp where sal>(select max(sal) from emp where job="程序员"); // 3.查询工资最高的员工信息: select * from emp where sal=(select max(sal) from emp); // 4.查询和孙悟空相同工作的员工信息: select * from emp where job=(select job from emp where name="孙悟空") and name!="孙悟空"; // 5.查询工资最低的员工的同事们的信息(指同一部门) // -得到最低工资(SQL语句1): select min(sal) from emp; // -通过最低工资得到拿最低工资人的部门id(SQL语句2:嵌套SQL语句1): select dept_id from emp where sal=(select min(sal) from emp); // -通过部门id查询员工(SQL语句3:嵌套SQL语句1和SQL语句2): select * from emp where dept_id=(select dept_id from emp where sal=(select min(sal) from emp)) and sal!=(select min(sal) from emp); // 6.查询孙悟空的部门信息(用到dept部门表): //这是SQL语句1,被嵌套在SQL语句2中: select dept_id from emp where name="孙悟空"; //这是SQL语句2,里面包含了SQL语句1: select * from dept where id=(select dept_id from emp where name="孙悟空");
【‘+’、‘-’、‘*’、‘/’ 运算】
说明:
- 可以对查询的字段进行"+“、”-“、”*“、”/”运算;
示例:
// 1. 查询每个员工的姓名,工资和年终奖(年终奖=五个月的工资) select name,sal,sal*5 年终奖 from emp; // 2. 给3号部门所有员工涨薪五块钱 update emp set sal=sal+5 where dept_id=3;
【关联关系】
说明:
- 指创建表时,表和表之间存在的业务关系;
关系种类:
- 一对一:有AB两张表,A表中的一条数据对应B表中的一条数据,同时B表中的一条数据也对应A表中的一条数据;
- 一对多:有AB两张表,A表中的一条数据对应B表中的多条数据,同时B表中的一条数据对应A表中的一条数据;
- 多对多:有AB两张表, A表中的一条数据对应B表中的多条数据,同时B表中的一条数据也对应A表中的多条数据;
建立关系:
- 一对一:可以在两张关系表中任何一个表里面添加建立关系的字段,指向另外一张表的主键;
- 一对多:在一对多的两张表里面的表示"多"的表中添加建立关系的字段指向另外一张表的主键;
- 多对多:需要创建一个单独的关系表,关系表中有两个字段分别指向另外两张表的主键;
【查询多对多表中的数据】
示例:
// 1.创建表: create table student(id int primary key auto_increment,name varchar(50))charset=utf8; create table teacher(id int primary key auto_increment,name varchar(50))charset=utf8; create table t_s(tid int,sid int); // 2.插入数据: insert into teacher values(null,"张三"),(null,"李四"); insert into student values(null,"小明"),(null,"小红"),(null,"小绿"),(null,"小狗"),(null,"小黄"); insert into t_s values(1,1),(1,5),(1,4),(2,2),(2,3),(2,1),(2,5); // 关系1:张三:小明,小黄,小狗; // 关系2:李四:小红,小绿,小明,小黄; // 3.开始实例: // - 查询每个老师名字和对应的学生名字: select t.name,s.name from teacher t join t_s ts on t.id=ts.tid join student s on s.id=ts.sid; // - 查询张三的学生都有谁: select s.name from teacher t join t_s ts on t.id=ts.tid join student s on s.id=ts.sid where t.name="张三"; // - 查询小明的老师是谁: select t.name from teacher t join t_s ts on t.id=ts.tid join student s on s.id=ts.sid where s.name="小明";
关系运算符
【例子】:
// 1.查询工资大于等于3000的员工姓名,工资和工作: select name,sal,job from emp where sal>=3000; // 2.查询1号部门的员工姓名,工资,部门id: select name,sal,dept_id from emp where dept_id=1; // 3.查询程序员的名字和工资: select name,sal from emp where job="程序员"; // 4.查询员工表中不是销售的员工姓名和工作(两种写法): select name,job from emp where job!="销售"; select name,job from emp where job<>"销售";
大于
【符号】:
>
;
大于等于
【符号】:
>=
;
小于
【符号】:
<
;
小于等于
【符号】:
<=
;
等于
【符号】:
=
;
不等于
【符号】:
!=
或<>
;
逻辑运算符
【例子】:
// 1.查询1号部门工资高于2000的员工信息: select * from emp where dept_id=1 and sal>2000; // 2.查询3号部门或工资等于5000的员工信息: select * from emp where dept_id=3 or sal=5000; // 3.查询出CEO和项目经理的名字: select name from emp where job="CEO" or job="项目经理"; // 4.查询有奖金的销售名字和奖金: select name,comm from emp where comm>0 and job="销售";
OR
【说明】:
OR
等效于JAVA
中的||
;- 需要多个条件满足其一时使用;
AND
【说明】
AND
等效于JAVA
中的&&
;- 需要多个条件同时满足时使用;
NOT
【说明】
1.
NOT
等效于JAVA
中的!
;
空空与非空
【例子】:
// 1.查询有上级领导的员工姓名和领导id: select name,manager from emp where manager is not null; // 2.查询没有上级领导的员工姓名和领导id: select name,manager from emp where manager is null;
is null
is not null
范围中选择
between x and y
【说明】:包括
x
和y
;【注意】:
NOT BETWEEN x AND y
;【例子】
// 1.查询工资在2000到3000之间的员工信息: select * from emp where sal>=2000 and sal<=3000; select * from emp where sal between 2000 and 3000; // 2.查询工资在2000到3000之外的员工信息: select * from emp where sal not between 2000 and 3000;
多者中选择
in(x,y,z)
【说明】:当查询的某个字段的值可能为多种值时使用;
【注意】:
NOT IN(x,y,z)
;【例子】
// 1.查询工资等于1500,3000和5000的员工姓名和工资: select name,sal from emp where sal=1500 or sal=3000 or sal=5000; select name,sal from emp where sal in(1500,3000,5000); // 2.查询工作不是销售和程序员的信息: select * from emp where job not in("销售","程序员");
不重复查询
distinct
【说明】:查询内容不会重复;
【例子】
// 1.查询员工表中出现了哪几种不同的工作: select distinct job from emp; // 2.查询员工表中出现了哪几个部门的id: select distinct dept_id from emp;
模糊查询
like
【说明】:
%
:代表零或多个未知字符;_
:仅仅代表一个未知字符;【列举】
- 以"x"开头:
x%
;- 以"x"结尾:
%x
;- 包含"x":
%x%
;- 第二个字符是"x":
_x%
;- 以"x"开头以"y"结尾:
x%y
;【例子】:
// 1.查询姓"孙"的员工信息: select * from emp where name like "孙%"; // 2.查询名字以"精"结尾的员工姓名: select name from emp where name like "%精"; // 3.查询工作中包含销售的员工信息: select * from emp where job like "%销售%"; // 4.查询工作中第二个字是"售"的员工姓名和工作: select name,job from emp where job like "_售%"; // 5.查询名字中包含"僧"并且工资高于2000的员工姓名和工资: select name,sal from emp where name like "%僧%" and sal>2000; // 6.查询1号和2号部门中工作以"市"开头的员工信息: select * from emp where job like "市%" and dept_id in(1,2);
内容排序
ORDER BY 字段名 ASC/DESC
【说明】
- 默认是升序(仅写了"order by 字段名");
"asc"
是升序排序;"desc"
是降序排序;【例子】:
// 1.查询员工姓名和工资,按照工资升序排序: select name,sal from emp order by sal; select name,sal from emp order by sal desc; // 2.查询工资高于2000的员工姓名和工资, 按照工资降序排序: select name,sal from emp where sal>2000 order by sal desc; // 3.查询每个员工的姓名,工资和部门id 按照部门id升序排序,如果部门id一致则按照工资降序: select name,sal,dept_id from emp order by dept_id,sal desc;
分页查询
LIMIT 跳过的条数,请求的条数
【说明】
- 请求的条数 == 每页的条数;
- 跳过的条数 == (请求的页数-1)*每页的条数;
【举例】
查询第一页的5条数据(1-5) limit 0,5;
查询第2页的5条数据(6-10) limit 5,5;
查询第5页的5条数据 limit 20,5;
查询第8页的10条数据 limit 70,10;
查询第7页的8条数据 limit 48,8;
【例子】
// 1.查询工资最低的3个人的信息: select * from emp order by sal limit 0,3; // 2.查询工资最高的员工信息: select * from emp order by sal desc limit 0,1; // 3.按照入职日期排序 查询第2页的3条数据: select * from emp order by hiredate limit 3,3; // 4.按照工资升序排序查询第3页的2条数据: select * from emp order by sal limit 4,2;
使用别名
【问题】
- 好像不能叫别名,应该叫改名吧!!!,设置"别名"后"原名"好像不能用了;
- 推翻第一条:
"select count(*),dept_id id from emp where sal>2000 group by dept_id;"
;
字段原名 AS 字段新名
字段原名 字段新名
聚合函数
【说明】
- 通过聚合函数可以对查询到的多条数据进行统计查询;
【例子】
// 1.查询销售的平均工资: select avg(sal) from emp where job="销售"; // 2.查询程序员的最高工资: select max(sal) from emp where job="程序员"; // 3.查询名字包含精的员工数量: select count(*) from emp where name like "%精%"; // 4.查询和销售相关的工作一个月工资总和: select sum(sal) from emp where job like "%销售%"; // 5.查询2号部门的最高工资和最低工资起别名: select max(sal) 最高工资, min(sal) 最低工资 from emp where dept_id=2;
avg()
【说明】:求平均值;
【例子】
// 查询1号部门的平均工资: select avg(sal) from emp where dept_id=1;
max()
【说明】:求最大值;
【例子】
// 查询1号部门的最高工资: select max(sal) from emp where dept_id=1;
min()
【说明】:求最小值;
【例子】
// 查询1号部门的最低工资: select min(sal) from emp where dept_id=1;
sum()
【说明】:求和;
【例子】
// 查询程序员的工资总和: select sum(sal) from emp where job="程序员";
count()
【说明】:计数;
【注意】:会忽略掉"null"值;
【例子】
// 查询员工表的人数: select count(*) from emp;
分组查询
GROUP BY
【说明】
- 可以将某个字段值相同的数据划分为一组,然后以组为单位进行统计查询;
GROUP BY
语句用于结合聚合函数,根据一个或多个列对结果集进行分组;GROUP BY
一般用于分组统计,它的逻辑就是根据一定的规则,进行分组;【例子】
[数据库:
emp_db
]// 1.查询每个部门的平均工资: select dept_id,avg(sal) from emp group by dept_id; // 2.查询每个部门的最高工资: select dept_id,max(sal) from emp group by dept_id; // 3.查询每种工作的平均工资: select job,avg(sal) from emp group by job; // 4.查询每个部门工资高于2000的人数: select dept_id,count(*) from emp where sal>2000 group by dept_id; // 5.查询每种工作的最低工资: select job,min(sal) from emp group by job; // 6.查询1号部门和2号部门的人数: select dept_id,count(*) from emp where dept_id in(1,2) group by dept_id; // 7.查询平均工资最高的部门id和平均工资: select dept_id,avg(sal) from emp group by dept_id order by avg(sal) desc limit 0,1;
[数据库:
school_db
]SELECT * FROM score GROUP BY s_id;#一个简单的语句,有助于理解分组查询 SELECT * FROM score GROUP BY c_id;#一个简单的语句,有助于理解分组查询
聚合条件
HAVING
【说明】
WHERE
后面只能写普通的字段条件,不能写聚合函数条件;HAVING
后专写聚合函数条件,但须和GROUP BY
结合使用;HAVING
通常与GROUP BY
一起使用,用来过滤分组的结果;- 也就是说:
HAVING
子句可以让我们筛选分组后的各组数据;【例子】
// 1.查询每个部门的平均工资,要求平均工资大于2000: select dept_id,avg(sal) from emp group by dept_id having avg(sal)>2000; select dept_id,avg(sal) a from emp group by dept_id having a>2000; // 2.查询每种工作的人数,只查询人数大于1的: select job,count(*) c from emp group by job having c>1; // 3.查询每个部门的工资总和,只查询有领导的员工, 并且要求工资总和大于5400: select dept_id,sum(sal) s from emp where manager is not null group by dept_id having s>5400; // 4.查询每个部门的平均工资, 只查询工资在1000到3000之间的,并且过滤掉平均工资低于2000的: select dept_id,avg(sal) a from emp where sal between 1000 and 3000 group by dept_id having a>=2000;
关联查询
【说明】
- 同时查询多张表的数据的查询方式称为关联查询;
【使用】
- 如果查询的是多张表的交集数据,则使用等值链接或内连接;
- 如果查询的是一张表的全部和其他表的交集数据使用外连接;
等值连接
【格式】:select * from A,B where 条件 and 条件;
【例子】
// 1.查询每个员工的姓名和对应的部门名: select e.name,d.name from emp e,dept d where e.dept_id=d.id; // 2.查询工资高于2000的员工姓名,工资和部门信息: select e.name,e.sal,d.* from emp e,dept d where e.dept_id=d.id and sal>2000;
内连接
【功能】:内连接和等值连接作用一样,查询到的都是两个表的交集数据,查询不到交集以外的数据;
【格式】:select * from A join B on 关联关系 where 条件;
【例子】
// 1.查询每个员工的姓名和对应的部门名: select e.name,d.name from emp e join dept d on e.dept_id=d.id; // 2.查询工资高于2000的员工姓名,工资和部门信息: select e.name,sal,d.* from emp e join dept d on e.dept_id=d.id where sal>2000;
外连接
【功能】:查询一张表的全部和另外一张表的交集数据;
【分类】:从基本上可以分为: “左外连接"和"右外连接”;
【格式】:select * from A left/right join B on 关联关系 where 条件;
【例子】
// 1.查询所有员工名和对应的部门名: select e.name,d.name from emp e left join dept d on e.dept_id=d.id; // 2.查询所有部门名称,地点和对应的员工姓名和工资,只查询有领导的员工: select d.name,loc,e.name,sal from emp e right join dept d on dept_id=d.id where e.manager is not null;