一.查询语句
1.基础查询
1.查询表中某一字段:select 字段名 from 表名;
2.查询表中多个字段:select 字段名,字段名 from 表名; (字段名用逗号隔开)
3.查询表中所有字段: select * from 表名
2.进阶查询
select 字段名 from 表名 where 筛选条件;
筛选条件大致有如下这些,其中
1.<>表示的是不等于
2.通配符:
① %:表示可以匹配任意多个字符包括0个
② _:表示可以匹配的任意一个字符
③ \:表示转字字符
注意:ESCAPE ‘X’可以用来自定义转义字符,比如 where name like ‘$‘;,这个句子表示把$定义为转义字符,那么这句的条件是 第二个字符为x第一个字符任意的数据
3.
- like xx:表示查询的字段值里有xx表达式所表示的内容
- between xx and yy:在xx和yy之间
- in [‘xx’,’yy’]:和参数列表中字符串格式完全相同的值
- is null :判断是否为空 (=和<>不能判断null)
- <=>null:安全等于(可读性差,既可以判断null也可以判断普通数值)
3.排序查询
语法
select xx from 表名 where 筛选条件 order by 排序列表 [asc|desc]
order by x1 ASC,x2 DESC 表示按照x1升序再按照x2降序
特点:
- 支持按照多字段排序
- 默认升序(ASC)
- 排序列表内可以放表达式,函数,单个字段,多个字段
4.分组查询
作用:将表中的数据按照不同类型分组(比如相同部门中的最高工资)
语法:
select 分组函数,列(要求出现在group by的后面)
from 表
【where 筛选条件】
group by (可以放多个字段)分组的列表
【having 分组后的筛选】
【order by 子句】
注:sql语句的顺序有严格要求,不要自己随便写
案例:查询邮箱中包含a字符的,每个部门的平均工资
group by会把department_id相同的人的数据整合在一起
SELECT
AVG(salary),
department_id
FROM
employees
WHERE email LIKE '%a%'
GROUP BY department_id ;
having的用法:
添加分组后的筛选用having,分组前的用where
举例:查询每个工种有奖金的员工的最高工资>12000的工种编号和最高工资
SELECT
MAX(salary) AS 最高工资,
job_id
FROM
employees
WHERE commission_pct IS NOT NULL
GROUP BY job_id
HAVING 最高工资 > 12000 ;#已经按照id对最高工资进行分组了,然后再用having进行分组后的帅选
- 分组查询支持多个字段,两个字段要对应的时候分为一组
5.连接查询
关于连接查询可以看这个链接中的例子会更直观
含义:又称多表查询,当查询的字段来自于多个表时,就会用到连接查询
一.内连接
一.sql192标准
注1:当没有有效连接(比如没有条件的时候)的时候会发生笛卡尔乘积现象
注2:可以通过表名.字段名的形式来具体定义
等值连接(有个等号)
案例一:匹配女生对应的男朋友(等值连接)SELECT NAME, boyname FROM boys, beauty WHERE beauty.boyfriend_id = boys.id ;
非等值连接(不相等)
案例二:查询员工的工资和工资级别SELECT salary, grade_level FROM employees e, job_grades g WHERE salary BETWEEN g.lowest_sal AND g.highest_sal ;
自连接(自己的表连接自己)
案例三:查询员工名和上级的名称SELECT e.employee_id, e.last_name, m.employee_id, m.last_name FROM employees e, employees m WHERE e.`manager_id` = m.`employee_id` ;
二.sql99语法
* 注2:连接查询必须两张表有相同元素然后以相同元素为连接条件进行连接表(没有的话得用联合查询) *
注1:这里on和where的作用是on先进行一次筛选再进行where筛选
- 1、 on条件(连接条件)是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。
- 2、where条件(过滤条件)是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。
- inner(两表交集)
注:用inner进行多表查询的时候连接条件是有顺序要求的
案例一:查询名字中包含e的给员工名和工种名
案例二:(多表查询)SELECT last_name, job_title FROM employees e INNER JOIN jobs j ON e.`job_id` = j.`job_id` WHERE last_name LIKE "%e%" ;
注:on的连接条件必须要带上当前插入表的数据SELECT last_name, department_name, job_title FROM employees e INNER JOIN departments d ON e.`department_id` = d.`department_id` INNER JOIN jobs j ON e.`job_id` = j.`job_id` ORDER BY d.`department_id` DESC ;
* 非等值连接(改一下on的条件即可)
案例:
```SQL
SELECT
salary,
grade_level
FROM
employees e
INNER JOIN job_grades g
ON e.`salary` BETWEEN g.`lowest_sal`
AND g.`highest_sal` ;
- 自连接(同理略)
二.外连接
- 左外连接(join左边为主表,和从表没有匹配的数据值为null)
案例一:查询没有男朋友的女神名
结果:SELECT b.name, bo.* FROM beauty b LEFT JOIN boys bo ON b.boyfriend_id = bo.id WHERE bo.`id` IS NULL ; #on条件连接女神男朋友,有匹配就连接,没有就NULL # a LEFT JOIN B, A在左B在右
- 右外连接(同理略)
- 全外连接(略)
6.子查询
案例1:查询员工编号最少并且工资最高的员工信息(where多个条件)
SELECT
*
FROM
employees
WHERE (employee_id, salary) =
(SELECT
MIN(employee_id),
MAX(salary)
FROM
employees) ;
7.分页查询
应用场景:当要显示的数据,一页显示不全,需要分页提交sql请求
语法(重点在limit):
select 查询列表
from 表
【join type】 join 表2
on 连接条件
where 筛选条件
group by 分组字段
having 分组后的筛选
order by 排序的字段】
limit offset,size;
offset:要显示条目的起始索引(从0开始)
size:要显示的条目个数
公式:
要显示的页数page,每页的条目数size
select 查询列表
from 表
limit (page - 1) size, size;*
案例1:查询第11条-第25条
8.联合查询
union:联合,合并,将多条查询语句的结果合并成一个结果
注:结果集的字段名按照前者的来选,两个表的元素的是一一对应关系,比如name就插在boyname后面,如果把name和id对换的话就会变成id插在boyname下面
案例:把女生和男生和id和名字分别在同一列输出
SELECT id,boyName
FROM boys
UNION SELECT id,NAME
FROM beauty;
10. 查询总结
语法(包括代码的执行顺序):
语法:
select 查询列表 7
from 表1 别名 1
连接类型 join 表2 2
on 连接条件 3
where 筛选 4
group by 分组列表 5
having 筛选 6
order by 排序列表 8
limit 排序列表 9