SQL 内连接,左连接,左外连接,右连接,右外连接,全连接,交叉连接

内联接(典型的联接运算,使用像   =   或   <>   之类的比较运算符)。包括相等联接和自然联接。  
内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行。例如,检索   students   和   courses   表中学生标识号相同的所有行。

外联接。外联接可以是左向外联接、右向外联接或完整外部联接。  
在   FROM   子句中指定外联接时,可以由下列几组关键字中的一组指定:

LEFT   JOIN   或   LEFT   OUTER   JOIN。  
左向外联接的结果集包括   LEFT   OUTER   子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。

RIGHT   JOIN   或   RIGHT   OUTER   JOIN。  
右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。

FULL   JOIN   或   FULL   OUTER   JOIN。  
完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。

交叉联接。  
交叉联接返回左表中的所有行,左表中的每一行与右表中的所有行组合。交叉联接也称作笛卡尔积


MySql数据库中测试例子:



root


show databases;


use kali;


show tables;


--创建客户表
create table customer(
id int primary key auto_increment,
name varchar(10) not null,
address varchar(51) not null,
phone_number varchar(10) not null
);
insert into customer values(2,'kali','qingdao','123123123');




--创建消费表  (外键约束,fee表的customer_id为customer表的主键)
create table fee(
fee_id int primary key auto_increment,
customer_id int not null,
fee float(10),
foreign key(customer_id) references customer(id)
);
insert into fee values(2,1,'23');


customer表中的内容:
+----+------+------------+--------------+
| id | name | address    | phone_number |
+----+------+------------+--------------+
| 1  | dxw  | gongzhufen | 63983477     |
| 2  | kali | qingdao    | 123123123    |
+----+------+------------+--------------+


fee表中的内容:
+--------+-------------+------+
| fee_id | customer_id | fee  |
+--------+-------------+------+
| 1      | 1           | 1.5  |
| 2      | 1           | 23   |
+--------+-------------+------+




左连接:
select c.id,c.name,f.fee from customer as c left join fee as f on c.id=f.customer_id;
+----+------+------+
| id | name | fee  |
+----+------+------+
| 1  | dxw  | 1.5  |
| 1  | dxw  | 23   |
| 2  | kali | NULL |
+----+------+------+
左外连接:
select c.id,c.name,f.fee from customer as c left outer join fee as f on c.id=f.customer_id;
+----+------+------+
| id | name | fee  |
+----+------+------+
| 1  | dxw  | 1.5  |
| 1  | dxw  | 23   |
| 2  | kali | NULL |
+----+------+------+




右连接:
select c.id,c.name,f.fee from customer as c right join fee as f on c.id=f.customer_id;
+------+------+------+
| id   | name | fee  |
+------+------+------+
| 1    | dxw  | 1.5  |
| 1    | dxw  | 23   |
+------+------+------+
右外连接:
select c.id,c.name,f.fee from customer as c right outer join fee as f on c.id=f.customer_id;
+------+------+------+
| id   | name | fee  |
+------+------+------+
| 1    | dxw  | 1.5  |
| 1    | dxw  | 23   |
+------+------+------+




全连接:
select c.id,c.name,f.fee from customer as c,fee as f where c.id=f.customer_id;
select c.id,c.name,f,fee from customer as c full join fee as f on c.id=f.customer_id;(mysql中不支持全连接写法,这样在mysql中是不正确的)
+----+------+------+
| id | name | fee  |
+----+------+------+
| 1  | dxw  | 1.5  |
| 1  | dxw  | 23   |
+----+------+------+




内连接:
--返回字段id与customer_id同时在customer表中也在fee表中。
select c.id,c.name,f.fee from customer as c inner join fee as f on c.id=f.customer_id;
+----+------+------+
| id | name | fee  |
+----+------+------+
| 1  | dxw  | 1.5  |
| 1  | dxw  | 23   |
+----+------+------+


交叉连接:
--产生联接所涉及的表的笛卡尔积。第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小
select c.id,c.name,f.fee from customer as c cross join fee as f;
select c.id,c.name,f.fee from customer as c,fee as f;
+----+------+------+
| id | name | fee  |
+----+------+------+
| 1  | dxw  | 1.5  |
| 2  | kali | 1.5  |
| 1  | dxw  | 23   |
| 2  | kali | 23   |
+----+------+------+

你可能感兴趣的:(JOIN,sql,mysql,table,null,insert)