多表连接

#多表查询
/*
sql99标准
等值连接
①多表等值连接的结果为多表的交集部分
② n个连接至少需要 n-1个连接
③一般需要为表起别名
④可以搭配前面介绍的所有子句的使用,比如排序,分组,筛选
*/ -- 1.查询有奖金的员工名,部门名
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; -- 2.查询城市中第二个字符为o的部门和城市
SELECT department_name,city
FROM departments d,locations l
WHERE d.`location_id` = l.`location_id`
AND city LIKE '%_o%'; -- 3.查询每个城市的部门个数
SELECT COUNT(*) 个数,city
FROM departments d,locations l
WHERE d.`location_id` = l.`location_id`
GROUP BY city; -- 4.查询出有奖金的每个部门的部门名和部门领导的领导编号和该部门的最低工资
SELECT d.department_name,d.manager_id,MIN(salary)
FROM departments d,employees e
WHERE d.`department_id` = e.`department_id`
AND commission_pct IS NOT NULL
GROUP BY d.department_name,d.manager_id; -- 查询每个员工的工种的工作名和员工的个数,并且按员工的个数降序
SELECT job_title,COUNT(*)
FROM employees e ,jobs j
WHERE e.`job_id` = j.`job_id`
GROUP BY job_title
ORDER BY COUNT(*); #实现三表连接 -- 查询员工名,部门名和所在的城市
SELECT last_name,department_name,city
FROM employees e,departments d,locations l
WHERE e.`department_id` = d.`department_id`
AND d.`location_id` = l.`location_id`
AND city LIKE '%s%';

datediff:返回两个日期相差的天数

