SQL总结

一、SQL 概述

SQL (Structured Query Language) 是一种标准的数据库查询语言,用于管理和操作关系数据库。SQL 包含两部分:数据定义语言 (DDL) 和数据操作语言 (DML)。

二、数据定义语言 (DDL)

DDL 用于定义和修改数据库结构,包括创建、修改和删除数据库对象。

  1. 创建表

    sql 复制代码
    CREATE TABLE 表名 (
        列名 数据类型 [约束条件],
        ...
        [PRIMARY KEY (主键列名)],
        [FOREIGN KEY (外键列名) REFERENCES 参考表(参考列名)]
    );

    示例:

    sql 复制代码
    CREATE TABLE Sailors (
        sid INTEGER,
        sname CHAR(20),
        rating INTEGER,
        age FLOAT,
        PRIMARY KEY (sid)
    );
  2. 修改表

    sql 复制代码
    ALTER TABLE 表名
    ADD 列名 数据类型 [约束条件];
    
    ALTER TABLE 表名
    DROP COLUMN 列名;
  3. 删除表

    sql 复制代码
    DROP TABLE 表名;
三、数据操作语言 (DML)

DML 用于查询和修改数据库中的数据,包括插入、更新、删除和查询操作。

  1. 插入数据

    sql 复制代码
    INSERT INTO 表名 (列名1, 列名2, ...)
    VALUES (值1, 值2, ...);

    示例:

    sql 复制代码
    INSERT INTO Sailors (sid, sname, rating, age)
    VALUES (1, 'Fred', 7, 22);
  2. 更新数据

    sql 复制代码
    UPDATE 表名
    SET 列名1 = 值1, 列名2 = 值2, ...
    WHERE 条件;

    示例:

    sql 复制代码
    UPDATE Sailors
    SET rating = 8
    WHERE sname = 'Fred';
  3. 删除数据

    sql 复制代码
    DELETE FROM 表名
    WHERE 条件;

    示例:

    sql 复制代码
    DELETE FROM Sailors
    WHERE sname = 'Fred';
  4. 查询数据

    sql 复制代码
    SELECT [DISTINCT] 列名1, 列名2, ...
    FROM 表名
    [WHERE 条件]
    [GROUP BY 列名]
    [HAVING 条件]
    [ORDER BY 列名 [ASC|DESC]]
    [LIMIT 数量];

    示例:

    sql 复制代码
    SELECT sname, age
    FROM Sailors
    WHERE age > 25
    ORDER BY age DESC;
四、查询语句的执行顺序

SQL 查询语句的执行顺序通常如下:

  1. FROM:确定查询的数据来源。
  2. WHERE:过滤数据。
  3. GROUP BY:对数据进行分组。
  4. HAVING:过滤分组后的数据。
  5. SELECT:选择要显示的列。
  6. DISTINCT:去除重复行。
  7. ORDER BY:对结果排序。
  8. LIMIT:限制返回的行数。
五、常用的SQL功能和操作
  1. DISTINCT

    去除查询结果中的重复行。

    sql 复制代码
    SELECT DISTINCT 列名 FROM 表名;
  2. 排序 (ORDER BY)

    按指定列对查询结果进行排序,默认升序排列。

    sql 复制代码
    SELECT 列名 FROM 表名 ORDER BY 列名 [ASC|DESC];
  3. 聚合函数

    • AVG(): 计算平均值
    • SUM(): 计算总和
    • COUNT(): 计算数量
    • MAX(): 计算最大值
    • MIN(): 计算最小值

    示例:

    sql 复制代码
    SELECT AVG(age) FROM Sailors;
  4. 分组 (GROUP BY)

    将查询结果按指定列进行分组,并对每个分组应用聚合函数。

    sql 复制代码
    SELECT 列名, 聚合函数(列名)
    FROM 表名
    GROUP BY 列名;
  5. HAVING

    用于过滤分组后的数据,类似于 WHERE,但作用于分组结果。

    sql 复制代码
    SELECT 列名, 聚合函数(列名)
    FROM 表名
    GROUP BY 列名
    HAVING 聚合函数(列名) 条件;
  6. LIMIT

    限制返回的行数。

    sql 复制代码
    SELECT 列名 FROM 表名 LIMIT 数量;
六、示例数据库

