# 高级SQL
三表连接查找
~~~
mysql> select sales_rep.first_name, sales_rep.surname,
-> value, customer.first_name, customer.surname
-> from sales, sales_rep, customer where sales_rep.employee_number = sales.sales_rep
-> and customer.id = sales.customer;
~~~
sales_rep表的employee_number与sales的sales_rep关联
customer表的id和sales的customer相关, `构成了连接条件`
* `等值`连接是一种内连接, 通过两个表或者多个表相等条件, 将两个表的行组合到一个表中.(`内连接是连接的原始类型, 返回的每一行都包含来自每个表的数据`)
~~~
mysql> select ename, loc from emp, dept where emp.deptno = dept.deptno and emp.deptno = 10;
~~~
## 内连接
~~~
#下面两句是等价的
mysql> select first_name, surname, value from customer, sales where customer.id = sales.customer;
#注意inner join 表名 on 相关字段的SQL语句
mysql> select first_name, surname, value from customer inner join sales on customer.id = sales.customer;
~~~
## 左连接
左连接就是返回左边匹配行, 不考虑右边的表是否有相应的行. `返回匹配的全部行的必须是左表, left join关键字之前`
~~~
#语法
select field1, field2 from table1 left join table2 on field1 = field2;
mysql> select first_name, surname, value from sales left join customer on id = customer;
~~~
> 右连接连接的顺序与左连接相反
## union链接
union用来把不同的select结果连接成一个, 每个语句必须有相同个数的列
> union可能会进行去重处理, 不去重可以使用union all进行连接
>
> union语句中`order by`是在整个union上进行的, 如果只想在某一个上使用可以请用小括号, union默认不返回重复记录
~~~
#创建一个表用于union查询
mysql> create table old_customer(
-> id int,
-> first_name varchar(30),
-> surnamr varchar(40));
#插入数据
mysql> insert into old_customer values
-> (5432, 'Thulani', 'Salis'),
-> (2342, 'Shahiem', 'Papo');
#两个查询语句有相同的列
mysql> select id, first_name, surname from old_customer union select id, first_name, surname from customer;
~~~
## 查询结果添加到另一个表
~~~
#创建一个用于插入的表
mysql> create table customer_sales_values(
-> first_name varchar(30),
-> surname varchar(40),
-> value int);
mysql> insert into customer_sales_values(first_name, surname, value)
-> select first_name, surname, sum(value) from sales natural join customer group by first_name, surname;
~~~