mysql增删改查数据总结

目录

1. 插入数据(Insert):

1. 插入数据的基本语法:

2. 使用`INSERT INTO ... SELECT`来插入查询结果:

3. 插入数据的注意事项:

4. REPLACE语句:

2. 更新数据(Update):

1. 更新数据的基本语法:

2. 注意事项:

3. 删除数据(Delete):

1. 删除数据的基本语法:

2. 注意事项:

3.TRUNCATE语句:

4.查询语句(Select)

1. 基本查询语法:

2. 查询结果的排序:

2.1 Having函数

3. 查询结果的限制:

4. 使用聚合函数查询数据:

4.1count(*) 和 count(1)和count(列名)区别 

1. COUNT(*):COUNT(*)用于计算满足条件的行数,其中的`*`表示匹配所有行。

2. COUNT(1):COUNT(1)用于计算满足条件的行数,其中的`1`表示匹配所有的行,可以看作是一个常量。

3. COUNT(列名):COUNT(列名)用于计算特定列中非NULL值的行数。

5. 连接多个表查询数据:

1. 内连接(INNER JOIN):

2. 左连接(LEFT JOIN):

3. 右连接(RIGHT JOIN):

4. 全连接(FULL JOIN):

5.注意事项:


1. 插入数据(Insert):

1. 插入数据的基本语法:

INSERT语句用于向表中插入新的行。

INSERT INTO table_name (column1, column2, ...)
VALUES (value1, value2, ...);
  • "table_name" 是要插入数据的表名。
  • "(column1, column2, ...)"是要插入数据的列名列表,可以指定插入特定的列,也可以使用通配符 `*` 表示插入所有列
  • "(value1, value2, ...)"是要插入的值列表,按照列的顺序对应相应的值。

示例:

INSERT INTO customers (name, email, phone)
VALUES ('John Doe', '[email protected]', '1234567890');

2. 使用`INSERT INTO ... SELECT`来插入查询结果:

除了直接插入值,还可以使用`INSERT INTO ... SELECT`语法将查询的结果插入到表中。

示例:

INSERT INTO new_customers (name, email, phone)
SELECT name, email, phone
FROM old_customers
WHERE age > 30;

这个示例将从 `old_customers` 表中选择年龄大于30的客户的姓名、邮箱和电话,并将结果插入到 `new_customers` 表中的相应列。

3. 插入数据的注意事项:

  •  确保插入的值与列的数据类型相匹配,否则会导致插入失败或出现意外结果。
  •  可以根据需要省略列名,但是必须指定值的列表,并确保按列的顺序插入相应的值。
  •  可以一次插入多行数据,只需要在VALUES子句中指定多组值。
  • 列名和值的数量必须一致。
  • 如果插入数据违反了表定义的约束(如唯一性约束),将会引发错误。

示例:

INSERT INTO customers (name, email, phone)
VALUES
  ('John Doe', '[email protected]', '1234567890'),
  ('Jane Smith', '[email protected]', '9876543210');

4. REPLACE语句:


REPLACE语句用于向表中插入新的行,如果行已存在,则先删除旧行,再插入新行。

基本语法:

REPLACE INTO table_name (column1, column2, ...)
VALUES (value1, value2, ...);
  • table_name 是要插入数据的表名。
  • (column1, column2, ...) 是要插入数据的列名列表,可以选择插入特定列,也可以插入所有列。
  • (value1, value2, ...) 是要插入的值列表,与列一一对应。

示例:

REPLACE INTO customers (name, email, phone)
VALUES ('John Doe', '[email protected]', '123456789');

这个示例将在"customers"表中插入一行数据,包括姓名、邮箱和电话号码。如果已存在具有相同主键或唯一键的行,则会先删除旧行,然后插入新行。

注意事项:

  • REPLACE语句适用于需要覆盖或更新已存在行的情况。
  • REPLACE语句会自动提交事务。
  • 如果表中有关联的外键,使用REPLACE语句可能会导致数据的完整性问题。

总结:

  • INSERT语句用于向表中插入新行,如果已存在行的主键或唯一键与插入值相同,则会引发错误。
  • REPLACE语句用于替换或更新已存在的行,如果已存在行的主键或唯一键与插入值相同,则会先删除旧行,再插入新行。