#自连接
-- 查询员工名和上级的名称
SELECT e.employee_id,e.last_name,m.employee_id 上级id,m.last_name AS 上级名字
FROM employees e,employees m
WHERE e.`manager_id` = m.`employee_id`; -- 查询每个工种,每个部门的部门名和最低工资
SELECT department_name,job_title,MIN(salary)最低工资
FROM employees e,departments d,jobs j
WHERE e.`department_id` = d.`department_id`
AND e.`job_id` = j.`job_id`
GROUP BY department_name,job_title; -- 查询每个国家下的部门个数大于2的国家编号
SELECT country_id,COUNT(*)部门个数
FROM departments d,locations l
WHERE d.`location_id` = l.`location_id`
GROUP BY country_id
HAVING COUNT(*)>2; /*sql99语法
select 查询列表
from 表1 别名 连接类型
join 表2 别名 on 连接条件
where 筛选条件
group by 分组
Having 筛选条件
order by 排序列表 分类:
内连接:inne
外连接:
左外:letf
右外:right
全外:full
交叉连接: cross 特点: 添加排序,分组,筛选
inner可以省略
筛选条件放在where后面,连接条件放在on后面,提高分离性
inner连接和sql192的效果一样的,同样都是查询多表的交集
*/ -- 查询员工名,部门名
SELECT last_name,department_name
FROM employees e INNER JOIN departments d
ON e.`department_id` = d.`department_id`; -- 查询名字中包含e的员工名和工种名()
SELECT last_name,job_title
FROM employees e INNER JOIN jobs j
ON e.`job_id` = j.`job_id`
WHERE e.`last_name` LIKE '%e%'; -- 查询部门个数>3的城市名和部门个数,添加分组+筛选
SELECT city,COUNT(*) 部门个数
FROM departments d INNER JOIN locations l
ON d.`location_id` = l.`location_id`
GROUP BY city
HAVING COUNT(*)>3; -- 查询那个部门的部门员工数>3的部门名和员工个数,并按个数降序
SELECT department_name,COUNT(*) 员工个数
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; #三表连接 -- 查询员工名,部门名,工种名,并按部门名降序
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 j.`job_id` = e.job_id
ORDER BY department_name DESC;
-- 左外连接,left join左边的是主表
-- 右外连接,right join右边的是主表
-- mysql不支持全外连接 #交叉连接也就是sql99语法的笛卡尔乘积
SELECT b.*,boo.*
FROM beauty b
CROSS JOIN boy bo; -- 查询那个城市没有部门 城市为主表
SELECT city
FROM departments d RIGHT JOIN locations l
ON d.`location_id` = l.`location_id`
WHERE d.`department_id` IS NULL; -- 查询部门名为sal或it的员工信息 部门一定有的员工可能没有 部门为主表
SELECT e.*,department_name
FROM departments d LEFT JOIN employees e
ON d.`department_id` = e.`department_id`
WHERE d.`department_name` IN('SAL','IT');
#子查询(内查询):出现在其他语句中的select
-- 查询谁的工资比Abel的工资
SELECT *
FROM employees
WHERE salary>(SELECT salary
FROM employees
WHERE last_name = 'Abel'
); -- 查询job_id与141号员工相同,salary比143号员工多的员工姓名,job_id和工资
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
); #多行子查询 操作符 IN / NOT IN 等于列表中的任意一个
# ANY / SOME 和子查询返回的某一个值比较
# ALL 和子查询返回的所有值比较 -- 返回location_id是1400或1700的部门中所有员工的姓名
SELECT last_name
FROM employees
WHERE department_id IN (SELECT DISTINCT department_id
FROM departments
WHERE location_id IN(1400,1700)
); -- 返回其他部门中比job_id为IT_PROG部门任一工资低的员工的员工号,姓名,job_id以及salary
SELECT employee_id,last_name,salary
FROM employees
WHERE salary<ANY(SELECT salary
FROM employees
WHERE job_id = 'IT_PROG'
)AND job_id<>'IT_PROG';
-- 或者
SELECT employee_id,last_name,salary
FROM employees
WHERE salary<(SELECT MAX(salary)
FROM employees
WHERE job_id = 'IT_PROG'
)AND job_id<>'IT_PROG'; -- 返回其他部门中比job_id为IT_PROG部门所有工资低的员工的员工号,姓名,job_id以及salary
SELECT employee_id,last_name,salary
FROM employees
WHERE salary<ALL(SELECT salary
FROM employees
WHERE job_id = 'IT_PROG'
)AND job_id<>'IT_PROG';
-- 或者
SELECT employee_id,last_name,salary
FROM employees
WHERE salary<(SELECT MIN(salary)
FROM employees
WHERE job_id = 'IT_PROG'
)AND job_id<>'IT_PROG'; -- 查询员工编号最小并且工资最高的员工信息
SELECT *
FROM employees
WHERE employee_id = (SELECT MIN(employee_id)
FROM employees
)AND salary = (SELECT MAX(salary)
FROM employees
);
-- 或者
SELECT *
FROM employees
WHERE (employee_id,salary) = (SELECT MIN(employee_id),MAX(salary)
FROM employees);
# 分页查询
/*
select 查询列表
from 表
limit(page-1)*size,size;
*/ -- 查询所有学员的邮箱用户名(邮箱中@前面的字符)
SELECT SUBSTRING(email,1,INSTR(eamil,,'@')-1) 用户名
FROM stuinfo; -- 2.查询平均工资最低的部门信息
-- MIN MIN AVG 等不能互相嵌套
SELECT *
FROM departments
WHERE department_id =(SELECT department_id
FROM employees
GROUP BY department_id
HAVING AVG(salary)=(SELECT MIN(ag)
FROM((SELECT AVG(salary) ag
FROM employees
GROUP BY department_id)
) AS a
)
); -- 简洁的方法二
SELECT *
FROM departments
WHERE department_id =(SELECT department_id
FROM employees
GROUP BY department_id
ORDER BY AVG(salary)
LIMIT 1 -- 升序排序之后选择第一页第一个
); -- 得到的也就是最小值 -- 2.查询平均工资的最低的部门信息和该部门的品均工资
SELECT AVG(salary)
FROM employees
GROUP BY department_id
LIMIT 1; -- 平均工资最低的部门编号,作为新的表连接
SELECT AVG(salary),department_id
FROM employees
GROUP BY department_id
ORDER BY AVG(salary)
LIMIT 1;
--
SELECT d.*,ag
FROM departments d
JOIN (SELECT AVG(salary) ag,department_id
FROM employees
GROUP BY department_id
ORDER BY AVG(salary)
LIMIT 1) AS a
ON d.`department_id` = a.department_id; -- 3.查询平均工资最高的job信息
SELECT *
FROM jobs
WHERE job_id =
(SELECT job_id
FROM employees
GROUP BY job_id
ORDER BY AVG(salary) DESC
LIMIT 1); -- 4.查询平均工资高于公司平均工资的部门有哪些
SELECT department_id
FROM employees
GROUP BY department_id
HAVING AVG(salary)>(
SELECT AVG(salary)
FROM employees); -- 5.查询出公司中所有manager的详细信息
SELECT *
FROM employees
WHERE employee_id = ANY(
SELECT DISTINCT manager_id
FROM employees ); -- 6.各部门中,最高工资中最低的那个部门的,最低工资是多少
-- 每个部门最高工资比较后 得到的 最低的工资和对应的部门号
SELECT MAX(salary), department_id
FROM employees
GROUP BY department_id
ORDER BY MAX(salary)
LIMIT 1; SELECT MIN(salary)
FROM employees
WHERE department_id = (SELECT department_id
FROM employees
GROUP BY department_id
ORDER BY MAX(salary)
LIMIT 1); -- 7.查询平均工资最高的部门的manager的详细信息:last_name,department_id,email,salary
SELECT *
FROM employees e JOIN departments d
ON e.`employee_id` = d.`manager_id`
WHERE d.`department_id` = (SELECT department_id
FROM employees
GROUP BY department_id
ORDER BY AVG(salary) DESC
LIMIT 1);
#联合查询
/*union 联合 合并:将多条查询语句的结果合并成一个结果
语法:
查询语句1
union
查询语句2
union
...
应用场景:要查询的结果来自于多个表,且多个表没有直接的连接关系,
但查询的信息一致时 特点:①要求多条哈讯语句的查询列数一致
②要求多条查询语句的查询的每一列的类型和顺序最好一致
③union关键字默认去重,如果使用union all可以包含重复项
*/

