2. 高级SQL

最后更新于:2022-04-01 02:51:47

# 高级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; ~~~
';