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
UPDATE
语法:
UPDATE [IGNORE] table_name SET column_name1 = value1, column_name2 = value2, ... [WHERE clause];
table_name是表名
column_name是列名 可以有多个列用逗号分隔
使用 WHERE 子句指定要更新的行。只有符合 WHERE 条件的行才会被更新。
WHERE语句可以省略 但是除非有特殊需要(真的要更新全列数据)否则请不要省略
实例:
更新单例数据
UPDATE customer SET email = '[email protected]' WHERE customer_id = 1;
这坨的含义是 在customer里把符合customer_id = 1的数据更新成 [email protected]
1 row affected
表示 1 行数据受影响。也就是更新了 1 行数据。Rows matched: 1
表示匹配的WHERE
条件的行数是 1。Changed: 1
表示修改的行数是 1。Warnings: 0
表示没有需要注意的事项。更新多列数据:
UPDATE customer SET first_name = 'Tim', last_name = 'Duncan', email = '[email protected]' WHERE customer_id = 1;
表达式更新
UPDATE customer SET email = REPLACE(email, 'sakilacustomer.org', 'sjkjc.com');
使用
UPDATE
更新时,字段的值可以设置为表达式的运算结果,比如函数或其他的运算。这里的REPLACE函数是将 email中的 sakilacustomer.org替换成sjkjc.com 然后返回替换完成后的email
使用子查询更新
UPDATE customer SET store_id = ( SELECT store_id FROM store ORDER BY RAND() LIMIT 1 ) WHERE store_id IS NULL;
为一个没有store_id的列赋值任意一个store_id
UPDATE修饰符
LOW_PRIORITY
: 如果你指定了LOW_PRIORITY
修饰符,MySQL 服务器将延迟执行UPDATE
操作直到没有客户端对表进行读操作。
LOW_PRIORITY
修饰符影响那些只支持表级锁的存储引擎,比如:MyISAM
,MEMORY
, 和MERGE
。
IGNORE
: 如果你指定了IGNORE
修饰符,MySQL 服务器会在执行UPDATE
操作期间忽略那些可忽略的错误。这些错误最终会作为WARNING
返回。UPDATE [LOW_PRIORITY] [IGNORE] table_name SET column_name = value