(十)mysql语法-连接查询


#非等值连接查询
#案例1:查询员工的工资和工资级别
select a.salary,b.grade_level from employees a,job_grades b
where a.salary BETWEEN b.lowest_sal and b.highest_sal;

#自连接;简单的理解就是自己连接自己进行查询
#查询员工名和上级的名称 这种情况说明是这张表中有一些比较特殊的字段,一共查询了这张表两遍 一张表当做两张表来使用,有些情况下,甚至当作更多张表来使用,分别当作了员工表和领导表
SELECT a.employee_id,a.last_name,b.manager_id,b.last_name FROM employees a,employees b where a.employee_id=b.manager_id;
SELECT a.employee_id,a.last_name,b.employee_id,b.last_name FROM employees a,employees b where a.employee_id=b.manager_id;--这两种写法,查询出来的效果是一样的

#获取随机数
select RAND();--返回0-1之间的随机数

#password函数 将给定的字符进行加密
select PASSWORD('赵永强');--结果:*7B24462CC76FA0D6E59A26F942D0C8B46F31F533
#MD5函数,将给定的字符进行MD5加密
select MD5('赵永强');--结果:8983fb3e10bd6c6817f6e7d128c67276

#sql99语法标准
语法: select 查询列表
from 表1 别名 【连接类型】
join 表2 别名
on 连接条件
where 筛选条件
分类:
内连接:inner
外连接:
左外连接 left [OUTER]
右外连接 right [OUTER]
全外连接 full [OUTER]
交叉连接:cross
#等值连接
@案例一:查询员工名、部门名
select a.last_name,b.department_name
from employees a
INNER JOIN departments b
on a.department_id=b.department_id

SELECT a.last_name,b.department_name from employees a , departments b where a.department_id=b.department_id;--这两种写法的查询出来的效果是一样的

@案例二:查询名字中包含e的员工名和工种名
select a.last_name,b.job_title
from employees a
INNER JOIN jobs b
on a.job_id=b.job_id
where a.last_name like '%e%';

select a.last_name,b.job_title from employees a,jobs b where a.job_id=b.job_id AND a.last_name like '%e%';--这两种写法的查询出来的效果是一样的


#查询部门个数>3的城市名和部门个数(添加分组和筛选)
select b.city,count(*)
from departments a
INNER JOIN locations b
ON a.location_id=b.location_id
GROUP BY b.city
HAVING count(*)>3;

#案例4:查询哪个部门的盐工个数大于3的部门名和员工个数,并按照个数降序排列
select count(*) 个数,department_name
from employees a
JOIN departments b
on a.department_id=b.department_id
GROUP BY department_name
HAVING count(*)>3
ORDER BY count(*) desc;

#5.查询员工名,部门名、工种名,并按照部门名进行降序排列(添加三表连接)
select last_name,department_name,job_title
from employees a
INNER JOIN departments b on a.department_id=b.department_id
INNER JOIN jobs c on a.job_id=c.job_id
ORDER BY department_name desc;

------其实上面所有的inner都是可以省略的,筛选条件放在where 后面,连接条件放在on后面 ,便于阅读
#非等值连接
#查询员工的工资级别
select a.salary,b.grade_level from employees a INNER JOIN job_grades b on a.salary BETWEEN b.lowest_sal and b.highest_sal

#查询工资级别的个数》20的个数,并按照工资级别进行降序排列
select count(*),b.grade_level from employees a INNER JOIN job_grades b on a.salary BETWEEN b.lowest_sal and b.highest_sal
GROUP BY b.grade_level desc
HAVING count(*)>20

#自连接
#查询名字中包含字符k的员工姓名、上级的名字
select a.last_name,b.last_name from employees a INNER JOIN employees b on a.employee_id = b.manager_id
WHERE a.last_name like '%k%'

原文地址:https://www.cnblogs.com/dongyaotou/p/12317279.html