• 博客园logo
  • 会员
  • 周边
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
小禹哥。
博客园    首页    新随笔    联系   管理    订阅  订阅
mysql-sq199语法

mysql-sq199语法

语法

           select  查询列表

           from        表1  别名  【连接类型】

           join          表2  别名

           on           连接条件

          【where      筛选条件】

          【group by  分组】

          【having    筛选条件】

          【order by  排序列表】

分类

内连接(☆):inner

外连接   

              左外(☆):left【outer】

              右外(☆):right【outer】

              全外:  full 【outer】

交叉连接:cross

1.内连接

/*

图解:

 

 语法:

select 查询列表

from 表1 别名

inner join 表2 别名

on  连接条件

分类:

等值连接

非等值连接

自连接

*/

1.1、等值连接

案例1.查询员工名、部门名

SELECT last_name,department_name
FROM departments d 
INNER JOIN employees e
ON e.'department_id' = d.'department_id';

案例2.查询名字中包含e的员工名和工种名(添加筛选)

SELECT last_name,job_tltle
FROM employees e
INNER JOIN jobs j
ON e.'job_id' = j.'job_id'
WHERE e.'last_name' like '%e%';

案例3.查询部门个数>3的城市名和部门个数(添加分组+筛选)

SELECT city,COUNT(*) 部门个数
FROM departments d
INNER JOIN locations l
ON d.'location_id' = l.'location_id'
GROUP BY city
HAVING CONT(*)>3;

案例4.查询哪个部门的员工个数>3的部门名和员工个数,并按个数降序排名(添加排序)

#1.查询每个部门的员工个数
SELECT COUNT(*),department_name
FROM employees e
INNER JOIN departments d
ON e.'department_id'=d.'department_id'
GROUP BY department_name
#2.在1的结果上筛选员工个数>3的记录,并排序
SELECT COUNT(*),department_name
FROM employees e
INNER JOIN departments d
ON e.'department_id'=d.'department_id'
GROUP BY department_name
HAVING COUNT(*)>3
ORDER BY COUNT(*) DESC;

1.2、非等值连接

案例1.查询员工的工资级别

SELECT salary,grade_level
FROM employees e
JOIN job_grades g
ON e.'salary' BETWEEN g.'lowest_sal' AND g.'highest_sal';

案例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(*)>20
ORDER BY grade_level DESC;

1.3、自连接

案例.查询员工的名字、上级的名字

SELECT e.last_name,m.last_name
FROM employees e
JOIN employees m
ON e.'manager_id' = m.'employee_id';

2.外连接

/*

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

特点:

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

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

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

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

b.左外连接,left  join 左边的是主表

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

c.左外和右外交换两个表的顺序,实现同样的效果

d.全外连接=内连接的结果+表1中有但表2没有的+表2中有但表1没有的

*/

2.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.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;

2.3、全外连接

图解:

 

 说明:返回左右表的所有行。哪个表中没有的就用null填充。

关键字:MySQL不支持全外连接,所以只能采取关键字UNION来联合左、右连接

3.交差连接

说明:没有where条件的交叉连接中,产生连接表就是笛卡尔积。将两个表的所有行进行组合,连接后的行数为两个表的行数的乘积数。
关键字:cross join

SELECT  * 
FROM a_table 
CROSS JOIN b_table; 
#等价于:
SELECT * 
FROM a_table, b_table;

 

posted on 2020-03-27 17:57  小禹爸爸  阅读(188)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3