MYSQL增删改语句

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 修饰符影响那些只支持表级锁的存储引擎(通过锁实现的延迟执行呗),比如: MyISAMMEMORY, 和 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 操作直到没有客户端对表进行读操作。这个修饰符影响那些只支持表级锁的存储引擎,比如: MyISAMMEMORY, 和 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 修饰符影响那些只支持表级锁的存储引擎,比如: MyISAMMEMORY, 和 MERGE

  • IGNORE: 如果你指定了 IGNORE 修饰符,MySQL 服务器会在执行 UPDATE 操作期间忽略那些可忽略的错误。这些错误最终会作为 WARNING 返回。

​UPDATE [LOW_PRIORITY] [IGNORE] table_name SET column_name = value

猜你喜欢

转载自blog.csdn.net/chara9885/article/details/131486988