132 MySQL multi-table queries (important)

First, even the table query

  • Connection: there will be multiple tables linked by the link (the line connected, not necessarily a foreign key) field, a connection, a large table parameter
  • Even table query: query on the basis of a large table, it is called even-table query
  • The table and the table in establishing a connection there are four: internal connections, connect the left and right connections, fully connected

data preparation

mysql>: 
create table dep(
    id int primary key auto_increment,
    name varchar(16),
    work varchar(16)
);
create table emp(
    id int primary key auto_increment,
    name varchar(16),
    salary float,
    dep_id int
);
insert into dep values(1, '市场部', '销售'), (2, '教学部', '授课'), (3, '管理部', '开车');
insert into emp(name, salary, dep_id) values('egon', 3.0, 2),('yanghuhu', 2.0, 2),('sanjiang', 10.0, 1),('owen', 88888.0, 2),('liujie', 8.0, 1),('yingjie', 1.2, 0);

Cartesian product (basically useless)

# 笛卡尔积: 集合 X{a, b} * Y{o, p, q} => Z{{a, o}, {a, p}, {a, q}, {b, o}, {b, p}, {b, q}}

mysql>: select * from emp, dep;

# 总结:是两张表 记录的所有排列组合,数据没有利用价值

En

  • Keywords:inner join on(inner可以省略)
  • grammar:from A表 inner join B表 on A表.关联字段=B表.关联字段
mysql>: 
select emp.id,emp.name,salary,dep.name,work 
from dep inner join emp on dep.id=emp.dep_id;   # 内连接的inner可以省略

Summary: retaining only two tables have associated data

Left connection

  • Keywords:left join on
  • grammar:from A表 left join B表 on A表.关联字段=B表.关联字段
mysql>: 
select 
    emp.id,emp.name,salary,dep.name,work 
from emp left join dep on emp.dep_id = dep.id 
order by emp.id;

Summary: to retain all the data left table, right table there is a direct link corresponding data table shows, there is no correspondence between filling empty

The right connection

  • Keywords:right join on
  • grammar: from A表 left join B表 on A表.关联字段=B表.关联字段
mysql>: 
select 
    emp.id,emp.name,salary,dep.name,work 
from emp right join dep on emp.dep_id = dep.id 
order by emp.id;

Summary: the right to retain all the data tables, the left table has directly connected to the corresponding data table shows, there is no correspondence between filling empty

Can be transformed into each other left and right connecting

mysql>: 
select 
    emp.id,emp.name,salary,dep.name,work 
from emp right join dep on emp.dep_id = dep.id 
order by emp.id;

mysql>: 
select 
    emp.id,emp.name,salary,dep.name,work 
from dep left join emp on emp.dep_id = dep.id 
order by emp.id;

Summary: replace what position around the table, replace the corresponding left and right connection key, same result

Fully connected

The left and right connections to achieve full connection that is connected by keyword

Keywords:union

mysql>: 
select 
    emp.id,emp.name,salary,dep.name,work 
from emp left join dep on emp.dep_id = dep.id 

union

select 
    emp.id,emp.name,salary,dep.name,work 
from emp right join dep on emp.dep_id = dep.id 
order by id;

Summary: Left table Right table data is retained, there is another correspondence between the normal display, do not correspond to each other are empty fill each other

One consistent with many cases

create table author(
    id int,
    name varchar(64),
    detail_id int
);
create table author_detail(
    id int,
    phone varchar(11)
);
insert into author values(1, 'Bob', 1), (2, 'Tom', 2), (3, 'ruakei', 2);
insert into author_detail values(1, '13344556677'), (2, '14466779988'), (3, '12344332255');

select author.id,name,phone from author join author_detail on author.detail_id = author_detail.id order by author.id;

select author.id,name,phone from author left join author_detail on author.detail_id = author_detail.id
union
select author.id,name,phone from author right join author_detail on author.detail_id = author_detail.id
order by id;

Many to many

create table author(
    id int,
    name varchar(64),
    detail_id int
);
insert into author values(1, 'Bob', 1), (2, 'Tom', 2), (3, 'ruakei', 0);

create table book(
    id int,
    name varchar(64),
    price decimal(5,2)
);
insert into book values(1, 'python', 3.66), (2, 'Linux', 2.66), (3, 'Go', 4.66);

create table author_book(
    id int,
    author_id int,
    book_id int
);
# 数据:author-book:1-1,2  2-2,3  3-1,3
insert into author_book values(1,1,1),(2,1,2),(3,2,2),(4,2,3),(5,3,1),(6,3,3);

# 多对多
select book.name, book.price, author.name from book 
join author_book on book.id = author_book.book_id
join author on author_book.author_id = author.id;

# 多对多对1
select book.name, book.price, author.name, author_detail.phone from book 
join author_book on book.id = author_book.book_id
join author on author_book.author_id = author.id
left join author_detail on author.detail_id = author_detail.id;

Second, sub-queries (emphasis ***)

Subquery: The sql query results as a condition of the other sql

  • By: insert into table select sub-query results
  • Delete: delete from table where conditions select sub-query (table query can not be the same as delete table)
  • Charles: select field from table where conditions select sub-query
  • Change: update table set field = value WHERE SELECT sub-query (Query table can not update the same table)
# 子查询的sql
select dep, max(salary) from emp group by dep;
# 将子查询转换为一张表
create table t1(dep_name varchar(64), max_salary decimal(5,2));

## 子查询 - 增
insert into t1 select dep, max(salary) from emp group by dep;

## 子查询 - 删(查询的表不能与delete表相同)
delete from t1 where dep_name in (select distinct dep from emp);

## 子查询 - 改(查询的表不能与delete表相同)
update t1 set max_salary=max_salary+1 where dep_name in (select distinct dep from emp);

## 子查询 - 查
select * from emp where (dep, salary) in (select dep, max(salary) from emp group by dep);

Three, all with any: Interval modified conditions

# 语法规则
where id in (1, 2, 3) # id是1或2或3
where id not in (1, 2, 3) #  id不是1,2,3
where salary < all(3, 6, 9) # salary必须小于所有情况(小于最小)
where salary > all(3, 6, 9) # salary必须大于所有情况(大于最大)
where salary < any(3, 6, 9) # salary只要小于一种情况(小于最大)
where salary > any(3, 6, 9) # salary只要大于一种情况(大于最小)

# 案例,查询员工表中 薪资低于id大于11的员工薪资 所有的员工信息
select * from emp where salary < all(select salary from emp where id>11);

Guess you like

Origin www.cnblogs.com/XuChengNotes/p/11595341.html