DROP TABLE IF EXISTS `test_dept`; CREATE TABLE `test_dept` ( d_id int(20) COMMENT 'id', d_name varchar(255) DEFAULT NULL COMMENT '部门名称', PRIMARY KEY (`d_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='部门表'; DROP TABLE IF EXISTS `test_emp`; CREATE TABLE `test_emp` ( e_id int(20) NOT NULL COMMENT 'id', e_name varchar(255) DEFAULT NULL COMMENT '姓名', d_id_fk int(11) default null COMMENT '部门表外键', PRIMARY KEY (`e_id`), key fk_dept_id (d_id_fk) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='员工表'; INSERT INTO test_dept VALUES(1, '部门1'), (2, '部门2'), (4, '部门4'); INSERT INTO test_emp VALUES(1, '李1', 1), (2, '李2', 2), (3, '李3', 3);
SELECT * FROM test_dept d inner join test_emp e ON e.d_id_fk = d.d_id ; #1 SELECT * FROM test_dept d left join test_emp e ON e.d_id_fk = d.d_id ; #2 SELECT * FROM test_dept d left join test_emp e ON e.d_id_fk = d.d_id where e.d_id_fk is not null; #3 SELECT * FROM test_dept d left join test_emp e ON e.d_id_fk = d.d_id where e.d_id_fk is null; #(与 'inner join' 的示意图区域重合,但是意义不同 ) SELECT * FROM test_dept d right join test_emp e ON e.d_id_fk = d.d_id ; #4 SELECT * FROM test_dept d right join test_emp e ON e.d_id_fk = d.d_id where d.d_id is not null; #5 SELECT * FROM test_dept d right join test_emp e ON e.d_id_fk = d.d_id where d.d_id is null; #(与 'inner join' 的示意图区域重合,但是意义不同 ) -- 6. full join SELECT * FROM test_dept d left join test_emp e ON e.d_id_fk = d.d_id UNION ALL SELECT * FROM test_dept d right join test_emp e ON e.d_id_fk = d.d_id ; -- 7. full outer join ... is not null (去重 结果等于 'inner join',但示意图不同 ) SELECT * FROM test_dept d left join test_emp e ON e.d_id_fk = d.d_id where e.d_id_fk is not null UNION ALL SELECT * FROM test_dept d right join test_emp e ON e.d_id_fk = d.d_id where d.d_id is not null; -- 8. full inner join ... is null (与 'inner join' 的示意图区域重合,但是意义不同 ) SELECT * FROM test_dept d left join test_emp e ON e.d_id_fk = d.d_id where e.d_id_fk is null UNION ALL SELECT * FROM test_dept d right join test_emp e ON e.d_id_fk = d.d_id where d.d_id is null; 1. mysql> SELECT * FROM test_dept d inner join test_emp e ON e.d_id_fk = d.d_id ; +------+---------+------+--------+---------+ | d_id | d_name | e_id | e_name | d_id_fk | +------+---------+------+--------+---------+ | 1 | 部门1 | 1 | 李1 | 1 | | 2 | 部门2 | 2 | 李2 | 2 | +------+---------+------+--------+---------+ 2. mysql> SELECT * FROM test_dept d left join test_emp e ON e.d_id_fk = d.d_id ; +------+---------+------+--------+---------+ | d_id | d_name | e_id | e_name | d_id_fk | +------+---------+------+--------+---------+ | 1 | 部门1 | 1 | 李1 | 1 | | 2 | 部门2 | 2 | 李2 | 2 | | 4 | 部门4 | NULL | NULL | NULL | +------+---------+------+--------+---------+ 3. mysql> SELECT * FROM test_dept d left join test_emp e ON e.d_id_fk = d.d_id where e.d_id_fk is not null; +------+---------+------+--------+---------+ | d_id | d_name | e_id | e_name | d_id_fk | +------+---------+------+--------+---------+ | 1 | 部门1 | 1 | 李1 | 1 | | 2 | 部门2 | 2 | 李2 | 2 | +------+---------+------+--------+---------+ 4. mysql> SELECT * FROM test_dept d right join test_emp e ON e.d_id_fk = d.d_id ; +------+---------+------+--------+---------+ | d_id | d_name | e_id | e_name | d_id_fk | +------+---------+------+--------+---------+ | 1 | 部门1 | 1 | 李1 | 1 | | 2 | 部门2 | 2 | 李2 | 2 | | NULL | NULL | 3 | 李3 | 3 | +------+---------+------+--------+---------+ 5. mysql> SELECT * FROM test_dept d right join test_emp e ON e.d_id_fk = d.d_id where d.d_id is not null; +------+---------+------+--------+---------+ | d_id | d_name | e_id | e_name | d_id_fk | +------+---------+------+--------+---------+ | 1 | 部门1 | 1 | 李1 | 1 | | 2 | 部门2 | 2 | 李2 | 2 | +------+---------+------+--------+---------+ 6. mysql> SELECT * FROM test_dept d left join test_emp e ON e.d_id_fk = d.d_id -> UNION ALL -> SELECT * FROM test_dept d right join test_emp e ON e.d_id_fk = d.d_id ; +------+---------+------+--------+---------+ | d_id | d_name | e_id | e_name | d_id_fk | +------+---------+------+--------+---------+ | 1 | 部门1 | 1 | 李1 | 1 | | 2 | 部门2 | 2 | 李2 | 2 | | 4 | 部门4 | NULL | NULL | NULL | | 1 | 部门1 | 1 | 李1 | 1 | | 2 | 部门2 | 2 | 李2 | 2 | | NULL | NULL | 3 | 李3 | 3 | +------+---------+------+--------+---------+ 7. mysql> SELECT * FROM test_dept d left join test_emp e ON e.d_id_fk = d.d_id where e.d_id_fk is not null -> UNION ALL -> SELECT * FROM test_dept d right join test_emp e ON e.d_id_fk = d.d_id where d.d_id is not null; +------+---------+------+--------+---------+ | d_id | d_name | e_id | e_name | d_id_fk | +------+---------+------+--------+---------+ | 1 | 部门1 | 1 | 李1 | 1 | | 2 | 部门2 | 2 | 李2 | 2 | | 1 | 部门1 | 1 | 李1 | 1 | | 2 | 部门2 | 2 | 李2 | 2 | +------+---------+------+--------+---------+
DROP TABLE IF EXISTS `test_student`; CREATE TABLE `test_student` ( `id` int(20) NOT NULL COMMENT '学号', `sex` int DEFAULT '0' COMMENT '性别 0-男 1-女', `name` varchar(255) DEFAULT NULL COMMENT '姓名', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='学生表'; DROP TABLE IF EXISTS `test_score`; CREATE TABLE `test_score` ( `s_id` int(20) COMMENT '学号', `score` int NOT NULL COMMENT '分数', `level` int COMMENT '成绩 0-不及格 1-及格 2-优良 3-优秀' ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='成绩表'; -- 初始化学生 INSERT INTO test_student VALUES(1, 0, '张三'), (2, 0, '李四'), (4, 0, '新来的'); -- 初始化成绩 INSERT INTO test_score VALUES(1, 10, 0), (2, 20, 0), (5, 10, 0);
SELECT * FROM test_student ts inner JOIN test_score tc ON ts.id = tc.s_id ;-- 1. inner SELECT * FROM test_student ts LEFT JOIN test_score tc ON ts.id = tc.s_id ;-- 2. LEFT outer join SELECT * FROM test_student ts LEFT JOIN test_score tc ON ts.id = tc.s_id where tc.s_id is null;-- 3. SELECT * FROM test_student ts right JOIN test_score tc ON ts.id = tc.s_id ;-- 4. right outer join SELECT * FROM test_student ts right JOIN test_score tc ON ts.id = tc.s_id where ts.id is null;-- 5. -- 6. full outer join SELECT * FROM test_student ts LEFT JOIN test_score tc ON ts.id = tc.s_id ; UNION ALL SELECT * FROM test_student ts right JOIN test_score tc ON ts.id = tc.s_id ; -- 7. full outer join ... is null SELECT * FROM test_student ts LEFT JOIN test_score tc ON ts.id = tc.s_id where tc.s_id is null ; UNION ALL SELECT * FROM test_student ts right JOIN test_score tc ON ts.id = tc.s_id where ts.id is null;
select id from `test_student` order by rand() limit 1000; -- 随机抽样 -- 可优化为: select id from `test_student` t1 inner join (select rand() * (select max(id) from `test_student`) as nid) t2 on t1.id > t2.nid limit 1000; -- 解析: select id from `test_student` t1 inner join ( select rand() *2 as nid) t2 on t1.id > t2.nid limit 1000; select id from `test_student` t1 inner join ( select rand() *2 as nid) t2 on t1.id > 0 limit 1000;