第3.18课 上课 MySQL数据库进阶, 多表查询

3_18

MySQL数据库进阶

 多表查询

连接条件可在FROM 或 WHERE 子句中指定,

通常在 FROM 子句中指定联接条件。

 

也可以通过 WHERE 和 HAVING 子句包含搜索条件,以进一步筛选联接条件所选的行。

  测试数据

 

 

 

 

-- 用户表

CREATE TABLE e_user (

id int PRIMARY KEY AUTO_INCREMENT,

t_name varchar(10) DEFAULT NULL

);

-- 订单表

CREATE TABLE e_order (

id int(11) PRIMARY KEY AUTO_INCREMENT,

u_id int(11), #references e_user(id),

order_code varchar(20) DEFAULT NULL,

create_date timestamp DEFAULT NOW()

);

 

-- 先插入主表再插入从表数据

insert into e_user values(1,'lis');

insert into e_user values(2,'tom');

insert into e_user values(3,'admin');

insert into e_user values(4,'mary');

 

insert into e_order values(null,1,'电视剧','2009-09-22');

insert into e_order values(null,1,'空调','2009-09-22');

insert into e_order values(null,1,'笔记本','2009-09-22');

 

insert into e_order values(null,2,'手机','2009-09-22');

insert into e_order values(null,2,'电池','2009-09-22');

insert into e_order values(null,3,'薯片','2009-09-22');

 

 

  交叉连接:cross join

   笛卡尔连接

 

 

select * from e_user,e_order;

 

1.笛卡尔积在下列情况下产生:

1)忽略了一个连接条件;

2)一个连接条件失效;

3)第一张表的所有行和第二张表的所有行连接;

 

2.为了避免笛卡尔积的产生,通常包含一个有效连接条件的WHERE子句。

 

  限定使用二义性列名

   1.用表前缀在多张表中限定列名;

   2.用表前缀提高系统性能;

   3.用列别名区分不同表中同名的列;

  内连接

内连接(典型的连接运算有 = ,<> 之类的比较运算符)。

 

内连接使用比较运算符根据每个表共有的列的值匹配两个表中的行。

 

例如,查询获取 用户表 和 订单表 中用户id相同的所有行。

   自然连接:natural join

在连接条件中使用等于=运算符比较被连接列的列值,但会删除连接表中重复列。

 

select * from e_order as o natural join e_user as u where u.id = o.u_id;

   等值连接:=

使用等于=比较连接列的列值,在查询结果中列出接连表中的所有列,包括其中的重复列。

 

-- inner join 内连接 只连接匹配的行

select u.*, o.order_code from e_user u inner join e_order o on u.id = o.u_id;

 

-- 上面的等效下面的语句

select u.*, o.order_code from e_user u join e_order o where u.id = o.u_id;

 

select u.*, o.order_code from e_user u, e_order o where u.id = o.u_id;

   非等值连接:!=、<>

在连接条件中,可以使用其他比较运算符,比较被连接列的列值,如:<、>、!= <>等。

 

select * from e_user u inner join e_order o where u.id <> o.u_id;

  外连接

   左外连接:left outer join

左外连接要遍历左表的所有记录,右表没有的用null表示。

 

-- 左连接 将左边表的数据全部查询出来

 

select u.*, o.order_code from e_user u left join e_order o on u.id = o.u_id;

 

-- 或

 

select u.*, o.order_code from e_user u left outer join e_order o on u.id = o.u_id;

 

 

 

   右外连接:right outer join

右外连接要遍历右表所有的记录,左表没有的用null表示。

 

-- 右连接 将右边表的数据全部查询出来

 

select u.*, o.order_code from e_user u right join e_order o on u.id = o.u_id;

 

-- 或

 

select u.*, o.order_code from e_user u right outer join e_order o on u.id = o.u_id;

  自连接

自连接(self join)是SQL语句中经常要用的连接方式,使用自连接可以将自身表的一个镜像当作另一个表来对待,即将一张表看成多张表来做连接,从而能够得到一些特殊的数据。

 

例如:在emp中的每一个员工都有自己的mgr(经理),并且每一个经理自身也是公司的员工,自身也有自己的经理。下面我们需要将每一个员工自己的名字和经理的名字都找出来。这时候我们该怎么做呢?

 

 

-- 自连接

create table t_emp(

emp_id int primary key,

emp_name varchar(20),

manager_id int references t_emp(emp_id)

);

 

insert into t_emp values(1, '飞刀客', null);

insert into t_emp values(2, '中神通', 1);

insert into t_emp values(3, '踏雪', 1);

insert into t_emp values(4, '挨刀妹', 1);

 

select * from t_emp;

-- 查询飞刀客手下员工

select worker.emp_name 员工 ,mgr.emp_name 领导

from t_emp worker, t_emp mgr

where worker.manager_id = mgr.emp_id;

 

 

 

 

  MySQL表连接运算顺序

   INNER JOIN > CROSS JOIN > LEFT JOIN > RIGHT JOIN

posted on 2018-01-31 22:53  東風★破  阅读(158)  评论(0)    收藏  举报

导航