返回顶部
首页 > 资讯 > 数据库 >SQL 基础之多表查询(十)
  • 490
分享到

SQL 基础之多表查询(十)

2024-04-02 19:04:59 490人浏览 独家记忆
摘要

JOINS 类型和它的语法Natural joins(自然连接):– NATURAL JOIN 子句– USING 子句– ON 子句自连接  非等值连接  Outer joi

JOINS 类型和它的语法

Natural joins(自然连接):

– NATURAL JOIN 子句

– USING 子句

– ON 子句


自连接

  非等值连接

  

Outer joins(外连接):

– LEFT OUTER JOIN(左外连接)

– RIGHT OUTER JOIN(右外连接)

– FULL OUTER JOIN(全外连接)


笛卡尔积

– Cross join(交叉连接)


语法:

select table1.column, table2.column

from table1

[natural join table2] |

[join table2 using (column_name)] |

[join table2

on (table1.column_name = table2.column_name)]|

[left|right|full outer join table2

on (table1.column_name = table2.column_name)]|

[cross join table2];


限制重复的列名

  • 在多表中使用表前缀限制列名

  • 使用表前缀可以提高效率

  • 使用表别名代替全表名前缀

  • 表别名提供一个较短的名称:

    – sql代码量更少,使用较少的内存

  • 在不同表中具有相同列名的列可以用别名加以区分


创建自然连接

  • NATURAL JOIN子句,会以两个表中具有相同名字的列为条件 创建等值连接。

  • 在表中查询满足等值条件的数据。

  • 如果只是列名相同而数据类型不同,则会产生错误。

  • 如果多个列名符合,都会做为条件。


1、查询department_id 和department_name 在哪些城市

select department_id,department_name, location_id,city from departments natural join locations;

SQL 基础之多表查询(十)


使用 USING 子句创建连接

  • 如果多个列具有相同的名称,但自然连接的数据类型又不匹配,则可以使用using子句来指定,使用一 个等值的列

  • 当有多个列匹配时,用using子句匹配唯一的列

  • NATURAL JOIN 和 USING 子句互斥

  • 不要给选中的列中加上表名前缀或别名


1、查询employee_id,last_name,location_id 从员工表,并且使用department_id为指定键值

select employee_id, last_name,location_id, department_id from employees join departments using (department_id);

SQL 基础之多表查询(十)


ON 子句创建连接

  • 自然连接中是以具有相同名字的列为连接条件的    

  • 使用ON子句指定要连接任意条件或指定列连接条件

  • 这个连接条件是与其它条件分开的

  • ON 子句使语句具有更高的易读性


1、查找employees和 的departments 两张表员工信息,并按照department_id为条件

select e.employee_id, e.last_name, e.department_id, d.department_id, d.location_id from employees e join departments d on (e.department_id = d.department_id);

SQL 基础之多表查询(十)


使用AND子句或WHERE子句适用附加条件: 查询manager_id为149的

select e.employee_id, e.last_name, e.department_id,

d.department_id, d.location_id

from employees e join departments d

on (e.department_id = d.department_id)

and e.manager_id = 149;

SQL 基础之多表查询(十)

或者

select e.employee_id, e.last_name, e.department_id,

d.department_id, d.location_id

from employees e join departments d

on (e.department_id = d.department_id)

where e.manager_id = 149 ;

SQL 基础之多表查询(十)


使用 ON 子句自连接

使用条件 WORKER 表 表 MANAGER_ID 等于MANAGER 的EMPLOYEE_ID

select worker.last_name emp, manager.last_name mgr

from employees worker join employees manager

on (worker.manager_id = manager.employee_id);


非等值连接

select e.last_name, e.salary, j.grade_level

from employees e join job_grades j

on e.salary

between j.lowest_sal and j.highest_sal;


使用外连接返回没有直接匹配的记录

  • 在SQL:1999中,两个表连接,只返回匹配的行,被称为内连接。

  • 两个表在连接过程中除了返回满足连接条件的行以外还返回左(或右)表中不满足条件的行 ,这种连接称为左(或右) 外连接。

  • 两个表在连接过程中除了返回满足连接条件的行以外还返回两个表中不满足条件的行 ,这种连接称为全 外联接。


左外连接

select e.last_name, e.department_id, d.department_name

from employees e left outer join departments d

on (e.department_id = d.department_id) order by department_id desc;

SQL 基础之多表查询(十)


右外连接

select e.last_name, e.department_id, d.department_name

from employees e right outer join departments d

on (e.department_id = d.department_id) ;

SQL 基础之多表查询(十)


全外连接

select e.last_name, d.department_id, d.department_name

from employees e full outer join departments d

on (e.department_id = d.department_id) ;

SQL 基础之多表查询(十)



笛卡尔积


  • 笛卡尔集会在下面条件下产生:

– 连接条件被遗漏

