SQL 基础之多表查询(十)

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;

使用 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);

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);

使用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;

或者

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 ;

使用 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;

右外连接

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) ;

全外连接

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) ;

笛卡尔积

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

– 连接条件被遗漏

– 连接条件不正确

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

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

创建交叉连接

  • 使用 CROSS JOIN子句使连接的表产生叉集。
  • 叉集也被称为在两个表之间的笛卡尔乘积。

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;

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

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

时间: 2024-10-17 06:29:14

SQL 基础之多表查询(十)的相关文章

Orancle的SQL语句的多表查询和组函数

Orancle的SQL语句的多表查询和组函数一.SQL的多表查询:1.左连接和右连接(不重要一方加(+))SELECT e.empno,e.ename,d.deptno,d.dname,d.loc FROM emp e,dept d WHERE e.deptno(+)=d.deptno ;(+)在等号左边是右连接,反之左连接.2.交叉连接 (CROSS JOIN产生笛卡尔积)SELECT FROM emp CROSS JOIN dept ;3.自然连接 (NATURAL JOIN)自动关联字段匹

SQL课堂笔记--多表查询

2017.11.14 二:最基础的连接查询----多表查询 1.使用内部连接  内部连接也叫自然连接,最常见的连接形式   语法:     select 选择列表 from 表名1 ,表名2 where 表名1.列名1=表名2.列名2         或select 选择列表 from 表名1 join 表名2 on 表名1.列名1=表名2.列名2 例1:查询每个学生及其选修课程情况:  select student.*,sc.* from student,sc where student.sn

SQL基础之数据的查询

一.数据查询的一般格式: SELECT [ALL|DISTINCT] <目标列表达式>[,<目标列表达式>] - [INTO 新表名] FROM <表名或视图名>[, <表名或视图名> ] - [ WHERE <条件表达式> ] [ GROUP BY <列名1> [ HAVING <条件表达式> ] ] [ ORDER BY <列名2> [ ASC|DESC ] ]: 二.单表查询 1. 查询指定列与计算的值

SQL数据库的多表查询

多表查询分为 内.外连接 外连接分为左连接(left join 或left outer join).右连接(right join 或者 right outer join).和完整外部连接 (full join 或者 full outer join) 左连接(left join 或 left outer join)的结果就是left join子句中的左表的所有行,而不仅仅是链接列所匹配的行,如果左表中的某行在右表中没有匹配,则在相关联的结果行中右表的所有选择列均为空值(NULL) SQL语法 se

Mybatis用SQL做自连表查询

1 需求 现在有一个菜单表,菜单里同时保存有一级菜单和二级菜单,一级菜单的父菜单id字段是null,二级菜单的父菜单id字段保存了它的父菜单的id.在Java中,一个菜单对象里有一个List类型的属性保存它的子菜单.现在需要将数据库中的数据转为Java中菜单兑现的结构. 2 方法 本文采用Mybatis,编写SQL语句做自连表查询. 3 数据库表 名 类型 id int description varchar path varchar parent_menu_id int 4 POJO pack

mysql基础-数据库多表查询-记录(六)

0x01 MySQL多表查询和子查询 联结查询:事先将两张或者多张表join,根据join的结果进行查询 cross join:交叉联结  用的少, 相当于 (a+b)*(c+d+e) 所得结果的形式   用的少 自然联结  --- 只能在两者相等的情况下才能建立连接 等值联结:把相同的字段进行等值连接 外联结: 左外联接:只保留出现在左外连接元算之前(左边)的关系中的元组(以左表为准,) left_tb LEFT JOIN right_tb ON 条件 右外联接:只保留出现在右外连接元算之后(

SQL Merge 语法 单表查询

--项目中需要用到Merg语法,于是去网上查了资料,发现竟然都是多表查询,问题是我只有一张表,于是我纳闷了,后来我灵机一动,就搞定了!--表名:t_login(登录表)--字段:f_userName(用户名),f_status(登录状态 0=已登录)--执行要求:用户登录时,如果用户存在则修改状态为0,如果不存在则添加一条记录--定义参数:declare @f_userName varchar(20) set @f_userName='test'declare @f_status intset

笔记-Microsoft SQL Server 2008技术内幕:T-SQL语言基础-02 单表查询

SELECT子句中的别名 SELECT子句是在FROM.WHERE.GROUP BY,以及HAVING子句后处理的,这意味着对于SELECT子句之前处理的那些子句,在SELECT子句中为表达式分配的别名并不存在.例如: SELECT orderid, YEAR(orderdate) AS orderyear FROM Sales.Orders WHERE orderyear > 2006; 这是错误的,WHERE子句中并不能识别orderyear别名,应该改为: SELECT orderid,

SQL 基础之使用子查询检索数据(二十二)

多列子查询 where (manager_id, department_id) in 子查询 100 90 102 60 124 50 主查询的每行都与多行和多列的子查询进行比较 列的比较 多列的比较,包含子查询可以是: 不成对比较 成对比较 成对比较子查询1.显示与员工名为"John"同部门且同一个经理的其它员工信息 select employee_id, manager_id, department_id from empl_demo where (manager_id, depa