进阶6-连接查询

# 进阶6:连接查询
/*含义:又称为多表查询,当查询的字段来自多个表时,就会用到连接查询笛卡尔乘积现象:表1有 m 行,表2有 n 行,结果= m*n 行发生原因:没有有效的连接条件如何避免:添加有效的连接条件分类:按年代分类:sql92 标准:仅仅支持内连接sql99 标准【推荐】:支持内连接+外连接(左外和右外)+交叉连接按功能分类:内连接:等值连接:非等值连接:自连接:外连接:左外连接:右外连接:全外连接:交叉链接:*/SELECT NAME,boyName FROM boy,beautyWHERE boy.boyfriend_id = beauty.id;#一、sql92标准#1.等值连接/*①:多表等值连接的结果为多表的交集部分②:n 表连接,至少需要 n-1 个连接条件③:多表的顺序没有要求④:一般需要为表起别名⑤:可以搭配前面介绍的所有字句使用,比如排序、分组、筛选*/#案例1:查询女神名和对应的男神名SELECT NAME,boyNameFROM employeesWHERE boy.boyfriend_id = beauty.id;#案例2:查询员工名和对应的部门名SELECT last_name,department_idFROM employees,departmentsWHERE employees.department_id = departments.department_id;#2.为表起别名/*① 提高语句的简洁度② 区分多个重名字段注意:如果为表起了别名,则查询的字段就不能使用原来的表名去限定*/# 查询员工名、工种号、工种名# 无别名SELECT last_name,employees.job_id,job.titleFROM employees,jobsWHERE employees.id = jobs.id;# 有别名SELECT e.last_name,e.job_id,j.titleFROM employees e,jobs jWHERE e.id = j.id;#3.两个表的顺序是否可以做调换(可以)# 查询员工名、工种号、工种名SELECT e.last_name,e.job_id,j.titleFROM jobs j,employees eWHERE e.id = j.id;#4.可以加筛选?#案例1:查询有奖金的员工名和部门名SELECT last_name,department_name,commission_pctFROM employees e,departments dWHERE e.department_id = d.department_idAND e.commission_pct IS NOT NULL;#案例2:查询城市名中第二个字符为 o 的部门名和城市名   SELECT department_name,cityFROM departments d,locations lWHERE d.location_id = l.location_idAND city LIKE '_o%';#5.可以加分组#案例1.查询每个城市的部门个数SELECT COUNT(*) 个数,cityFROM departments d,locations lWHERE d.location_id = l.location_idGROUP BY city;#案例2.查询有奖金的每个部门的部门名和部门的领导编号和该部门的最低工资SELECT department_name,d.manager_id,MIN(salary)FROM departments d,employees eWHERE d.department_id = e.department_idAND commission_pct IS NOT NULLGROUP BY department_name,d.manager_id;#6.可以加排序#案例:查询每个工种的工种名和员工的个数,并按员工的个数降序SELECT job_title,COUNT(*)FROM employees e,jobs jWHERE e.job_id = j.job_idGROUP BY job_titleORDER BY COUNT(*) DESC;#7.可以实现三表连接?#案例:查询员工名、部门名和所在的城市SELECT last_name,department_name,cityFROM employees e,departments d,locations lWHERE e.department_id = d.department_idAND d.location_id = l.location_idAND city LIKE 's%'ORDER BY department_name DESC;#2.非等值连接#案例1:查询员工的工资和工资级别SELECT salary,grade_velelFROM employees e,job_grades jWHERE salary BETWEEN g.lowest_sal AND g.highest_salAND g.grand_level = 'A';SELECT * FROM job_grades;CREATE TABLE job_grades(grade_velel VARCHAR(3),lowest_sal INT,highest_sal INT);INSERT INTO job_gradesVALUE ('A',1000,2999);INSERT INTO job_gradesVALUE ('B',3000,5999);INSERT INTO job_gradesVALUE ('C',6000,9999);INSERT INTO job_gradesVALUE ('D',10000,14999);INSERT INTO job_gradesVALUE ('E',15000,24999);INSERT INTO job_gradesVALUE ('F',25000,40000);#3.自连接#案例:查询员工名和上级的名称SELECT e.employees_id,e.last_name,m.employees_id,m.last_nameFROM employees e,employees mWHERE e.employees = m.employees;#例题1:显示员工表的最大工资、平均工资SELECT MAX(salary),AVG(salary)FROM employees;#例题2:查询员工的 employees_id,job_id,last_name,按照 department_id 升序,salary 降序   SELECT employees_id,job_id,last_name FROM employees ORDER BY department_id DESC,salary ASC;#例题3:查询员工表中的job_id中包含 a 和 e 的,并且 a 在 e 的前面SELECT job_id FROM employees WHERE job_id LIKE '%a%e';#例题4:已知表 student,里面有 id(学号),name,grandId(年级编号)#       已知表 grade,里面有 id(年级编号),name(年纪名)#    已知表 result,里面有 id,score,studentNo(学号)# 要求查询姓名、年级名、成绩SELECT s.name,g.name,r.scoreFROM student s,grade g,result rWHERE s.id = r.studentNo.idAND s.grandId = g.id;#例题5:显示当前日期,以及去前后空格,截取子字符串的函数SELECT NOW();SELECT TRIM(字符串 FROM '');SELECT SUBSTR(str,startIndex);SELECT SUBSTR(str,startIndex,LENGTH);#例题6:查询90号部门员工的job_id和90号部门的locatioin_idSELECT e.job_id,d.location_idFROM employees e,departmrnts dWHERE e.department_id = d.department_idAND e_department_id = 90;#例题7:选择所有有奖金的员工的 last_name,department_name,location_id,citySELECT last_name,department_name,location_id,cityFROM employees e,departments d,locations lWHERE e.department_id = d.department_idAND l.location_id = d.location_idAND commission_pct IS NOT NULL;#例题8:选择 city 在 Toronto 工作的员工的 last_name,job_id,department_id,department_nameSELECT last_name,job_id,d.department_id,department_nameFROM employees e,departments d,locations lWHERE e.department_id = d.department_idAND l.location_id = d.location_idAND city = 'Toronto';#例题9:查询每个工种、每个部门的部门名、工种名和最低工资SELECT department_name,job_title,MIN(salary) 最低工资FROM employees e,departments d,jobs jWHERE e.department_id = d.department_idAND e.job_id = j.job_idGROUP BY department_name,job_title#例题10:查询每个国家下的部门个数大于2的国家编号SELECT country_id,COUNT(*) AS 部门个数FROM employees e,locations lWHERE e.location_id = l.location_idGROUP BY country_id,department_idHAVING COUNT(*) > 2#或者HAVING 部门个数 > 2#不建议#例题11:选择指定员工的姓名,员工号,以及他的管理者的姓名和员工号,结果类似于下面的格式 #   employees       Emp#        manager     Mgr##   kochhar         101     king        100SELECT e.last_name employees,e.employees_id "Emp#",m.last_name manager,m.employees_id "Mgr#"FROM employees e,employees mWHERE m.employees_id = e.manager_idAND last_name = 'kochhar';#二、sql99 语法/*语法:select 查询列表from 表1 别名 【连接类型】join 表2 别名on 连接条件【where 筛选条件】【group by 分组】【having 筛选条件】【order by 排序列表】分类:内连接【※】重要:inner外连接:左外【※】重要:left【outer】右外【※】重要:right【outer】全外:full【outer】交叉连接:cross join*/# 一)内连接/*语法:select 查询列表from 表1 别名inner join 表2 别名on 连接条件;分类:等值:非等值:自连接:特点:①:添加排序,分组,筛选②:inner可以省略③:筛选条件放在 where 后面,连接条件放在 on 后面,提高分离性,便于阅读。④:inner join 连接和 sql92语法中的等值连接效果是一样的,都是查询多表的交集*/#1.等值连接#案例1:查询员工名,部门名(调换位置)SELECT last_name,department_nameFROM employees eINNER JOIN departments dON e.department_id = d.department_id;#案例2:查询名字中包含 e 的员工名和工种名(添加筛选)SELECT last_name,job_titleFROM employees eINNER JOIN jobs jON e.job_id = j.job_idWHERE last_name LIKE '%e%';#案例3:查询部门个数 > 3 的城市名和部门个数,(添加分组和筛选)# ①查询每个城市的部门个数# ②在①结果上筛选满足条件的SELECT city,count(*) 部门个数FROM departments dINNER JOIN locations lON d.location_id = l.location_idGROUP BY cityHAVING COUNT(*) > 3;#案例4:查询哪个部门的部门员工个数 >3 的部门名和部门个数,并按个数降序(添加排序)# ①查询每个员工的员工个数SELECT COUNT(*),department_nameFROM employees eINNER JOIN departments dON e.department_id = d.department_idGROUP BY department_name;# ②在①的结果上筛选员工个数 >3 的记录,并排序SELECT COUNT(*),department_nameFROM employees eINNER JOIN departments dON e.department_id = d.department_idGROUP BY department_name;HAVING COUNT(*) > 3ORDER BY COUNT(*) DESC;            #案例5:查询员工名、部门名、工种名,并按部门名降序(添加三表连接)SELECT last_name,department_name,job_titleFROM employees eINNER JOIN departments d ON e.department_id = d.department_idINNER JOIN jobs j ON e.job_title = j.job_titleORDER BY department_name DESC;#二)非等值连接    #查询员工的工资级别SELECT COUNT(*),grade_levelFROM employees eINNER JOIN job_grades gON e.salary BETWEEN g.lowest_sal AND g.highest_sal;GROUP BY grade_levelHAVING COUNT(*) > 20ORDER BY grader_level DESC;#查询工资级别个数 >2 的个数,并且按工资级别降序   #三)自连接#查询员工的名字,上级的名字SELECT e.last_name,m.last_nameFROM employees eINNER JOIN employees mON e.manager_id = m.employees_id;#查询字符中包含 k 的员工的名字,上级的名字SELECT e.last_name,m.last_nameFROM employees eINNER JOIN employees mON e.manager_id = m.employees_idWHERE e.last_name LIKE '%k%';#二、外连接/*应用场景:用于查询一个表中有,另一个表中没有的记录特点:1.外连接的查询结果为主表中的所有记录如果表中有和它匹配的,则显示匹配的值。如果从表中没有和它匹配的,则显示 null外连接查询结果=内连接查询结果+主表中有而从表中没有的记录2.左外连接:left join 左边的是主表右外连接:right join 右边的是主表3.左外和右外交换两个表的顺序,可以实现同样的效果      4.全外连接=内连接的结果+表 1 中有但表 2 没有的+表 2 中有,但表 1 中没有的*/#引入:查询男朋友  不在男神表的女神名# 左外连接SELECT b.nameFROM beauty bLEFT OUTER JOIN boys boON b.boyfriend_id = bo.idWHERE bo.id IS NULL;UPDATE boys SET userup = NULL WHERE id = 3;  # 右外连接SELECT b.nameFROM boys boRIGHT OUTER JOIN beauty bON b.boyfriend_id = bo.idWHERE bo.id IS NULL;#案例1:查询哪个部门没有员工#左外SELECT d.*,e.employee_idFROM departments dLEFT OUTER JOIN employess eON d.department_id = e.department_idWHERE e.employee_id IS NULL;#右外SELECT d.*,e.employee_idFROM employess eRIGHT OUTER JOIN departments dON d.department_id = e.department_idWHERE e.employee_id IS NULL;#全外:USE girls;SELECT b.*,bo.*FROM beauty bFULL OUTER JOIN boys boON b.boyfriend_id = bo.id;#交叉连接:SELECT b.*,bo.*FROM beauty bCROSS OUTER JOIN boys bo;#一、查询编号 > 3 的女神的男朋友信息,如果有则列出详细信息,如果没有,则用 null 填充SELECT b.id,b.name,bo.*FROM beauty bLEFT OUTER JOIN boys boON b.boyfriend_id = bo.id;#二、查询哪个城市没有部门SELECT cityFROM departments dRIGHT OUTER JOIN locations lON d.location_id = d.location_idWHERE d.department_id IS NULL;#三、查询部门名为 SAL 或者 IT 的员工信息SELECT e.*,d.department_idFROM departments dLEFT JOIN employees eON e.department_id = d.department_idWHERE d.department_name IN ('SAL','IT');      

