加载中...

(22)高级SQL


高级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;

还没有评论.