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的基本概念及其在实际数据库操作中的应用。

相关推荐
看山还是山,看水还是。7 分钟前
MySQL 管理
数据库·笔记·mysql·adb
fishmemory7sec14 分钟前
Koa2项目实战2(路由管理、项目结构优化)
数据库·mongodb·koa
momo小菜pa24 分钟前
【MySQL 09】表的内外连接
数据库·mysql
Jasonakeke32 分钟前
【重学 MySQL】四十九、阿里 MySQL 命名规范及 MySQL8 DDL 的原子化
数据库·mysql
程序猿小D33 分钟前
第二百六十九节 JPA教程 - JPA查询OrderBy两个属性示例
java·开发语言·数据库·windows·jpa
小宇成长录1 小时前
Mysql:数据库和表增删查改基本语句
数据库·mysql·数据库备份
团儿.2 小时前
解锁MySQL高可用新境界:深入探索MHA架构的无限魅力与实战部署
数据库·mysql·架构·mysql之mha架构
程序猿小D2 小时前
第二百六十七节 JPA教程 - JPA查询AND条件示例
java·开发语言·前端·数据库·windows·python·jpa
权^3 小时前
MySQL--聚合查询、联合查询、子查询、合并查询(上万字超详解!!!)
大数据·数据库·学习·mysql
Code成立3 小时前
1、深入理解Redis线程模型
数据库·redis·bootstrap