2. 更新数据(Update):

1. 更新数据的基本语法:

使用UPDATE语句来更新数据,通过SET子句指定要修改的列及其相应的新值。

基本语法:

UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;

 `table_name` 是要更新数据的表名。
SET子句用于指定要更新的列和对应的新值。
WHERE子句用于指定要更新的记录的条件,如果未提供WHERE子句,将更新所有记录

示例:

UPDATE customers
SET email = '[email protected]', phone = '9876543210'
WHERE id = 1;

这个示例将更新"customers"表中"id"为1的记录的"email"列为'[email protected]',"phone"列为'9876543210'。

2. 注意事项:

  • 使用WHERE子句来限制更新的记录,否则将会更新表中的所有记录。
  • 确保更新的值与列的数据类型相匹配,否则会导致更新失败或引发不符合预期的结果。
  • 可以同时更新多个列,只需要在SET子句中指定多个列及其对应的新值。
  • 更新数据时,最好使用唯一的条件(如主键),以确保更新的记录是准确的。
  • 在进行大批量数据更新时,要谨慎处理,可以通过备份数据或使用事务来避免意外的数据修改。

示例:

UPDATE products
SET price = price * 1.1, stock = stock - 1
WHERE category = 'Electronics';

这个示例将更新"products"表中"category"为'Electronics'的记录的"price"增加10%,"stock"减少1。

3. 删除数据(Delete):

1. 删除数据的基本语法:

使用DELETE语句来删除数据,通过FROM子句指定要删除的表和WHERE子句指定要删除的记录。

基本语法:

DELETE FROM table_name
WHERE condition;

 `table_name` 是要删除数据的表名。
 WHERE子句用于指定要删除的记录的条件,如果未提供WHERE子句,将删除表中的所有记录。

示例:

DELETE FROM customers
WHERE id = 1;

这个示例将删除"customers"表中"id"为1的记录。

2. 注意事项:

  • 删除操作是可逆的,可以通过备份或恢复来还原数据。
  • 使用WHERE子句来限制删除的记录,否则将删除表中的所有记录。
  • 可以根据需要使用多个条件来指定要删除的记录。
  •  在删除数据之前,最好先备份数据,以防止误操作导致数据丢失。
  • 删除带有外键约束的表中的数据时,需要注意外键关系,以避免破坏数据完整性。
  • DELETE语句是一条事务性语句,可以使用ROLLBACK来撤销操作。
  • DELETE操作是逐行删除,需要逐个检查符合条件的行,可能会对性能产生一些影响。

示例:

DELETE FROM orders
WHERE status = 'Cancelled' AND amount < 100;

这个示例将删除"orders"表中状态为"Cancelled"且金额小于100的订单记录。

3.TRUNCATE语句:


TRUNCATE语句用于从表中快速删除所有行,它比DELETE语句执行得更快。

基本语法:

TRUNCATE TABLE table_name;

table_name 是要清空数据的表名。

示例:

TRUNCATE TABLE customers;

这个示例将快速清空"customers"表中的所有数据,但保留表的结构。

TRUNCATE操作的注意事项:

  • TRUNCATE操作是DDL(数据定义语言)语句,它会自动提交事务,不能进行回滚。
  • TRUNCATE语句比DELETE语句执行得更快,因为它不会逐行检查和删除数据。
  • TRUNCATE操作会重置表的自增主键计数器,下一个插入的行将从初始值开始。

总结:

  • 使用DELETE语句删除特定的行,可以根据条件删除部分数据,是更灵活的删除方式。
  • 使用TRUNCATE语句快速清空整个表,适用于删除全部数据的场景。

4.查询语句(Select)

1. 基本查询语法:

使用SELECT语句来查询数据,可以选择特定的列或所有列,也可以使用WHERE子句来过滤查询条件。

基本语法:

SELECT column1, column2, ...
FROM table_name
WHERE condition;
  •  `column1, column2, ...` 是要查询的列名列表,可以选择指定要查询的列,也可以使用通配符 `*` 表示查询所有列。
  •  `table_name` 是要查询的表名。
  •  `condition` 是可选的,用于指定过滤查询的条件。

示例:

