INSERT
语法:
单行插入
INSERT INTO table_name (column_1, column_2, ...) VALUES (value_1, value_2, ...);
多行插入
INSERT INTO table_name (column_1, column_2, ...) VALUES (value_11, value_12, ...), (value_21, value_22, ...) ...;
INSERT INTO 和 VALUES都是关键词
INSERT INTO 后面接表名
表名 table_name 后跟要插入数据的列名列表。列名放在小括号中
VALUES 关键字之后的小括号中是值列表。值的数量要和字段的数量相同。值的位置和列的位置一一对应。
INSERT
语句返回插入的行数实例
先创建个表
CREATE TABLE user ( id INT AUTO_INCREMENT, name VARCHAR(255) NOT NULL, age INT, birthday DATE, PRIMARY KEY (id) );
插入单行
INSERT INTO user (name,age) VALUES ('zhangsan',18);
我们可以看到 我们只在两列中插入了指 所以另一列没有值的就用NULL填充,而ID列是自增主键不用我们给值
多行插入
INSERT INTO user (name,age) VALUES ('lisi',4),('wangwu',6);
插入日期字段
INSERT INTO user (name,age,birthday) VALUES ('zhaoliu',18,'2001-10-04');
DATE格式的数据插入就用一个YYYY-MM-DD的字符串
INSERT的修饰符
LOW_PRIORITY
:如果你指定了
LOW_PRIORITY
修饰符,MySQL 服务器将延迟执行INSERT
操作直到没有客户端对表进行读操作。
LOW_PRIORITY
修饰符影响那些只支持表级锁的存储引擎(通过锁实现的延迟执行呗),比如:MyISAM
,MEMORY
, 和MERGE
。
HIGH_PRIORITY
:如果你指定了
HIGH_PRIORITY
修饰符,它会覆盖掉服务器启动时的--low-priority-updates
选项(所有支持LOW_PRIORITY选项的语句都默认地按照低优先级来处理)。关于LOW_PRIORITY
如果写入操作是一个LOW_PRIORITY(低优先级)请求,那么系统就不会认为它的优先级高于读取操作。在这种情况下,如果写入者在等待的时候,第二 个读取者到达了,那么就允许第二个读取者插到写入者之前。只有在没有其它的读取者的时候,才允许写入者开始操作。理论上,这种调度修改暗示着,可能存在 LOW_PRIORITY写入操作永远被阻塞的情况。如果前面的读取操作在进行的过程中一直有其它的读取操作到达,那么新的请求都会插入到 LOW_PRIORITY写入操作之前。
同样只影响那些只支持表级锁的存储引擎
IGNORE:
如果你指定了 IGNORE 修饰符,MySQL 服务器会在执行 INSERT 操作期间忽略那些可忽略的错误。这些错误最终会作为 WARNING 返回。
INSERT 限制
在 MySQL 中,
max_allowed_packet
配置了服务器和客户端任何单个消息大小的上限。这同样适用于SELECT
语句。当一个SELECT
语句的大小超过max_allowed_packet
值时,服务器就会给出一个错误。以下语句显示了当前服务器上的
max_allowed_packet
配置:SHOW VARIABLES LIKE 'max_allowed_packet';
max_allowed_packet
以字节为单位。并且不同服务器上的值可能不同。
DELETE
语法:
DELETE FROM table_name
[WHERE clause]
[ORDER BY ...]
[LIMIT row_count]
table_name 表名 就是从这里面删除数据
尽量不要省略WHERE因为这会删除表中全部数据
你可能会问 我删除数据我还ORDER BY个鬼 啥顺序删不一样 实际上ORDER BY 和LIMIT都是修饰WHERE的 而非DELETE的
DELETE
语句返回删除的行数
DELETE和SElECT都是后面可以接WHRER ORDER BY LIMIT 但是DELETE后面不接列(一删就删一行 所以这里不是没有参数 而是默认为当前表 多表删除的时候可以体现出来)
实例:
单表删除:
准备数据:
使用 Sakila 示例数据库中的 actor 表 进行演示,但是在这之前先把表复制了,好不容易导入的,删了可就没了。
CREATE TABLE actor_copy AS (SELECT * FROM actor);
条件删除:
DELETE FROM actor_copy WHERE actor_id = 1;
删除actor_id = 1 的行
DELETE FROM actor_copy WHERE last_name LIKE 'S%';
删除首字母为S的行
限制删除的最大行数
要求删除十个注册最早的人
DELETE FROM actor_copy
ORDER BY actor_id DESC
LIMIT 10;
关于表别名
早期的MYSQL不支持别名删除
像这样会报错:
DELETE FROM main_table m
WHERE NOT EXISTS (
SELECT *
FROM another_table a
WHERE a.main_id = m.id
);
但我们可以这样
DELETE FROM main_table m
WHERE NOT EXISTS (
SELECT *
FROM another_table a
WHERE a.main_id = m.id
);
或者直接用表本名删除多好
多表删除
多表删除语句中不能使用 LIMIT
子句和 ORDER BY
子句。
其他的,比如各种连接,都可以用
DELETE t1, t2
FROM t1 INNER JOIN t2
WHERE t1.id = t2.id;
DELETE t1
FROM t1 INNER JOIN t2
WHERE t1.id = t2.id;
这俩对比一下 就是说第一种里面会把t1 t2中的符合条件的行都删掉 而第二种只会删掉t1中符合条件的 (主体就是DELETE t1嘛)
FROM后面的t1 和 t2 之间一定要加JOIN吗? 原理上一定有,FROM后面如果是两个表的话中间即使什么不加只放个都好都默认为CROSS JOIN;
如果实在不想的话就不用联合查询呗
DELETE FROM t1 WHERE (SELECT * FROM t2 WHERE t1.id = t2.id);
和第二种等效
DELETE t1
FROM
t1 LEFT JOIN t2 ON t1.id = t2.id
WHERE t2.id IS NULL;
DELETE 修饰符
-
LOW_PRIORITY
: 如果你指定了LOW_PRIORITY
修饰符,MySQL 服务器将延迟执行DELETE
操作直到没有客户端对表进行读操作。这个修饰符影响那些只支持表级锁的存储引擎,比如:MyISAM
,MEMORY
, 和MERGE
。 -
QUICK
: 如果你指定了QUICK
修饰符,MyISAM
存储引擎不会在DELETE
操作期间合并索引。这在某种程度上会加快DELETE
操作。 -
IGNORE
: 如果你指定了IGNORE
修饰符,MySQL 服务器会在执行DELETE
操作期间忽略那些可忽略的错误。这些错误最终会作为WARNING
返回。
操作符用法和INSERT相同 在后面直接加就行
DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM table_name