以下是一个示例数据库,包括三张表:Sailors, Boats, Reserves。

  1. Sailors 表

    sql 复制代码
    CREATE TABLE Sailors (
        sid INTEGER PRIMARY KEY,
        sname CHAR(20),
        rating INTEGER,
        age FLOAT
    );

    示例数据:

    sid sname rating age
    1 Fred 7 22
    2 Jim 2 39
    3 Nancy 8 27
  2. Boats 表

    sql 复制代码
    CREATE TABLE Boats (
        bid INTEGER PRIMARY KEY,
        bname CHAR(20),
        color CHAR(10)
    );

    示例数据:

    bid bname color
    101 Nina red
    102 Pinta blue
    103 Santa Maria red
  3. Reserves 表

    sql 复制代码
    CREATE TABLE Reserves (
        sid INTEGER,
        bid INTEGER,
        day DATE,
        PRIMARY KEY (sid, bid, day),
        FOREIGN KEY (sid) REFERENCES Sailors(sid),
        FOREIGN KEY (bid) REFERENCES Boats(bid)
    );

    示例数据:

    sid bid day
    1 102 2023-09-12
    2 102 2023-09-13
七、高级查询
  1. 多表连接

    • 内连接(INNER JOIN):返回两个表中匹配的行。

      sql 复制代码
      SELECT Person.name, Orders.order_id
      FROM Person
      INNER JOIN Orders ON Person.person_id = Orders.person_id;
    • 左连接(LEFT JOIN):返回包括左表中所有行及右表中匹配的行。

      sql 复制代码
      SELECT Person.name, Orders.order_id
      FROM Person
      LEFT JOIN Orders ON Person.person_id = Orders.person_id;
    • 右连接(RIGHT JOIN):返回包括右表中所有行及左表中匹配的行。

      sql 复制代码
      SELECT Person.name, Orders.order_id
      FROM Person
      RIGHT JOIN Orders ON Person.person_id = Orders.person_id;
    • 全连接(FULL JOIN):返回包括左右表中所有行。

      sql 复制代码
      SELECT Person.name, Orders.order_id
      FROM Person
      FULL JOIN Orders ON Person.person_id = Orders.person_id;
  2. 集合操作

    • UNION 操作:用于合并两个或多个SELECT语句的结果集。

      sql 复制代码
      SELECT name FROM Person
      UNION
      SELECT name FROM Employees;
    • INTERSECT 操作:用于返回两个SELECT语句结果集的交集。

      sql 复制代码
      SELECT name FROM Person
      INTERSECT
      SELECT name FROM Employees;
    • EXCEPT 操作:用于返回第一个SELECT语句结果集中存在但在第二个SELECT语句结果集中不存在的行。

      sql 复制代码
      SELECT name FROM Person
      EXCEPT
      SELECT name FROM Employees;
  3. 子查询

    • 基本子查询 :子查询用于在另一个查询的 WHERE 子句中嵌套查询。

      sql 复制代码
      SELECT num
      FROM enrollment
      WHERE students >= (
        SELECT AVG(students)
        FROM enrollment
      );
    • 相关子查询:子查询依赖于外部查询。

      sql 复制代码
      SELECT *
      FROM classes
      WHERE EXISTS (
        SELECT *
        FROM enrollment
        WHERE classes.num = enrollment.num
      );
  4. 谓词逻辑

    • 常用的谓词逻辑操作符包括 EXISTSANYALLIN 等。

    • 示例:

      sql 复制代码
      SELECT name
      FROM Sailors
      WHERE age > ALL (
        SELECT age
        FROM Sailors
        WHERE rating > 7
      );
八、示例查询及其结果
  1. 查询所有年龄为27的水手的姓名和等级:

    sql 复制代码
    SELECT sname, rating
    FROM Sailors
    WHERE age = 27;

    结果:

    sname rating
    Nancy 8
  2. 查询评级大于5的水手的ID及其预定的船只ID:

    sql 复制代码
    SELECT S.sid, R.bid
    FROM Sailors AS S
    JOIN Reserves AS R ON S.sid = R.sid
    WHERE S.rating > 5;

    结果:

    sid bid
    1 102
九、结论

这份SQL学习笔记涵盖了基本的SQL查询、复杂查询、多表连接、集合操作及高级查询技术。通过这些例子和解释,可以帮助理解SQL的基本概念及其在实际数据库操作中的应用。

相关推荐
安审若无3 小时前
Oracle 打补丁指南
数据库·oracle
樱花的浪漫3 小时前
Cuda reduce算子实现与优化
数据库·人工智能·深度学习·神经网络·机器学习·自然语言处理
啊森要自信3 小时前
【MySQL 数据库】MySQL用户管理
android·c语言·开发语言·数据库·mysql
kkkkk0211063 小时前
Redis八股
数据库·redis·缓存
Liu1bo4 小时前
【MySQL】表的约束
linux·数据库·mysql
胖胖的战士4 小时前
Mysql 数据库迁移
数据库·mysql
czhc11400756634 小时前
LINUX1012 mysql GLIBC安装
数据库·mysql
DemonAvenger5 小时前
深入 Redis Hash:从原理到实战,10 年经验的后端工程师带你玩转哈希结构
数据库·redis·性能优化
❥ღ Komo·5 小时前
PHP数据库操作全攻略
数据库·oracle
程序新视界5 小时前
MySQL的整体架构及功能详解
数据库·后端·mysql