SELECT name, email, phone
FROM customers
WHERE age > 30;

2. 查询结果的排序:

可以使用ORDER BY子句对查询结果进行排序,可以按照一个或多个列进行升序(ASC)或降序(DESC)排序 ,ASC为默认,可以忽略不写;。

示例:

SELECT name, email, phone
FROM customers
WHERE age > 30
ORDER BY name ASC;

这个示例将查询年龄大于30的客户的姓名、邮箱和电话,并按姓名升序排序。

2.1 Having函数

HAVING函数用于在查询结果中过滤基于聚合函数的条件。

- HAVING语句必须与GROUP BY语句一起使用,并且位于GROUP BY之后。

示例:

SELECT city, COUNT(*) as total_customers
FROM customers
GROUP BY city
HAVING total_customers > 10;

这个示例将返回"customers"表中每个城市的客户数量大于10的结果,包括城市名称和客户数量。

注意事项:

  • HAVING语句主要用于过滤聚合函数的结果,可以使用聚合函数(如COUNT、SUM、AVG等)来计算相应的结果。
  • HAVING条件可以基于聚合函数的结果进行过滤,如大于、小于、等于等。
  • HAVING条件在查询结果生成之后应用,可以使用聚合函数的别名作为条件。

3. 查询结果的限制:

可以使用LIMIT子句限制查询结果的数量,可以指定返回的行数和偏移量。

基本语法:

SELECT column1, column2, ...
FROM table_name
LIMIT offset, count;
  • `table_name` 是要查询的表名。
  • `column1, column2, ...` 是要查询的列名列表,可以选择查询特定的列。
  •  `offset` 是要开始返回记录的偏移量(从0开始计数),表示要跳过的前面的记录数量。
  • `count` 是要返回的记录数量。

示例:

SELECT name, email
FROM customers
LIMIT 5;

这个示例将从"customers"表中选择前5条记录,并只返回"name"和"email"列。

注意事项:

  • `offset`和`count`均为非负整数。`offset`表示从查询结果的哪个位置开始返回记录,`count`表示返回的记录数量。
  •  LIMIT语句可用于SELECT语句中,用于限制查询结果的行数。
  • 如果省略`offset`,默认偏移量为0,即从结果集的第一条记录开始返回。
  •  如果省略`count`,将返回从`offset`开始的所有剩余记录。
  •  LIMIT语句也可与ORDER BY子句一起使用,以便在有序结果集中限制返回的行数。

示例:

SELECT name, email
FROM customers
ORDER BY created_date DESC
LIMIT 10;

这个示例将返回"customers"表中按创建日期倒序排列的前10个记录的"name"和"email"列。

4. 使用聚合函数查询数据:

聚合函数如SUM、COUNT、AVG等可以用于计算数据的总和、计数、平均值等。

常用有:

  • SUM()函数计算指定列中所有数值的总和。
  • AVG()函数计算指定列中所有数值的平均值。
  • COUNT()函数计算指定列中非NULL值的数量。
  • MIN()函数返回指定列中的最小值。
  • MAX()函数返回指定列中的最大值。

示例:

SELECT COUNT(*) as total_customers
FROM customers
WHERE age > 30;

这个示例将计算年龄大于30的客户的总数。

4.1count(*) 和 count(1)和count(列名)区别 

在MySQL中,COUNT函数用于计算满足条件的行数。count(*)、count(1)和count(列名)都是用于计算行数的常见用法,它们之间有一些细微的区别。下面是它们的详细说明:

1. COUNT(*):
COUNT(*)用于计算满足条件的行数,其中的`*`表示匹配所有行。

示例:

SELECT COUNT(*)
FROM customers;

这个示例将计算"customers"表中的所有行数。

区别和注意事项:

  • COUNT(*)会统计表中的所有行,不论是否包含NULL值。
  • COUNT(*)的计算速度可能比较慢,因为它需要遍历整个表来计算行数。
2. COUNT(1):
COUNT(1)用于计算满足条件的行数,其中的`1`表示匹配所有的行,可以看作是一个常量。

示例:

SELECT COUNT(1)
FROM customers;

这个示例将计算"customers"表中的所有行数,结果与COUNT(*)相同。

