目录
2. 使用`INSERT INTO ... SELECT`来插入查询结果:
4.1count(*) 和 count(1)和count(列名)区别
1. COUNT(*):COUNT(*)用于计算满足条件的行数,其中的`*`表示匹配所有行。
2. COUNT(1):COUNT(1)用于计算满足条件的行数,其中的`1`表示匹配所有的行,可以看作是一个常量。
3. COUNT(列名):COUNT(列名)用于计算特定列中非NULL值的行数。
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等)。
- 当查询大量数据时,考虑使用合适的筛选和排序条件,以提高查询性能。