Bootstrap

【MySQL使用】数据查询(01)-最终版

基础知识点

【各种查询相关的关键字顺序】

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

【说明】:

  1. OR等效于JAVA中的||
  2. 需要多个条件满足其一时使用;

AND

【说明】

  1. AND等效于JAVA中的&&
  2. 需要多个条件同时满足时使用;

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

【说明】:包括xy

【注意】: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

【说明】:

  1. %:代表零或多个未知字符;
  2. _:仅仅代表一个未知字符;

【列举】

  1. 以"x"开头:x%
  2. 以"x"结尾:%x
  3. 包含"x":%x%
  4. 第二个字符是"x":_x%
  5. 以"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

【说明】

  1. 默认是升序(仅写了"order by 字段名");
  2. "asc"是升序排序;
  3. "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. 请求的条数 == 每页的条数;
  2. 跳过的条数 == (请求的页数-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; 

使用别名

【问题】

  1. 好像不能叫别名,应该叫改名吧!!!,设置"别名"后"原名"好像不能用了;
  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

【说明】

  1. WHERE后面只能写普通的字段条件,不能写聚合函数条件;
  2. HAVING后专写聚合函数条件,但须和GROUP BY结合使用;
  3. HAVING通常与GROUP BY一起使用,用来过滤分组的结果;
  4. 也就是说: 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;

关联查询

【说明】

  • 同时查询多张表的数据的查询方式称为关联查询;

【使用】

  1. 如果查询的是多张表的交集数据,则使用等值链接或内连接;
  2. 如果查询的是一张表的全部和其他表的交集数据使用外连接;

等值连接

【格式】: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;
;