SQL语言基础:从入门到掌握结构化查询语言

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

一、SQL概述

1.1 什么是SQL

SQL(结构化查询语言)是一种专门用于管理关系型数据库系统的编程语言。它允许用户:

  • 创建和修改数据库结构

  • 插入、更新、删除和查询数据

  • 控制对数据的访问权限

  • 确保数据完整性和安全性

SQL最初由IBM在1970年代开发,现已成为国际标准化组织(ISO)和美国国家标准协会(ANSI)的标准。

1.2 SQL的特点

SQL具有以下显著特点:

  1. 声明式语言:只需指定"做什么"而非"如何做"

  2. 标准化程度高:各大数据库厂商都支持标准SQL

  3. 功能强大:集数据定义、操作、控制于一体

  4. 简单易学:语法接近自然语言

1.3 SQL的分类

SQL语言按照功能可分为以下几类:

  1. 数据定义语言(DDL):用于定义和管理数据库对象

  2. 数据操作语言(DML):用于操作数据库中的数据

  3. 数据控制语言(DCL):用于控制数据访问权限

  4. 事务控制语言(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最佳实践

  1. 命名规范:使用有意义的名称,保持一致性

  2. 使用注释:解释复杂查询的逻辑

  3. **避免SELECT ***:只查询需要的列

  4. 合理使用索引:提高查询性能

  5. 参数化查询:防止SQL注入

  6. 事务管理:确保数据一致性

  7. 定期备份:防止数据丢失

结语

SQL作为关系型数据库的标准查询语言,其重要性不言而喻。本文涵盖了SQL的基础知识,从数据定义到数据操作,从简单查询到复杂连接,为您提供了全面的SQL入门指南。掌握这些基础知识后,您可以进一步学习高级SQL特性,如窗口函数、CTE(公用表表达式)、存储过程和触发器等。

记住,SQL技能需要通过实践来巩固。建议您安装一个数据库系统(如MySQL、PostgreSQL或SQLite),创建一些示例数据库,并尝试执行各种SQL语句。随着实践的深入,您将能够编写更高效、更复杂的SQL查询,从而更好地管理和分析数据。

相关推荐
奔驰的小野码7 分钟前
SpringAI实现AI应用-使用redis持久化聊天记忆
java·数据库·人工智能·redis·spring
hweiyu0042 分钟前
MySQL性能分析工具:SHOW PROCESSLIST
数据库·mysql
Navicat中国3 小时前
Navicat BI 数据分析功能上线 | 数据洞察新方法
数据库·人工智能·信息可视化·数据挖掘·数据分析·navicat·bi
八股文领域大手子4 小时前
Spring Boot Controller 如何处理HTTP请求体
java·开发语言·sql·spring·spring cloud
AI大模型顾潇4 小时前
[特殊字符] Milvus + LLM大模型:打造智能电影知识库系统
数据库·人工智能·机器学习·大模型·llm·llama·milvus
阿里云云原生4 小时前
阿里云 SLS 多云日志接入最佳实践:链路、成本与高可用性优化
数据库·阿里云·云计算
kaixiang3005 小时前
sqli-labs靶场18-22关(http头)
数据库
Pasregret5 小时前
MySQL 安全架构:从渗透测试到合规审计
数据库·mysql·安全架构