mysql 查询模式_MySQL查询方式

4、可以搭配着排序使用,asc升序可以省略,desc降序,

order by子句可以支持 单个字段、别名、表达式、函数、多个字段

二. 连接查询

按年代分类:

sql92标准:仅仅支持内连接

sql99标准【推荐】:支持内连接+外连接(左外和右外)+交叉连接

按功能分类:

内连接:

等值连接

非等值连接

自连接

外连接:

左外连接

右外连接

全外连接

交叉连接

1.  SQL92标准

1. 等值连接

/*① 多表等值连接的结果为多表的交集部分

②n表连接,至少需要n-1个连接条件

③ 多表的顺序没有要求

④可以搭配前面介绍的所有子句使用,比如排序、分组、筛选

⑤可以给表起别名

①提高语句的简洁度

②区分多个重名的字段

注意:如果为表起了别名,则查询的字段就不能使用原来的表名去限定*/例:查询员工名、部门名和所在的城市(三表连接)SELECTlast_name,department_name,cityFROMemployees e,departments d,locations lWHERE e.`department_id`=d.`department_id`AND d.`location_id`=l.`location_id`ORDER BY department_name DESC;

2. 非等值连接

例:查询员工的工资和工资级别(工资范围判断级别)SELECTsalary,grade_levelFROMemployees e,job_grades gWHERE salary BETWEEN g.`lowest_sal` AND g.`highest_sal`;

3. 自连接

例:查询员工名和上级的名称(一张表)SELECTe.employee_id,e.last_name,m.employee_id,m.last_nameFROMemployees e,employees mWHERE e.`manager_id`=m.`employee_id`;

2.  SQL99标准

/*分类:

内连接(★):inner

外连接

左外(★):left 【outer】

右外(★):right 【outer】

全外:full【outer】

交叉连接:cross*/

1. 内连接

/*语法:

select 查询列表

from 表1 别名

inner join 表2 别名

on 连接条件;

【where 筛选条件】

【group by 分组】

【having 筛选条件】

【order by 排序列表】

分类:

等值

非等值

自连接

特点:

①添加排序、分组、筛选

②inner可以省略

③ 筛选条件放在where后面,连接条件放在on后面,提高分离性,便于阅读

④inner join连接和sql92语法中的等值连接效果是一样的,都是查询多表的交集*/

1. 等值连接

例:查询员工名、部门名、工种名,并按部门名降序(添加三表连接)

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 department_name DESC;2. 非等值连接

例:查询工资级别的个数>20的个数,并且按工资级别降序

SELECT COUNT(*),grade_level

FROM employees e

JOIN job_grades g

ON e.`salary` BETWEEN g.`lowest_sal` AND g.`highest_sal`

GROUP BY grade_level

HAVING COUNT(*)>20ORDER BY grade_level DESC;3. 自连接

例:查询姓名中包含字符k的员工的名字、上级的名字

SELECT e.last_name,m.last_name

FROM employees e

JOIN employees m

ON e.`manager_id`=m.`employee_id`

WHERE e.`last_name` LIKE'%k%';

2. 外连接

/*应用场景:用于查询一个表中有,另一个表没有的记录

特点:

1、外连接的查询结果为主表中的所有记录

如果从表中有和它匹配的,则显示匹配的值

如果从表中没有和它匹配的,则显示null

外连接查询结果=内连接结果+主表中有而从表没有的记录

2、左外连接,left join左边的是主表

右外连接,right join右边的是主表

3、左外和右外交换两个表的顺序,可以实现同样的效果

4、全外连接=内连接的结果+表1中有但表2没有的+表2中有但表1没有的*/

1. 左外连接

例:查询哪个部门没有员工

SELECT d.*,e.employee_id

FROM departments d

LEFT OUTER JOIN employees e

ON d.`department_id`=e.`department_id`

WHERE e.`employee_id` IS NULL;2. 右外连接

例:查询哪个部门没有员工

SELECT d.*,e.employee_id

FROM employees e

RIGHT OUTER JOIN departments d

ON d.`department_id`=e.`department_id`

WHERE e.`employee_id` IS NULL;3. 全外

SELECT b.*,bo.*FROM beauty b

FULL OUTER JOIN boys bo

ON b.`boyfriend_id`=bo.id;4. 交叉连接(两表乘机的个数)

SELECT b.*,bo.*FROM beauty b

CROSS JOIN boys bo;

三. 子查询

/*含义:

出现在其他语句中的select语句,称为子查询或内查询

外部的查询语句,称为主查询或外查询

分类:

按子查询出现的位置:

select后面:

仅仅支持标量子查询

from后面:要求必须起别名

支持表子查询

where或having后面:★

标量子查询(单行) √

列子查询 (多行) √

行子查询

exists后面(相关子查询)

表子查询

按结果集的行列数不同:

标量子查询(结果集只有一行一列)

列子查询(结果集只有一列多行)

行子查询(结果集有一行多列)

表子查询(结果集一般为多行多列)*/

1. 标量子查询

例:返回job_id与141号员工相同,salary比143号员工多的员工 姓名,job_id 和工资

#①查询141号员工的job_id

SELECT job_id

FROM employees

WHERE employee_id = 141

#②查询143号员工的salary

SELECT salary

FROM employees

WHERE employee_id = 143

#③查询员工的姓名,job_id 和工资,要求job_id=①并且salary>②

SELECT last_name,job_id,salary

FROM employees

WHERE job_id = (

SELECT job_id

FROM employees

WHERE employee_id = 141

) AND salary>(

SELECT salary

FROM employees

WHERE employee_id = 143

);

2. 列子查询(多行子查询)★

一般搭配着多行操作符使用:in、any/some、all

例:返回其它部门中比job_id为‘IT_PROG’部门所有工资都低的员工 的员工号、姓名、job_id 以及salarySELECTlast_name,employee_id,job_id,salaryFROMemployeesWHERE salary'IT_PROG';

#或SELECTlast_name,employee_id,job_id,salaryFROMemployeesWHERE salary'IT_PROG';

3. 行子查询

例:查询员工编号最小并且工资最高的员工信息SELECT *

FROMemployeesWHERE (employee_id,salary)=(SELECT MIN(employee_id),MAX(salary)FROMemployees

);

四. 分页查询

/*应用场景:当要显示的数据,一页显示不全,需要分页提交sql请求

语法:

select 查询列表

from 表

【join type join 表2

on 连接条件

where 筛选条件

group by 分组字段

having 分组后的筛选

order by 排序的字段】

limit 【offset,】size;

offset要显示条目的起始索引(起始索引从0开始)

size 要显示的条目个数

特点:

①limit语句放在查询语句的最后

②公式

要显示的页数 page,每页的条目数size

select 查询列表

from 表

limit (page-1)*size,size;*/例:查询前五条员工信息SELECT * FROM employees LIMIT 0,5;SELECT * FROM employees LIMIT 5;

五. 联合查询

/*union 联合 合并:将多条查询语句的结果合并成一个结果

语法:

查询语句1

union

查询语句2

union

...

应用场景:

要查询的结果来自于多个表,且多个表没有直接的连接关系,但查询的信息一致时

特点:★

1、要求多条查询语句的查询列数是一致的!

2、要求多条查询语句的查询的每一列的类型和顺序最好一致

3、union关键字默认去重,如果使用union all 可以包含重复项*/例:查询部门编号>90或邮箱包含a的员工信息SELECT * FROM employees WHERE email LIKE '%a%'

UNION

SELECT * FROM employees WHERE department_id>90;

你可能感兴趣的:(mysql,查询模式)