– 连接条件不正确

– 所有表中的所有行互相连接

  • 为了避免笛卡尔集,可以在 WHERE 加入有效的连接条件。


创建交叉连接

  • 使用 CROSS JOIN子句使连接的表产生叉集。

  • 叉集也被称为在两个表之间的笛卡尔乘积。


SQL 基础之多表查询(十)

select last_name, department_name from employees cross join departments;



练习题:

1. 为HR部门写一条查询语句,要求结果生成所有部分的地址。请使用 LOCATIONS 和 COUNTRIES 表,

要求输出 location_id,street_address,city,state_province,以及 country。使用自然连接获得要求的结果

select location_id,street_address,city,state_province,country_id,country_name from locations  natural join countries;

SQL 基础之多表查询(十)



2. HR部门需要一个可以查出所有员工的 last_name,department_id,department_name 的查询语句

select last_name,department_id,department_name from employees join departments using(department_id);

SQL 基础之多表查询(十)


3.  请查出所有在 Toronto工作的员工的 last_name,job_id,department_id,department_name.

select e.last_name,e.job_id,e.department_id,d.department_name from employees e join departments d

on (e.department_id = d.department_id)

join locations l

on (d.location_id = l.location_id)

where l.city ='Toronto';

SQL 基础之多表查询(十)

如果Toronto 为小写的toronto可以用下面语句

select e.last_name,e.job_id,e.department_id,d.department_name from employees e join departments d

on (e.department_id = d.department_id)

join locations l

on (d.location_id = l.location_id)

where lower(l.city) ='toronto';


4.  请查询出每个员工的 last_name,employee_id,经理的 last_name,manager_id。请依次为这

些 列 取 合 适 的 别 名 ”Emeployee”,”EMP#”,”Manager”,”Mgr#”。


select w.last_name "Employee",w.employee_id "EMP#",

m.last_name "Manager",m.employee_id "Mgr#"

from employees w join employees m

on (w.manager_id = m.employee_id);

SQL 基础之多表查询(十)


5、显示所有员工(包括没有经理的 King),请根据员工编号进行排序

select w.last_name "employee", w.employee_id "emp#",

m.last_name "manager",m.employee_id "mgr#"

from employees w

left outer join employees m

on (w.manager_id = m.employee_id)

order by 2;

SQL 基础之多表查询(十)


6.  请查询出每个员工的 department_id,员工的 last_name,以及在同一部门一起工作的同事

select e.department_id department,e.last_name employee,

c.last_name colleague

from employees e join employees c

on (e.department_id = c.department_id)

where e.employee_id <> c.employee_id

order by e.department_id,e.last_name,c.last_name;

SQL 基础之多表查询(十)


7、查 询 所 有 员 工 的last_name,job_id,department_name,salary,grade_level。

select e.last_name,e.job_id,d.department_name,

e.salary,j.grade_level

from employees e join departments d

on (e.department_id = d.department_id)

join job_grades j

on (e.salary between j.lowest_sal and j.highest_sal);


8、 HR 部门的同事想知道所有在 Davies 之后被雇佣的员工。请帮忙写出一条 SQL 查出来这些员工的last_name 以及 hire_date

select e.last_name,e.hire_date

from employees e join employees davies

on (davies.last_name='Davies')

where davies.hire_date < e.hire_date;

SQL 基础之多表查询(十)


9.  HR 部门的同事想要找出那些在他们的经理之前被雇佣的员工的 last_name,hire_date,以及他们

经理的 last_name,和 hire_date

select w.last_name,w.hire_date,m.last_name,m.hire_date

from employees w join employees m

on (w.manager_id=m.employee_id)

where w.hire_date < m.hire_date;

SQL 基础之多表查询(十)


您可能感兴趣的文档:

--结束END--

本文标题: SQL 基础之多表查询(十)

