replace into
replace into t(id, update_time) values(1, now());
或replace into t(id, update_time) select 1, now();
replace into 跟 insert 功能类似,不同点在于:replace into 首先尝试插入数据到表中,
- 如果发现表中已经有此行数据(根据主键或者唯一索引判断)则先删除此行数据,然后插入新的数据。
- 否则,直接插入新数据。
要注意的是:插入数据的表必须有主键或者是唯一索引!否则的话,replace into 会直接插入数据,这将导致表中出现重复的数据。
MySQL replace into 有三种形式:
replace into tbl_name(col_name, ...) values(...)replace into tbl_name(col_name, ...) select ...replace into tbl_name set col_name=value, ...
前两种形式用的多些。其中 “into” 关键字可以省略,不过最好加上 “into”,这样意思更加直观。另外,对于那些没有给予值的列,MySQL 将自动为这些列赋上默认值。
MySQL 高级
理解 SQL 语句
创建外键的 SQL 语句
创建数据表
1 | CREATE TABLE a( |
修改数据表
1 | [CONSTRAINT symbol] FOREIGN KEY [id] (index_col_name, ...) |
1 | ALTERT TABLE a |
1 | ALTERT TABLE a |
删除外键
1 | ALTERT TABLE a DROP FOREIGN KEY b_fk; |
MySQL KEY...REFERENCES修饰符添加一个ON DELETE 或ON UPDATE子句简化任务,它告诉了数据库在这种情况如何处理孤立任务
| 关键字 | 含义 |
|---|---|
| CASCADE | 删除包含与已删除键值有参照关系的所有记录 |
| SET NULL | 修改包含与已删除键值有参照关系的所有记录,使用 NULL 值替换(只能用于已标记为 NOT NULL 的字段) |
| RESTRICT | 拒绝删除要求,直到使用删除键值的辅助表被手工删除,并且没有参照时(这是默认设置,也是最安全的设置) |
| NO ACTION | 啥也不做 |
请注意,通过 ON UPDATE 和 ON DELETE 规则,设置 MySQL 能够实现自动操作时,如果键的关系没有设置好,可能会导致严重的数据破坏,
例如:如果一系列的表通过外键关系和 ON DELETE CASCADE 规则连接时,任意一个主表的变化都会导致甚至只和原始删除有一些将要联系的记录在没有警告的情况被删除,所以,我们在操作之前还要检查这些规则的,操作之后还要再次检查.
事务
事务回滚
视图
触发器
序列号
权限
使用技巧
- 如何更新使用过滤条件中包括自身的表?
在 MySQL 中, 不允许更新的表不能出现在 FROM 从句中, 但是可以使用 JOIN 从句中.
联合更新
1 | UPDATE user1 a JOIN( |
- 优化子查询
- 优化聚合查询
1 | select a.user_name, b.timestr,b.kills |
1 | SELECT a.user_name,b.timestr,b.kills |
- 如何实现分组选择
1 | SELECT d.user_name, c.timestr , kills |
删除重复记录
行列转换
MySQL
SQL 语句类型:
- DDL 数据定义语言
- TPL 事务处理语言
- DCL 数据控制语言
- DML 数据操作语言
事务
索引
JOIN
只写 JOIN, 默认是 inner join
- 更新使用过滤条件中包括自身的表?
不能更新 from 从句的表
1 | update user1 set over='齐天大圣' where user1.user_name in ( |
会报错!
使用 JOIN 可以解决此问题
1 | update user1 a join( |
表结构:
1 | CREATE TABLE [dbo].[Exam]( |
题目一: 写一条 Sql 语句查询前出 100 到 199 的记录
题目二: 写一条 Sql 语句删除重复[除时间外的所有字段字段相同]的记录,保留重复记录中时间最大的记录
题目三: 一条 Sql 语句查出年份,1 月,2 月,3 月….12 月的订单总数列表
题目四: 一条 sql 语句查询出年份,本月销量,上月销量,环比%,去年同期销量,同比%列表
1:
select * from Exam limit 100,100
2 :
3 :
select year(s_date) as ‘年’ ,month(s_date) as ‘月’, count(Amt) as ‘订单数’ from Exam group by year(s_date),Month(s_date);
导入/导出
1 | #导出整个库的表结构如下: |