数据库-进阶6-连接查询相关推荐

  1. 达梦数据库DM8-多表连接查询

    达梦数据库DM8-多表连接查询 系列文章目录 本文环境 1.达梦数据库连接查询介绍 2.交叉连接(cross join)迪卡集 2.1 无过滤条件 2.1 有过滤条件 3.自然连接 4.join... ...

  2. mysql教程详解之多表联合查询_详解数据库多表连接查询的实现方法

    详解数据库多表连接查询的实现方法 通过连接运算符可以实现多个表查询.连接是关系数据库模型的主要特点,也是它区别于其它类型数据库管理系统的一个标志. 在关系数据库管理系统中,表建立时各数据之间的关系不必 ...

  3. 数据库多表连接查询详解

    通过连接运算符可以实现多个表查询.连接是关系数据库模型的主要特点,也是它区别于其它类型数据库管理系统的一个标志. 在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 ...

  4. mysql sql 连接查询语句_Mysql——sql数据库中的连接查询

    1.1.1   交叉连接(CROSS JOIN) 交叉连接(CROSS JOIN):有两种,显式的和隐式的,不带ON子句,返回的是两表的乘积,也叫笛卡尔积. 例如:下面的语句1和语句2的结果是相同的. ...

  5. Oracle数据库多表连接查询操作以及查询操作的补充

    文章目录 一.查询语句概述 1.查询语句基本语法格式 2.伪表和伪劣 二.单表查询 1.select子句 2.FROM子句 3.WHERE子句 4.DISTINCT关键字 5.GROUP BY子句与聚 ...

  6. 1204、基础查询进阶、连接查询

    文章目录 一.基础查询进阶 1.常用函数 1.1 字符函数 1.2 数学函数 1.3 聚集函数 1.4 日期函数 1.5 数学计算的使用 + - \* / % **2.流程控制函数:查询表记录事可以加 ...

  7. 数据库——sql语句 连接查询

    数据库--连接查询 1.定义:同时涉及多个表的查询. 2.连接条件常用格式: [<表名1>]<列名><比较运算符>[<表名2>]<列名2> ...

  8. MySQL查询的进阶操作--连接查询

    目录 概念 连接查询: 含义: 又称多表查询,当查询的字段来自于多个表时,就会用到连接查询.笛卡尔积乘积现象: 表1 有m行,表2 有n行,结果=m*n行. 发生的原因:没有有效的连接条件. 如何避免 ...

  9. oracle数据库 笛卡尔积,Oracle连接查询和笛卡尔积

    一.内连接和外连接 内连接用于返回满足连接条件的记录:而外连接则是内连接的扩展,它不仅会满足连接条件的记录,而且还会返回不满足连接条件的记录,语法如下: select table1.column,ta ...