区别和注意事项:

  • COUNT(1)的作用与COUNT(*)类似,它们都用于计算行数。
  • COUNT(1)的计算速度可能会比COUNT(列名)略快,因为它只需要检查行的存在与否,而不涉及具体的列的值。
3. COUNT(列名):
COUNT(列名)用于计算特定列中非NULL值的行数。

示例:

SELECT COUNT(email)
FROM customers;

这个示例将计算"customers"表中具有非NULL值的email列的行数。

区别和注意事项:

  • COUNT(列名)统计特定列中非NULL值的行数。
  • COUNT(列名)的结果可能会小于表的总行数,因为它只计算特定列中非NULL值的行数。

5. 连接多个表查询数据:

当需要从多个表中检索相关数据时,可以使用JOIN操作来实现多表查询。

1. 内连接(INNER JOIN):

内连接根据两个表之间的关联条件,返回两个表中匹配的行。

基本语法:

SELECT columns
FROM table1
INNER JOIN table2
ON table1.column = table2.column;

示例:

SELECT orders.order_id, customers.customer_name
FROM orders
INNER JOIN customers
ON orders.customer_id = customers.customer_id;

这个示例中,通过将"orders"表与"customers"表连接,根据订单的顾客ID(customer_id)和顾客表中的顾客ID(customer_id),检索订单ID(order_id)和顾客名称(customer_name)的相关数据。

2. 左连接(LEFT JOIN):

左连接返回左表中的所有记录,以及与右表匹配的记录。

基本语法:

SELECT columns
FROM table1
LEFT JOIN table2
ON table1.column = table2.column;

示例:

SELECT customers.customer_name, orders.order_id
FROM customers
LEFT JOIN orders
ON customers.customer_id = orders.customer_id;

这个示例中,通过将"customers"表与"orders"表左连接,根据顾客表中的顾客ID(customer_id)和订单表中的顾客ID(customer_id),检索顾客名称(customer_name)和订单ID(order_id)的相关数据。即使某些顾客没有订单,也会包括在结果集中。

3. 右连接(RIGHT JOIN):

右连接返回右表中的所有记录,以及与左表匹配的记录。

基本语法:

SELECT columns
FROM table1
RIGHT JOIN table2
ON table1.column = table2.column;

示例:

SELECT customers.customer_name, orders.order_id
FROM customers
RIGHT JOIN orders
ON customers.customer_id = orders.customer_id;

这个示例中,通过将"customers"表与"orders"表右连接,根据顾客表中的顾客ID(customer_id)和订单表中的顾客ID(customer_id),检索顾客名称(customer_name)和订单ID(order_id)的相关数据。即使某些订单没有关联的顾客,也会包括在结果集中。

4. 全连接(FULL JOIN):

全连接返回左表和右表中的所有记录,如果没有匹配的记录,则填充NULL值。

只有少数数据库(如MySQL的版本8.0+)支持全连接,有些数据库可能使用其他语法(如MySQL使用UNION和LEFT JOIN/RIGHT JOIN实现)。

示例(使用UNION和LEFT JOIN):

SELECT customers.customer_name, orders.order_id
FROM customers
LEFT JOIN orders
ON customers.customer_id = orders.customer_id
UNION
SELECT customers.customer_name, orders.order_id
FROM customers
RIGHT JOIN orders
ON customers.customer_id = orders.customer_id
WHERE customers.customer_id IS NULL;

这个示例中,通过将左连接和右连接的结果使用UNION合并,以获取左表和右表中的所有记录。如果某些记录没有关联的数据,则使用WHERE子句将其筛选出来。

以上是一些常见的多表查询用法,具体的查询方式取决于数据表之间的关系和查询需求。请根据实际情况选择适合的连接类型和查询条件。

5.注意事项:

  • 确保使用正确的列和表名,避免拼写错误。
  • 指定正确的查询条件来过滤结果。
  • 在使用聚合函数时,考虑要查询的列的数据类型和适用的聚合函数。
  • 使用JOIN操作时,确保连接条件正确并了解使用的连接类型(如INNER JOIN、LEFT JOIN等)。
  • 当查询大量数据时,考虑使用合适的筛选和排序条件,以提高查询性能。

你可能感兴趣的:(mysql,数据库)