目錄python
1.建立部門表 create table dep( id int primary key auto_increment, name varchar(16), work varchar(16) ); 2.建立員工表 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); ###################cmd圖示 mysql> select * from emp; +----+----------+--------+--------+ | id | name | salary | dep_id | +----+----------+--------+--------+ | 1 | egon | 3 | 2 | | 2 | yanghuhu | 2 | 2 | | 3 | sanjiang | 10 | 1 | | 4 | owen | 88888 | 2 | | 5 | liujie | 8 | 1 | | 6 | yingjie | 1.2 | 0 | +----+----------+--------+--------+ 6 rows in set (0.00 sec) mysql> select * from dep; +----+-----------+--------+ | id | name | work | +----+-----------+--------+ | 1 | 市場部 | 銷售 | | 2 | 教學部 | 授課 | | 3 | 管理部 | 開車 | +----+-----------+--------+ 3 rows in set (0.00 sec)
笛卡爾積: 集合 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; 總結:是兩張表 記錄的全部排列組合,數據沒有利用價值
1.關鍵字:inner join on 2.語法:from A表 inner join B表 on A表.關聯字段=B表.關聯字段 select emp.id,emp.name,salary,dep.name,work from emp inner join dep on emp.dep_id = dep.id order by emp.id; #######################cmd 圖解 mysql> select emp.id, emp.name salary, dep.name, work from emp join dep on emp.dep_id=dep.id order by emp.id; +----+----------+-----------+--------+ | id | salary | name | work | +----+----------+-----------+--------+ | 1 | egon | 教學部 | 授課 | | 2 | yanghuhu | 教學部 | 授課 | | 3 | sanjiang | 市場部 | 銷售 | | 4 | owen | 教學部 | 授課 | | 5 | liujie | 市場部 | 銷售 | +----+----------+-----------+--------+ # 總結:只保留兩個表有關聯的數據
1.關鍵字:left join on 2.語法:from 左表 left join 右表 on 左表.關聯字段=右表.關聯字段 select emp.id,emp.name,salary,dep.name,work from emp left join dep on emp.dep_id = dep.id order by emp.id; ###################cmd 圖解 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; +----+----------+--------+-----------+--------+ | id | name | salary | name | work | +----+----------+--------+-----------+--------+ | 1 | egon | 3 | 教學部 | 授課 | | 2 | yanghuhu | 2 | 教學部 | 授課 | | 3 | sanjiang | 10 | 市場部 | 銷售 | | 4 | owen | 88888 | 教學部 | 授課 | | 5 | liujie | 8 | 市場部 | 銷售 | | 6 | yingjie | 1.2 | NULL | NULL | +----+----------+--------+-----------+--------+ # 總結:保留左表的所有數據,右表有對應數據直接連表顯示,沒有對應關係空填充
1.關鍵字:right join on 2.語法:from A表 right join B表 on A表.關聯字段=B表關聯字段 select emp.id,emp.name,salary,dep.name,work from emp right join dep on emp.dep_id = dep.id order by emp.id; #######################cmd 圖解 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; +------+----------+--------+-----------+--------+ | id | name | salary | name | work | +------+----------+--------+-----------+--------+ | NULL | NULL | NULL | 管理部 | 開車 | | 1 | egon | 3 | 教學部 | 授課 | | 2 | yanghuhu | 2 | 教學部 | 授課 | | 3 | sanjiang | 10 | 市場部 | 銷售 | | 4 | owen | 88888 | 教學部 | 授課 | | 5 | liujie | 8 | 市場部 | 銷售 | +------+----------+--------+-----------+--------+ # 總結:保留右表的所有數據,左表有對應數據直接連表顯示,沒有對應關係空填充
1.left左邊的是左表,右邊的是右表 2.right左邊的是左表,右邊的是右表 3.因此咱們交換左右表的位置也是能夠的 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; # 總結:更換一下左右表的位置,相對應更換左右鏈接關鍵字,結果相同
1.就是先把兩張表進行左鏈接,中間加一個關鍵字union, 而後再進行右連接 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; ###############################cmd 圖示 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; +------+----------+--------+-----------+--------+ | id | name | salary | name | work | +------+----------+--------+-----------+--------+ | NULL | NULL | NULL | 管理部 | 開車 | | 1 | egon | 3 | 教學部 | 授課 | | 2 | yanghuhu | 2 | 教學部 | 授課 | | 3 | sanjiang | 10 | 市場部 | 銷售 | | 4 | owen | 88888 | 教學部 | 授課 | | 5 | liujie | 8 | 市場部 | 銷售 | | 6 | yingjie | 1.2 | NULL | NULL | +------+----------+--------+-----------+--------+ # 總結:左表右表數據都被保留,彼此有對應關係正常顯示,彼此沒有對應關係均空填充對方
# 建立一對一 做者與做者詳情 表 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', 0); 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;
# 在一對一基礎上,創建 做者與書 的多對多關係關係 # 利用以前的做者表 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; 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