[toc]
# 一、基本查询
## 1.查询表中多个字段
~~~
select salary,email from employees; //字段之间逗号隔开
~~~
## 2.查询表中的所有字段
~~~
select * from employees;
~~~
## 3.起别名
~~~
//1.使用as
select last_name as 姓,first_name as 名 from employees;
//2.使用空格
select last_name 姓,first_name 名 from employees;
~~~
## 4.去重
~~~
//查询员工表中涉及到的所有部门的编号(关键字:distinct)
select distinct department_id from employees;
~~~
## 5.+号的作用
MySQL中+号仅仅只有一个功能:运算符
~~~
select ‘132’+90; //字符型会试图转成数字型,若转换成功则继续做加法
select ‘Jack’+90; //若转换失败,字符串部分转换为0
select null+10; //只要其中一方为null,结果必为null。(此处需要ifnull(null,0)方法避免结果为null)
~~~
# 二、条件查询
语法
~~~
select 查询列表
from 表名
where 筛选条件;
~~~
## 1.按条件表达式查询
~~~
//查询工资>12000的员工信息
select * from employees where salary>12000;
~~~
## 2.按逻辑表达式筛选
~~~
//查询工资在10000到20000之间的员工信息
select * from employees where salary>=10000 and salary<=20000;
~~~
## 3.模糊查询
~~~
/*like 一般和通配符使用:% 任意多个字符,包含0;_任意单个字符
between ... and ... 在...区间内
in(x,y,z) 在x,y,z这三个值之中
is null 为空
*/
//查询员工名中第二个字符为_的员工名
select last_name
from employees
where last_name like '_$_%' escape '$';
~~~
# 三、分组函数
功能:用作统计使用
分类:sum 求和 ;avg 平均值;max 最大值;min 最小值;count 计算个数
# 四、排序查询
语法
~~~
select 查询列表 from 表名
where 条件
order by 排序的字段 +(asc/desc)
//order by子句在查询语句的最后面,默认为升序
~~~
# 五、常见函数
## limit方法
limit子句用于限制查询结果返回的数量
~~~
limit i,n
i:为查询结果的索引值(默认从0开始);
n:为查询结果返回的数量
注意:limit一般用在SQL语句的最后!!!
~~~
## case函数方法
~~~
//流程控制函数case
1.case函数方法一:类似java里switch case的效果
SELECT salary 原始工资,department_id,
CASE department_id
WHEN 30 THEN salary*1.1
WHEN 40 THEN salary*1.2
WHEN 50 THEN salary*1.3
ELSE salary
END AS 新工资
FROM employees;
~~~
结果如下,注意case是在<b>select和from中间</b>,处在一个比较靠前的位置,注意select上倒数第二个字段要逗号,<b>end as 后面接的才是最后一个字段</b>。还有就是如果when后面接的是字符串一定要加<b>引号</b>。
![](https://box.kancloud.cn/c76fce3b1138ca7bbe22184da98b7049_302x162.png)
~~~
2.case函数方法二:类似if else
//此方法when后面是条件表达式,所以记住case后面什么都不写
SELECT salary,
CASE
WHEN salary>20000 THEN 'A'
WHEN salary>15000 THEN 'B'
WHEN salary>10000 THEN 'C'
ELSE 'D'
END AS 工资级别
FROM employees;
~~~
# 六、分组查询
语法
~~~
select 字段
from 表
【where 筛选条件】
group by 分组字段 【having 筛选条件】
【order by 排序字段】
~~~
## where和having区别
<b>where主要对原始表中的字段进行筛选
having主要对原始表中不存在的字段进行筛选</b>
## 分组查询小技巧
看到<b>“每个”</b>来形容的字段就是要分组的字段
分组查询中,select后面接的字段基本是由<b>两部分</b>组成:
- 1.分组函数如:sum,avg,min,max,count。
- 2.后面要分组的字段,即group by后面接的字段。
# 七、连接查询
## 等值连接查询
~~~
//案例:查询有奖金的员工名、部门名
SELECT last_name,department_name,commission_pct
FROM employees e,departments d
WHERE e.`department_id`=d.`department_id`
AND e.`commission_pct` IS NOT NULL;
~~~
等值查询要给表起别名,这样有利于区分重名的字段,而且提高语句的简洁度。
## 自连接查询
~~~
//查询员工号、名和上级的工号和名。
select e.employee_id,e.first_name,m.employee_id,m.last_name
from employees e,employees m
where e.manager_id = m.employee_id;
~~~
这里的就是同一个表起了两个别名,我们假设第一个表里是员工,第二个表里是上司,然后将两张表按上司和员工的关系连接即可查询到相应的结果。
## sql99查询语法
1.等值查询
~~~
SELECT e.department_id,job_id,location_id
FROM employees e
JOIN departments d
ON e.department_id=d.department_id
WHERE e.department_id=90;
//两个表的等值连接join里写要连接的表,on后面写两张表连接的条件,where后接筛选条件
~~~
2.多表连接
~~~
SELECT j.job_id,j.job_title,department_name,MIN(salary)
FROM employees e
JOIN departments d
ON e.department_id=d.department_id
JOIN jobs j
ON j.job_id=e.job_id
GROUP BY job_id,department_name;
//多表连接的话用多个join和on组合即可实现
~~~
# 八、子查询
## 1.where或having后面
特点:
①子查询放在小括号内 ()
②子查询一般放在条件的右侧 工资>(子查询)
③标量子查询,一般搭配着单行操作符使用
~~~
//1.标量子查询
案例:查询 最低工资大于50号部门最低工资的部门 部门id和其最低工资
①查询50号部门的最低工资
SELECT MIN(salary)
FROM employees
WHERE department_id = 50
②查询每个部门的最低工资
SELECT MIN(salary),department_id
FROM employees
GROUP BY department_id
③ 在②基础上筛选,满足min(salary)>①
SELECT MIN(salary),department_id
FROM employees
GROUP BY department_id
HAVING MIN(salary)>(
SELECT MIN(salary)
FROM employees
WHERE department_id = 50
);
//2.列子查询:只有一列,可以有多行
案例:返回其它部门中比job_id为‘IT_PROG’部门所有工资都低的员工 的员工号、姓名、job_id 以及salary
SELECT last_name,employee_id,job_id,salary
FROM employees
WHERE salary<(
SELECT MIN( salary)
FROM employees
WHERE job_id = 'IT_PROG'
) AND job_id<>'IT_PROG';
//3.行子查询:只有一行,可以多列
案例:查询员工编号最小并且工资最高的员工信息
SELECT *
FROM employees
WHERE (employee_id,salary)=(
SELECT MIN(employee_id),MAX(salary)
FROM employees
);
//注意这里有重点,子查询还可以这样写where(字段1,字段2)=(select 目标1,目标2 from 表名),保证字段和目标一一对应即可。
~~~
## 2.from或者join后面
<b>子查询的结果可以充当一张表,要求必须起别名</b>
~~~
案例:查询各部门中工资比本部门平均工资高的员工的员工号、姓名和工资
SELECT e.employee_id,e.first_name,e.salary
FROM employees e
JOIN (SELECT avg(salary) a, department_id
FROM employees
GROUP BY department_id) d
on e.department_id=d.department_id
WHERE salary>d.a;
//注意这里,就是用子查询建了一个包含平均工资和部门的表,然后按照部门名相同连接起来,再做工资的筛选。
~~~
## 3.where exists后面(相关子查询)
where exists的返回值是0或1,如果子查询存在返回1,否则返回0。
~~~
案例:查询有员工的部门名
SELECT department_name
FROM departments d
WHERE EXISTS(
SELECT *
FROM employees e
WHERE d.`department_id`=e.`department_id`
);
~~~
# 九、联合查询
语法
~~~
查询语句1
union
查询语句2
~~~
应用场景:要查询的结果来自多个表,且多个表没有直接的连接关系,但查询的信息必须一致。
~~~
//引入的案例:查询部门编号>90或邮箱包含a的员工信息
SELECT * FROM employees WHERE email LIKE '%a%'
UNION
SELECT * FROM employees WHERE department_id>90;
~~~
注意点:
1.要求多条查询语句的列数和查询的<b>字段要一致</b>
2.union关键字默认去重,如果使用union all可以包含重复项