Mysql基础(二)的更多相关文章

  1. 02 mysql 基础二 (进阶)

    mysql 基础二 阶段一 表约束 1.not null 非空约束 例子: create table tb1( id int, name varchar(20) not null ); 注意 空字符不 ...

  2. MySQL基础二

    视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当作表来使用. SELECT * FROM ( SEL ...

  3. MySQL 基础二 创建表格

    1.界面创建 2.SQL创建 教程地址:http://blog.csdn.net/brucexia/article/details/53738596 提供学习视频下载 链接:http://pan.ba ...

  4. MySQL基础(二)——DDL语句

    MySQL基础(二)--DDL语句 1.什么是DDL语句,以及DDL语句的作用 DDL语句时操作数据库对象的语句,这些操作包括create.drop.alter(创建.删除.修改)数据库对象. 2.基 ...

  5. { MySQL基础数据类型}一 介绍 二 数值类型 三 日期类型 四 字符串类型 五 枚举类型与集合类型

    MySQL基础数据类型 阅读目录 一 介绍 二 数值类型 三 日期类型 四 字符串类型 五 枚举类型与集合类型 一 介绍 存储引擎决定了表的类型,而表内存放的数据也要有不同的类型,每种数据类型都有自己 ...

  6. MySQL基础操作(二)

    MySQL基础操作 一.视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当作表来使用.注意:使用视图时 ...

  7. MYSQL基础笔记(二)-SQL基本操作

    SQL基本操作 基本操作:CRUD,增删改查 将SQL的基本操作根据操作对象进行分类: 1.库操作 2.表操作 3.数据操作 库操作: 对数据库的增删改查 新增数据库: 基本语法: Create da ...

  8. mysql基础知识语法汇总整理(二)

    mysql基础知识语法汇总整理(一) insert /*insert*/ insert into 表名(字段列表) values(值列表); --蠕虫复制 (优点:快速复制数据,测试服务器压力) in ...

  9. MySQL基础知识

    一.MySQL安装 MySQL的下载 http://dev.mysql.com/downloads/mysql/ MySQL版本选择 MySQL功能自定义选择安装 1.功能自定义选择 2.路径自定义选 ...

随机推荐

  1. C++11的mutex和lock_guard,muduo的MutexLock 与MutexLockGuard

    互斥锁是用来保护一段临界区的,它可以保证某段时间内只有一个线程在执行一段代码或者访问某个资源. C++11的mutex和lock_guard C++11新增了mutex,使用方法和linux底下的常用 ...

  2. CentOS-6.5操作系统安装

    1.创建Linux虚拟机(如图所示) 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 1.10 1.11 1.12 1.13 1.14 1.15 1.16 1.17 1.18 ...

  3. matlab-均值滤波

    均值滤波 主要思想为邻域平均法,即用几个像素灰度的平均值来代替每个像素的灰度.有效抑制加性噪声.缺点:容易引起图像模糊,可以对其进行改进,主要避开对景物边缘的平滑处理. 均值滤波器的缺点是存在着边缘模 ...

  4. Tomcat服务器的下载与安装,修改端口号

    安装及简单配置Tomcat服务器: 1.登录www.apache.org 网站,之后点击Projects , 点击Project List,找到Tomcat. 2.点击Tomcat之后,之后进入Tom ...

  5. [whu1564]后缀数组

    http://acm.whu.edu.cn/land/problem/detail?problem_id=1564 思路:先把串复制一遍,在末尾补个标记,后缀数组跑一下,扫一遍就ok了(过滤后缀在后半 ...

  6. Linux --remote (ssh and VNC)

    远程管理 与个人计算机不同,服务器一般都是运行IDC机房中,所以我们通常不会接触到服务器硬件,而是通过各种远程管理方式对服务器进行控制. 常见的远程管理工具方式: -RDP(remote deskto ...

  7. window 10电脑永不熄屏的方法

    你的电脑是不是人还没有离开一会儿,经常锁屏,输入密码??反复反复,特别的折磨人,别急,下面我教你,告别反复,从此我的电脑我做主. 第一步,打开设置,进入个性化界面,点击锁屏界面,往下滑 第二步,找到屏 ...

  8. Vuser发生器

    一.脚本开发过程: 1.计划:收集测试信息,整理业务逻辑,制定测试计划 2.录制脚本: 新建脚本---选择脚本协议(单协议脚本:多协议脚本:最近使用过协议)选择协议---开始录制脚本 脚本录制时,Vu ...

  9. 漫谈Huawei LiteOS五大内核模块

    [摘要]Huawei LiteOS是华为面向IoT领域,构建的“统一物联网操作系统和中间件软件平台”,以轻量级(内核小于10k).低功耗(1节5号电池最多可以工作5年),快速启动,互联互通,安全等关键 ...

  10. python实现简单投资复利函数以及实现摇骰子猜大小函数

    复利函数: #!/user/bin/env python #-*-coding:utf-8 -*- #Author: qinjiaxi def invest(amount, rate, time): ...