本文目录导读:
《数据库SQL语句全解析:常用的151条SQL语句深度剖析》
图片来源于网络,如有侵权联系删除
SQL基础查询语句
1、简单查询
- 从单个表中查询所有列:
- 在关系型数据库(如MySQL)中,使用SELECT * FROM table_name;
语句,如果有一个名为employees
的表,包含员工的各种信息,这条语句可以获取所有员工的所有信息,这里的是通配符,表示所有列。
- 查询特定列:
SELECT column1, column2 FROM table_name;
,比如在employees
表中,只想获取员工的姓名和职位信息,可以使用SELECT name, position FROM employees;
,这样可以减少数据传输量,提高查询效率。
2、条件查询
- 使用WHERE
子句:
SELECT * FROM table_name WHERE condition;
,在students
表中查询年龄大于20岁的学生,SELECT * FROM students WHERE age > 20;
。WHERE
子句中的条件可以使用比较运算符(如>
、<
、=
等)、逻辑运算符(如AND
、OR
、NOT
),查询年龄在18到22岁之间的学生,SELECT * FROM students WHERE age >= 18 AND age <= 22;
。
- 模糊查询:
- 使用LIKE
关键字,如果要查询名字中包含“张”字的员工,在employees
表中可以使用SELECT * FROM employees WHERE name LIKE '%张%';
,其中%
是通配符,表示任意字符序列(包括空字符序列),如果只想查询以“张”字开头的员工名字,可以使用SELECT * FROM employees WHERE name LIKE '张%';
。
数据操作语句
1、插入数据(INSERT)
- 插入单条数据:
- 在MySQL中,INSERT INTO table_name (column1, column2, …) VALUES (value1, value2, …);
,向products
表中插入一个新产品的信息,INSERT INTO products (product_name, price, quantity) VALUES ('iPhone 13', 5999, 100);
,这里要确保列名和值的顺序是一一对应的,并且数据类型要匹配。
- 插入多条数据:
- 可以使用多条INSERT
语句,也可以使用一条INSERT
语句插入多条数据。INSERT INTO employees (name, age, department) VALUES ('张三', 25, '销售部'), ('李四', 28, '技术部');
。
2、更新数据(UPDATE)
- 基本语法:
UPDATE table_name SET column1 = value1, column2 = value2, … WHERE condition;
,在students
表中,将年龄为20岁的学生的班级更新为“二班”,UPDATE students SET class = '二班' WHERE age = 20;
,如果没有WHERE
子句,将会更新表中的所有行,这在大多数情况下是非常危险的操作,可能会导致数据丢失或错误。
3、删除数据(DELETE)
- 删除特定行:
DELETE FROM table_name WHERE condition;
,从orders
表中删除订单状态为“已取消”的订单,DELETE FROM orders WHERE status = '已取消';
。
- 删除所有行:
DELETE FROM table_name;
会删除表中的所有数据,但表结构仍然存在,如果要彻底删除表(包括表结构),在MySQL中可以使用DROP TABLE table_name;
。
数据排序与分组
1、排序(ORDER BY)
- 升序排序:
SELECT * FROM table_name ORDER BY column_name ASC;
,查询products
表中的产品信息,并按照价格升序排列,SELECT * FROM products ORDER BY price ASC;
。
- 降序排序:
SELECT * FROM table_name ORDER BY column_name DESC;
,如果要按照销售量降序排列产品信息,可以使用SELECT * FROM products ORDER BY sales_volume DESC;
。
2、分组(GROUP BY)
- 简单分组:
SELECT column1, COUNT(*) FROM table_name GROUP BY column1;
,在orders
表中,按照客户ID分组,统计每个客户的订单数量,SELECT customer_id, COUNT(*) FROM orders GROUP BY customer_id;
。
- 分组后筛选(HAVING):
- 与WHERE
子句不同,HAVING
用于在分组后对组进行筛选,在上述按客户ID分组统计订单数量的基础上,只显示订单数量大于5的客户,SELECT customer_id, COUNT(*) FROM orders GROUP BY customer_id HAVING COUNT(*) > 5;
。
多表查询
1、内连接(INNER JOIN)
- 语法:
SELECT column1, column2 FROM table1 INNER JOIN table2 ON table1.column = table2.column;
,有一个employees
表和一个departments
表,employees
表中有department_id
列,departments
表中有id
列,要查询员工及其所属部门的信息,可以使用SELECT employees.name, departments.department_name FROM employees INNER JOIN departments ON employees.department_id = departments.id;
,内连接只会返回两个表中满足连接条件的行。
2、外连接(LEFT JOIN、RIGHT JOIN)
图片来源于网络,如有侵权联系删除
- 左外连接(LEFT JOIN):
SELECT column1, column2 FROM table1 LEFT JOIN table2 ON table1.column = table2.column;
,查询所有员工及其所属部门的信息,如果员工没有所属部门也要显示员工信息,就可以使用左外连接,左外连接会返回左表(table1
)中的所有行,以及右表(table2
)中满足连接条件的行,如果右表中没有匹配的行,则相应的列显示为NULL
。
- 右外连接(RIGHT JOIN):
- 与左外连接类似,只是以右表为基础。SELECT column1, column2 FROM table1 RIGHT JOIN table2 ON table1.column = table2.column;
,它会返回右表中的所有行,以及左表中满足连接条件的行,如果左表中没有匹配的行,则相应的列显示为NULL
。
子查询
1、标量子查询
- 标量子查询是返回单个值的子查询,在students
表中查询年龄大于平均年龄的学生,先计算平均年龄:SELECT AVG(age) FROM students;
,然后将这个结果作为子查询使用在主查询中,SELECT * FROM students WHERE age > (SELECT AVG(age) FROM students);
。
2、列子查询
- 列子查询返回一列值,在products
表中查询价格高于所有电子产品价格的非电子产品,首先查询电子产品的价格列SELECT price FROM products WHERE category = '电子产品';
,然后在主查询中使用这个子查询,SELECT * FROM products WHERE category!= '电子产品' AND price > ALL (SELECT price FROM products WHERE category = '电子产品');
,这里的ALL
关键字表示要满足子查询结果列中的所有值的比较条件。
数据库函数
1、聚合函数
COUNT
函数:
- 用于计算表中的行数或某列的非空值个数。SELECT COUNT(*) FROM table_name;
会返回表中的总行数,如果要计算某列的非空值个数,如计算students
表中有多少学生填写了家庭住址,可以使用SELECT COUNT(address) FROM students;
。
SUM
函数:
- 用于计算某列数值的总和,在orders
表中,如果有amount
列表示订单金额,要计算所有订单的总金额,可以使用SELECT SUM(amount) FROM orders;
。
AVG
函数:
- 计算某列数值的平均值,如计算products
表中产品的平均价格,SELECT AVG(price) FROM products;
。
MAX
和MIN
函数:
- 分别用于获取某列的最大值和最小值,在students
表中查询年龄最大和最小的学生,SELECT MAX(age), MIN(age) FROM students;
。
2、字符串函数
- 在MySQL中,CONCAT
函数用于连接字符串,在employees
表中,将员工的姓和名连接成一个完整的姓名,SELECT CONCAT(last_name, first_name) FROM employees;
。
SUBSTRING
函数用于提取字符串的子串,从一个包含完整地址的列中提取城市名称(假设城市名称在地址的中间部分),SELECT SUBSTRING(address, start_position, length) FROM table_name;
,这里需要根据实际的地址格式确定start_position
和length
的值。
3、日期和时间函数
- 在数据库中,日期和时间函数非常重要,在MySQL中,CURRENT_DATE
函数返回当前日期,CURRENT_TIME
函数返回当前时间,CURRENT_TIMESTAMP
函数返回当前日期和时间,如果要查询orders
表中今天下的订单,可以使用SELECT * FROM orders WHERE order_date = CURRENT_DATE;
。
- 计算日期差值也很常见,计算两个日期之间的天数差,可以使用DATEDIFF
函数,如果有一个start_date
列和一个end_date
列,要计算它们之间的天数差,SELECT DATEDIFF(end_date, start_date) FROM table_name;
。
创建和管理数据库对象
1、创建表(CREATE TABLE)
- 基本语法:
CREATE TABLE table_name (column1 data_type constraint1, column2 data_type constraint2, …);
,创建一个customers
表,包含id
(整数类型,主键)、name
(字符串类型)、email
(字符串类型,唯一约束)等列,CREATE TABLE customers (id INT PRIMARY KEY, name VARCHAR(50), email VARCHAR(100) UNIQUE);
,这里的PRIMARY KEY
用于定义主键,UNIQUE
用于定义唯一约束,确保列中的值是唯一的。
2、修改表(ALTER TABLE)
- 添加列:
ALTER TABLE table_name ADD column_name data_type;
,在products
表中添加一个description
列,ALTER TABLE products ADD description VARCHAR(200);
。
- 修改列的数据类型:
ALTER TABLE table_name MODIFY column_name new_data_type;
,如果要将students
表中的phone_number
列的数据类型从VARCHAR(10)
修改为VARCHAR(15)
,ALTER TABLE students MODIFY phone_number VARCHAR(15);
。
- 删除列:
ALTER TABLE table_name DROP column_name;
,从orders
表中删除一个不再使用的extra_info
列,ALTER TABLE orders DROP extra_info;
。
3、创建索引(CREATE INDEX)
- 索引可以提高查询效率,在employees
表中的name
列上创建索引,CREATE INDEX index_name ON employees (name);
,索引的创建需要谨慎,因为虽然它可以提高查询速度,但也会增加插入、更新和删除操作的开销,因为数据库需要维护索引结构。
视图的创建和使用
1、创建视图(CREATE VIEW)
- 视图是一个虚拟的表,它是基于一个或多个表的查询结果,创建一个视图来显示员工的姓名和部门名称,CREATE VIEW employee_department_view AS SELECT employees.name, departments.department_name FROM employees INNER JOIN departments ON employees.department_id = departments.id;
。
图片来源于网络,如有侵权联系删除
2、使用视图
- 视图可以像普通表一样被查询,查询上述创建的视图中的数据,SELECT * FROM employee_department_view;
,视图的好处是可以简化复杂的查询,隐藏底层表的结构和数据复杂性,并且可以提供一定的数据安全性,因为用户可以通过视图访问数据而不需要直接访问底层表。
事务处理
1、事务的概念
- 事务是一组数据库操作,这些操作要么全部成功执行,要么全部失败回滚,在银行转账系统中,从一个账户转出资金并转入另一个账户就是一个事务,这个事务包含两个操作:从转出账户扣除金额和向转入账户增加金额,如果其中一个操作失败,整个事务应该回滚,以确保数据的一致性。
2、事务的操作(以MySQL为例)
- 开始事务:
- 使用START TRANSACTION;
语句开始一个事务。
- 执行事务中的操作:
- 在转账事务中,执行更新账户余额的操作,UPDATE accounts SET balance = balance - amount WHERE account_id = from_account_id;
和UPDATE accounts SET balance = balance + amount WHERE account_id = to_account_id;
。
- 提交事务或回滚事务:
- 如果所有操作都成功,可以使用COMMIT;
语句提交事务,使操作永久生效,如果在事务执行过程中出现错误,可以使用ROLLBACK;
语句回滚事务,将数据恢复到事务开始之前的状态。
存储过程和函数
1、存储过程的概念和创建(以MySQL为例)
- 存储过程是一组预编译的SQL语句,存储在数据库中,可以被重复调用,创建一个存储过程来查询指定部门的员工信息。
- 使用CREATE PROCEDURE procedure_name (parameter1 data_type, parameter2 data_type, …)
语句创建存储过程。
```sql
CREATE PROCEDURE get_employees_by_department (IN department_name VARCHAR(50))
BEGIN
SELECT * FROM employees WHERE department = department_name;
END;
```
- 调用存储过程:
- 使用CALL procedure_name (parameter_value);
语句调用存储过程,要查询销售部门的员工信息,CALL get_employees_by_department('销售部门');
。
2、函数的概念和创建(以MySQL为例)
- 函数与存储过程类似,但函数必须返回一个值,创建一个函数来计算两个数的和。
- 使用CREATE FUNCTION function_name (parameter1 data_type, parameter2 data_type) RETURNS return_data_type
语句创建函数。
```sql
CREATE FUNCTION add_numbers (IN num1 INT, IN num2 INT) RETURNS INT
BEGIN
RETURN num1 + num2;
END;
```
- 使用函数:
- 函数可以在查询中使用,就像使用普通的数据库函数一样。SELECT add_numbers(3, 5);
会返回8。
在数据库的实际应用中,熟练掌握这些SQL语句是非常重要的,无论是小型的本地数据库应用,还是大型的企业级数据库系统,这些SQL语句都构成了数据操作和管理的基础,合理地运用这些语句,可以提高数据库的性能、确保数据的准确性和一致性,并且能够有效地满足各种业务需求,随着数据库技术的不断发展,新的SQL特性和功能也在不断涌现,但这些基本的SQL语句仍然是构建复杂数据库应用的基石。
通过深入学习和实践这151条常用的SQL语句,数据库开发人员和管理员可以更好地应对各种数据库相关的任务,从简单的数据查询和操作到复杂的多表关联、事务处理以及存储过程和函数的使用等,不同的数据库管理系统(如Oracle、SQL Server、PostgreSQL等)虽然在语法和功能上可能存在一些差异,但这些基本的SQL概念和语句在很大程度上是通用的,只是在具体的实现细节上有所不同,掌握这些通用的SQL语句是深入学习和使用各种数据库管理系统的重要起点。
评论列表