先回忆一下DDL和DML
创建表DDL
create table t_xx(id int auto_increment primary key, name char(10),...)
create table t_student( id int auto_increment primary key , name char(10), 外键id int,
foreign key(外键id) references 外表t_class(外表id字段名) );
插入数据DML
insert into t_xx(f_1, f_2, f_3,.....) values(v_1, v_2, v_3....), --可省略字段名
(v_1, v_2, v_3....),(......);
更新数据DML
updata t_xx set f_xx = 新值 where f_xx = 旧值;
连接
- INNER JOIN 两边表同时有对应的数据,即任何一边缺失数据就不显示。
- LEFT JOIN 会读取左边数据表的全部数据,即便右边表无对应数据。
- RIGHT JOIN 会读取右边数据表的全部数据,即便左边表无对应数据。
连接时的on和where
注意on与where有什么区别,两个表连接时用on,在使用left jion时,on和where条件的区别如下:
- on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。
- where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。
分组group by时having和where的区别
- WHERE语句在GROUP BY语句之前;SQL会在分组之前计算WHERE语句。
- HAVING语句在GROUP BY语句之后;SQL会在分组之后计算HAVING语句。
- 由于COUNT()函数不可用于WHERE语句中,但可以在HAVING后面用
distinct和group by 比较性能
- 在不同记录数较小时(重复的数据大),count group by性能普遍高于count distinct,尤其对于text类型表现的更明显。
- 在不同记录数较大的场景(重复数据小),count group by性能反而低于直接count distinct。
tips:具体可访问查看https://www.jianshu.com/p/34800d06f63d
SQL集合运算之差、并、交
- EXPECT 集合差运算, 可代替not in 或者in
- UNION 集合并运算,可选参数 ALL,重复的数据也显示 可代替or
- INTERSECT 集合交运算,返回两个查询检索出的共有行
举例:查出不是部门经理的普通员工编号
SELECT emp_no FROM employees
EXCEPT --左减右
SELECT emp_no FROM dept_manager;
-- 上面代替下面,上面会用索引,下面不用索引
SELECT emp_no FROM employees
WHERE emp_no NOT IN (SELECT emp_no FROM dept_manager)