本文链接: https://lsjlt.com/news/37890.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • SQL 基础之多表查询(十)
    JOINS 类型和它的语法Natural joins(自然连接):– NATURAL JOIN 子句– USING 子句– ON 子句自连接  非等值连接  Outer joi...
    99+
    2024-04-02
  • SQL 基础之子查询(十一)
    子查询:类型、语法、和注意事项使用子查询能解决哪些问题?子查询语法:select select_list from table where expr operator (selec...
    99+
    2024-04-02
  • SQL基础之使用集合运算符进行多表查询(十二)
    集合操作:类型和注意事项集合操作注意事项在 SELECT 列表中的列名和表达式在数量上必须匹配第二个查询中的每一列的数据类型必须与第一个查询其对应的列的数据类型相匹配可以用括号来改变的执行顺序。OR...
    99+
    2024-04-02
  • MySQL基础之多表查询案例分享
    目录多表查询案例数据环境准备查询员工的姓名、年龄、职位、部门信息 (隐式内连接)查询年龄小于30岁的员工的姓名、年龄、职位、部门信息(显式内连接)查询拥有员工的部门ID、部门名称查询所有年龄大于40岁的员工, 及其归属的...
    99+
    2024-04-02
  • SQL 基础之使用子查询检索数据(二十二)
    多列子查询where (manager_id, department_id) in子查询100 90102 60124 50主查询的每行都与多行和多列的子查询进行比较列的比较多列的比较,包含子查询...
    99+
    2024-04-02
  • 【MySQL基础教程】多表查询
    前言 本文为 【MySQL基础教程】多表查询 相关知识,下边将对多表关系,多表查询概述,内连接,外连接,自连接,子查询,多表查询案例等进行详尽介绍~ 📌博主主页:小新要变强 的主页 👉Java全栈学习路线可...
    99+
    2023-08-18
    mysql 数据库 java
  • SQL 基础之子查询、多表插入、merge 语句、跟踪一段时间数据变化(二十)
    使用子查询处理数据可以使用子查询中的数据操纵语言(DML)语句: 使用内嵌视图检索数据 从一张表向另一张表复制数据 基于另一张表的值更新表中数据 基于另一张表的值删除表中的行使用子查询作为数据源检索数据se...
    99+
    2024-04-02
  • SQL 基础之索引、闪回、临时表(十八)
    创建索引:自动– 创建 PRIMARY KEY– 创建 UNIQUE KEY手动– CREATE INDEX 语句– CREATE TABLE 语句create table  语句中 create...
    99+
    2024-04-02
  • sql多表查询
    多表查询概念:从多张表查询数据 分类:连接查询和子查询。 有两张表A、B 连接查询: 内连接      相当于查询A、B交集数据 例1:select * from emp,dept where emp.dep_id=d...
    99+
    2023-09-01
    sql 数据库 vim mysql java
  • SQL优化之多表关联查询
    慢SQL日志里看到一个三张表的关联查询,如下: 1 ...
    99+
    2024-04-02
  • Mysql数据库理论基础之五--SELECT单多表查询、子查询、别名
    一、简介由MySQL AB公司开发,是最流行的开放源码SQL数据库管理系统,主要特点:1、是一种数据库管理系统2、是一种关联数据库管理系统3、是一种开放源码软件,且有大量可用的共享MySQL软件4、MySQ...
    99+
    2024-04-02
  • MySQL之单表查询、多表查询
    一、单表查询: 单个表的查询方法及语法顺序需要通过实际例子来熟悉 先将表数据创建下: mysql> create database singe_t1; # 建个数据库singe_t1 Query OK, 1 row aff...
    99+
    2023-01-31
    MySQL
  • SQL基础的查询语句
    目录一、基础SELECT语句1、查询指定字段3、设定别名4、常数的查询5、表达式的查询6、去重7、条件查询7.1 单条件查询7.2 多条件查询7.3 指定范围查询7.4 模糊...
    99+
    2024-04-02
  • SQL 基础之DDL语句创建和管理表(十四)
    数据库对象Object描述表基本的数据存储集合,由行和列组成View从一张表或多张表中抽出的 逻辑上相关的数据集合序列生成规律的数值index 索引提高查询性能Synonym 别名给对象起的别名表名和列名注...
    99+
    2024-04-02
  • SQL基础查询和LINQ集成化查询
    SELECT SELECT 语句用于从表中选取数据,是 SQL 最基本的操作之一。 通过 SELECT 查询的结果被存储在一个结果表中(称为结果集)。 SQL SELECT ...
    99+
    2024-04-02
  • SQL 基础之时区函数(二十一)
    使用数据类型来存储两个日期时间值之间的时间差使用下列的日期时间函数:– CURRENT_DATE– CURRENT_TIMESTAMP– LOCALTIMESTAMP– DBTIMEZONE– SESSIO...
    99+
    2024-04-02
  • SQL 基础之DML 数据处理(十三)
    数据操作语言DML 可以在下列条件下执行:– 向表中插入数据– 修改现存数据– 删除现存数据事务是由完成若干项工作的DML语句组成的表中添加新的数据– INSERT 语句使用 INSERT 语句向表中插入数...
    99+
    2024-04-02
  • SQL 基础正则表达式(二十三)
    在SQL 和 PL/SQL 中使用正则表达式函数名称描述REGEXP_LIKE与LIKE运算符类似,但执行正则表达式匹配,而不是简单的模糊匹配(条件)REGEXP_REPLACE以正则表达式搜索和替...
    99+
    2024-04-02
  • MongoDB基础之查询文档
    目录一、查询文档实例二、条件操作符MongoDB 与 RDBMS Where 语句比较举例:使用 (<) 和 (>) 查询 - $lt 和 $gt三、AND 条...
    99+
    2024-04-02
  • MySQL查询学习之基础查询操作
    前言 MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作