在当今数据驱动的时代,能够有效地管理和操作数据已成为一项关键技能。SQL(Structured Query Language)作为与关系型数据库交互的标准语言,是每个开发者、数据分析师和数据工程师必须掌握的工具。本文将全面介绍SQL的基础知识,帮助您建立坚实的SQL基础。

一、SQL概述
1.1 什么是SQL
SQL(结构化查询语言)是一种专门用于管理关系型数据库系统的编程语言。它允许用户:
-
创建和修改数据库结构
-
插入、更新、删除和查询数据
-
控制对数据的访问权限
-
确保数据完整性和安全性
SQL最初由IBM在1970年代开发,现已成为国际标准化组织(ISO)和美国国家标准协会(ANSI)的标准。
1.2 SQL的特点
SQL具有以下显著特点:
-
声明式语言:只需指定"做什么"而非"如何做"
-
标准化程度高:各大数据库厂商都支持标准SQL
-
功能强大:集数据定义、操作、控制于一体
-
简单易学:语法接近自然语言
1.3 SQL的分类
SQL语言按照功能可分为以下几类:
-
数据定义语言(DDL):用于定义和管理数据库对象
-
数据操作语言(DML):用于操作数据库中的数据
-
数据控制语言(DCL):用于控制数据访问权限
-
事务控制语言(TCL):用于管理数据库事务
二、数据定义语言(DDL)
2.1 数据库操作
-- 创建数据库
CREATE DATABASE company;
-- 选择当前使用的数据库
USE company;
-- 删除数据库
DROP DATABASE company;
2.2 表操作
表是关系型数据库中最基本的存储单元,由行和列组成。
-- 创建员工表
CREATE TABLE employees (
emp_id INT PRIMARY KEY AUTO_INCREMENT,
emp_name VARCHAR(50) NOT NULL,
gender CHAR(1) CHECK (gender IN ('M', 'F')),
birth_date DATE,
hire_date DATE NOT NULL,
department VARCHAR(50),
salary DECIMAL(10,2),
email VARCHAR(100) UNIQUE
);
-- 修改表结构
ALTER TABLE employees ADD COLUMN phone VARCHAR(15);
ALTER TABLE employees MODIFY COLUMN department VARCHAR(100);
ALTER TABLE employees DROP COLUMN phone;
-- 重命名表
RENAME TABLE employees TO staff;
-- 删除表
DROP TABLE staff;
2.3 约束的使用
约束用于保证数据的完整性和一致性:
CREATE TABLE products (
product_id INT PRIMARY KEY,
product_name VARCHAR(100) NOT NULL,
category VARCHAR(50) NOT NULL,
price DECIMAL(10,2) CHECK (price > 0),
stock_quantity INT DEFAULT 0,
supplier_id INT,
FOREIGN KEY (supplier_id) REFERENCES suppliers(supplier_id)
);
常用约束包括:
-
PRIMARY KEY:主键约束
-
FOREIGN KEY:外键约束
-
NOT NULL:非空约束
-
UNIQUE:唯一约束
-
CHECK:检查约束
-
DEFAULT:默认值约束
三、数据操作语言(DML)
3.1 插入数据
-- 插入单条记录
INSERT INTO employees (emp_name, gender, hire_date, department, salary)
VALUES ('张三', 'M', '2020-05-15', '技术部', 8500.00);
-- 插入多条记录
INSERT INTO employees (emp_name, gender, hire_date, department, salary)
VALUES
('李四', 'F', '2019-08-22', '市场部', 7800.00),
('王五', 'M', '2021-03-10', '技术部', 9200.00);
-- 从其他表插入数据
INSERT INTO new_employees
SELECT * FROM employees WHERE hire_date > '2022-01-01';
3.2 更新数据
-- 更新单个字段
UPDATE employees SET salary = 9000.00 WHERE emp_id = 1;
-- 更新多个字段
UPDATE employees
SET department = '研发部', salary = salary * 1.1
WHERE department = '技术部';
-- 使用子查询更新
UPDATE products
SET price = price * 0.9
WHERE category IN (SELECT category FROM categories WHERE discount = 'Y');
3.3 删除数据
-- 删除特定记录
DELETE FROM employees WHERE emp_id = 5;
-- 删除所有记录
DELETE FROM temp_data;
-- 使用子查询删除
DELETE FROM orders
WHERE customer_id IN (SELECT customer_id FROM customers WHERE status = 'inactive');
四、数据查询语言(DQL)
4.1 基本查询
-- 查询所有列
SELECT * FROM employees;
-- 查询特定列
SELECT emp_name, department, salary FROM employees;
-- 使用别名
SELECT emp_name AS 姓名, department AS 部门 FROM employees;
-- 去重查询
SELECT DISTINCT department FROM employees;
4.2 条件查询
-- 简单条件
SELECT * FROM employees WHERE salary > 8000;
-- 多条件组合
SELECT * FROM employees
WHERE department = '技术部' AND salary > 8000;
-- BETWEEN范围查询
SELECT * FROM employees
WHERE salary BETWEEN 7000 AND 9000;
-- IN操作符
SELECT * FROM employees
WHERE department IN ('技术部', '市场部');
-- LIKE模糊查询
SELECT * FROM employees
WHERE emp_name LIKE '张%';
-- NULL值判断
SELECT * FROM employees WHERE email IS NULL;
4.3 排序和分页
-- 单列排序
SELECT * FROM employees ORDER BY salary DESC;
-- 多列排序
SELECT * FROM employees
ORDER BY department ASC, salary DESC;
-- 分页查询(MySQL语法)
SELECT * FROM employees
ORDER BY hire_date DESC
LIMIT 10 OFFSET 20; -- 跳过20条,取10条
4.4 聚合函数
-- 常用聚合函数
SELECT
COUNT(*) AS 总人数,
AVG(salary) AS 平均工资,
MAX(salary) AS 最高工资,
MIN(salary) AS 最低工资,
SUM(salary) AS 工资总额
FROM employees;
-- 分组聚合
SELECT
department,
COUNT(*) AS 人数,
AVG(salary) AS 平均工资
FROM employees
GROUP BY department;
-- HAVING子句
SELECT
department,
AVG(salary) AS 平均工资
FROM employees
GROUP BY department
HAVING AVG(salary) > 8000;
4.5 连接查询
-- 内连接
SELECT e.emp_name, d.department_name
FROM employees e
INNER JOIN departments d ON e.department_id = d.department_id;
-- 左外连接
SELECT e.emp_name, d.department_name
FROM employees e
LEFT JOIN departments d ON e.department_id = d.department_id;
-- 右外连接
SELECT e.emp_name, d.department_name
FROM employees e
RIGHT JOIN departments d ON e.department_id = d.department_id;
-- 全外连接(MySQL不支持,可用UNION实现)
SELECT e.emp_name, d.department_name
FROM employees e
LEFT JOIN departments d ON e.department_id = d.department_id
UNION
SELECT e.emp_name, d.department_name
FROM employees e
RIGHT JOIN departments d ON e.department_id = d.department_id
WHERE e.emp_name IS NULL;
-- 自连接
SELECT e1.emp_name AS 员工, e2.emp_name AS 主管
FROM employees e1
LEFT JOIN employees e2 ON e1.manager_id = e2.emp_id;
4.6 子查询
-- WHERE子句中的子查询
SELECT * FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);
-- FROM子句中的子查询
SELECT dept.avg_salary
FROM (SELECT department, AVG(salary) AS avg_salary
FROM employees GROUP BY department) dept
WHERE dept.avg_salary > 8000;
-- EXISTS子查询
SELECT * FROM departments d
WHERE EXISTS (SELECT 1 FROM employees e
WHERE e.department_id = d.department_id);
五、数据控制语言(DCL)
5.1 权限管理
-- 授予权限
GRANT SELECT, INSERT ON employees TO user1;
-- 授予所有权限
GRANT ALL PRIVILEGES ON database.* TO 'admin'@'localhost';
-- 撤销权限
REVOKE INSERT ON employees FROM user1;
-- 查看权限
SHOW GRANTS FOR user1;
5.2 事务控制
-- 开始事务
START TRANSACTION;
-- 执行SQL语句
UPDATE accounts SET balance = balance - 1000 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 1000 WHERE account_id = 2;
-- 提交或回滚
COMMIT; -- 或 ROLLBACK;
六、SQL函数
6.1 字符串函数
SELECT
CONCAT(first_name, ' ', last_name) AS full_name,
UPPER(last_name) AS last_name_upper,
LENGTH(first_name) AS name_length,
SUBSTRING(email, 1, 5) AS email_prefix,
REPLACE(phone, '-', '') AS formatted_phone
FROM employees;
6.2 数值函数
SELECT
ROUND(salary, 0) AS rounded_salary,
CEIL(salary) AS ceiling_salary,
FLOOR(salary) AS floor_salary,
ABS(salary_diff) AS absolute_diff,
MOD(employee_id, 10) AS mod_result
FROM employees;
6.3 日期函数
SELECT
NOW() AS current_datetime,
CURDATE() AS current_date,
DATEDIFF(NOW(), hire_date) AS days_employed,
DATE_FORMAT(hire_date, '%Y年%m月%d日') AS formatted_hire_date,
YEAR(hire_date) AS hire_year
FROM employees;
七、SQL最佳实践
-
命名规范:使用有意义的名称,保持一致性
-
使用注释:解释复杂查询的逻辑
-
**避免SELECT ***:只查询需要的列
-
合理使用索引:提高查询性能
-
参数化查询:防止SQL注入
-
事务管理:确保数据一致性
-
定期备份:防止数据丢失
结语
SQL作为关系型数据库的标准查询语言,其重要性不言而喻。本文涵盖了SQL的基础知识,从数据定义到数据操作,从简单查询到复杂连接,为您提供了全面的SQL入门指南。掌握这些基础知识后,您可以进一步学习高级SQL特性,如窗口函数、CTE(公用表表达式)、存储过程和触发器等。
记住,SQL技能需要通过实践来巩固。建议您安装一个数据库系统(如MySQL、PostgreSQL或SQLite),创建一些示例数据库,并尝试执行各种SQL语句。随着实践的深入,您将能够编写更高效、更复杂的SQL查询,从而更好地管理和分析数据。