最新文章

  1. 除了java还学什么_学好Java编程除了努力还需要具备什么?
  2. 为实现流行病预测:联邦政府在疫情暴发建模方面的努力和机遇
  3. SpringBoot快速开发利器:Spring Boot CLI
  4. 软件性能测试过程详解与案例剖析_推荐软件测试书籍
  5. 用C++面向对象的方式动态加载so
  6. (王道408考研数据结构)第七章查找-第一节:查找的基本概念、平均查找长度
  7. 条件编译#define、#undef、#if、#elif、#elif defined、#elif !defined 、#endif用法
  8. FPGA实现VGA显示(五)——————配置ROM测试及图片显示(b)
  9. 炸了炸了~翻译器中的王者,科大讯飞翻译器2.0横空出世!| 钛空智慧星球推荐...
  10. 系分 02 软件工程
  11. Vue之功能全面的表格(二)创建表格
  12. C++(opencv)简单拼接两幅图像
  13. 半监督学习:semi-supervised learning 直推学习:transductive learning 主动学习:active learning
  14. ipad iphone开发_如何在iPhone或iPad上“不信任”计算机
  15. 4.1 行列式的定义
  16. DataFrameDataSet
  17. flume分布式日志收集系统操作
  18. 【Python】爬虫(Xpath):批量爬取彼岸图网4K图(非真正4K)
  19. 外卖跑腿小程序APP定制开发扫码点餐配送
  20. 【加密】各种加密(打乱)易语言代码的sdk代码

热门文章

  1. vue-admin-template默认英文改成中文
  2. 基于单片机的超声波测距
  3. 整理英语句子:将首字母大写,单词之间只能一个空格,最后加句号
  4. html图片快速轮播特效代码,轻松实现javascript图片轮播特效
  5. web前端应对4k屏幕_应对复杂的屏幕
  6. c语言中怎么使用float,float在c语言中怎么用
  7. matlab英文字母对应数字,MATLAB编程:大写英文字母转换成数值(0-25)两种代码
  8. Word中在囗中打勾或打叉的方法介绍
  9. 苹果于近日推送了 iOS 14.5 开发者预览版 Beta
  10. 输出大写英文字母(附带总结)