• 【数据库】SQL语句


    SQL 分为两个部分:数据操作语言(DML)和 数据定义语言(DDL)。
    增删改查(CRUD)构成了 SQL 的 DML 部分。

    • SELECT - 从数据库表中获取数据
      • SELECT 列名 FROM 表名
      • SELECT * FROM 表名
        • SELECT COUNT(*) FROM 表名
      • SELECT DISTINCT 列名 FROM 表名  (只显示结果不同的项)
      • SELECT 列名 FROM 表名 WHERE 列 运算符 值
        • 一些特别的操作符

          操作符 描述
          <> 不等于
          BETWEEN 在某个范围内
          LIKE 搜索某种模式
        • LIKENOT LIKE 搜索的模式:
          • % 表示一个或多个字符
          • _ 表示一个字符
          • [charlist] 表示字符列中的任何单一字符
          • [^charlist] 或者 [!charlist] 表示不在字符列中的任何单一字符
        • WHERE 列名 IS NULL
          • 查找空字段不能用 =NULL !
        • IN 允许在 WHERE 子句中规定多个值。
          • WHERE 列名 IN (值1, 值2, ...)
            这种方法比 WHERE 列名 = 值1 OR 列名 = 值2 效率高
        • 操作符 BETWEEN ... AND 会选取介于两个值之间的数据范围,这些值可以是数值、文本或者日期。
          • SELECT 列名 FROM 表名 WHERE 列名 (NOT) BETWEEN 值1 AND 值2
          • 不同的数据库对 BETWEEN AND 操作符的区间处理有差异,有开区间、闭区间、左闭右开。
        • AND 和 OR 可在 WHERE 子语句中把多个条件结合起来,可以使用圆括号来组成复杂的表达式。
        • WHERE 列名=(SELECT ……)
          • e.g. SELECT …… WHERE birthday=(SELECT MIN(birthday) FROM ……)
      • ORDER BY 语句用于根据指定的列对结果集进行排序(默认升序)。
        • e.g. SELECT …… ORDER BY 列1 DESC, 列2 ASC
      • 分组查询 GROUP BY
        • GROUP BY 列名
          • 根据分组字段的值将一个数据集划分成各个不同的小组,然后分别按照各个组别进行相应的查询。
            SELECT * …… GROUP BY 列名    将只会返回各个分组的第一条数据,这种查询通常没什么意义。
            因此常与 COUNT(),MAX()  等统计函数结合使用。
        • HAVING 用于对统计函数进行条件判断
          • 由于 “ SELECT COUNT(*) FROM 表名 WHERE COUNT(*) GROUP BY 列名 ” 语句中 WHERE 关键字无法与统计函数一起使用,该语句错误!
          • e.g. GROUP BY 列名 HAVING 统计函数(列名2) 运算符 值
        • GROUP BY 列名1, 列名2, ....
          • 首先根据列名1的字段值分组,再在每个分组里根据列名2的字段值分组
      • 规定要返回的记录的数目
        • SQL Server:
          • SELECT TOP 3 列名 FROM 表名
          • SELECT TOP 50 PERCENT 列名 FROM 表名
        • MySQL:
          • SELECT 列名 FROM 表名 LIMIT 3
        • Oracle:
          • SELECT 列名 FROM 表名 WHERE ROWNUM <= 3
      • AS 为列名或表名指定别名(AS 可以省略,但建议加上以增加语句可读性)
        • 表名的别名
          • SELECT 列名 FROM 表名1 AS 别名1, 表名2 AS 别名2
          • 表名的别名使查询程序的 WHERE 语句更易阅读和书写
        • 列名的别名
          • SELECT 列名1 AS 别名1, 列名2 AS 别名2 FROM 表名
      • JOIN
        • JOIN / INNER JOIN
          • 内连接返回左右两表中匹配的行
          • SELECT .... FROM 表1, 表2, 表3, .... WHERE 表1.列=表2.列 and 表2.列=表3.列 ....
            这种传统跨表查询可替换为
            SELECT .... FROM 表1 [INNER] JOIN 表2 ON 表1.列=表2.列 JOIN 表3 ON 表2.列=表3.列 .... WHERE ....
        • LEFT JOIN
          • 将左边的表设置为主表来连接右边的表,即使左表中的数据在右表中没有匹配,会自动使用 NULL 替代
        • RIGHT JOIN
          • 将右边的表设置为主表来连接左边的表,即使右表中的数据在左表中没有匹配,会自动使用 NULL 替代
    • UPDATE - 更新数据库表中的数据
      • UPDATE 表名 SET 列1 = 值1, 列2 = 值2 WHERE ……
    • DELETE - 从数据库表中删除数据
      • DELETE FROM 表名 WHERE ……
      • DELETE FROM 表名 或 DELETE * FROM 表名
    • INSERT INTO - 向数据库表中插入数据
      • INSERT INTO 表名 VALUES (值1, 值2, ....)  -- 不写列名必须写出所有字段值!
      • INSERT INTO 表名 (列1, 列2, ...) VALUES (值1, 值2, ....)
      • 插入另一个表中的多行数据:
        INSERT INTO 表名1 (列1, 列2,...)
            SELECT (列1', 列2', ...) FROM 表名2 WHERE 条件

    DDL 部分使我们有能力创建或删除表格,也可以定义索引(键),规定表之间的链接,以及施加表间的约束。

    • CREATE DATABASE - 创建新数据库
      • CREATE DATABASE 数据库名
    • ALTER DATABASE - 修改数据库
    • CREATE TABLE - 创建新表
      • CREATE TABLE 表名
        (
        列名1 数据类型,
        列名2 数据类型,
        列名3 数据类型,
        ....
        )

      • 常用数据类型
        数据类型 描述

        integer(size)
        int(size)
        smallint(size)
        tinyint(size)

        仅容纳整数。在括号内规定数字的最大位数。

        decimal(size,d)
        numeric(size,d)

        容纳带有小数的数字。
        "size" 规定数字的最大位数。"d" 规定小数点右侧的最大位数。

        char(size)

        容纳固定长度的字符串(可容纳字母、数字以及特殊字符)。
        在括号中规定字符串的长度。

        varchar(size)

        容纳可变长度的字符串(可容纳字母、数字以及特殊的字符)。
        在括号中规定字符串的最大长度。

        date(yyyymmdd) 容纳日期。日期字段需要加引号,如 '1994-07-04'。
      • CREATE TABLE 或 ALTER TABLE 时可以规定约束,用于限制加入表的数据的类型。
        • NOT NULL
          • 强制列不接受 NULL 值。如果不向字段添加值,就无法插入新记录或者更新记录。
          • CREATE TABLE 表名
            (
            列名1 数据类型 NOT NULL,
            ....
            )
        • UNIQUE
          • 唯一标识数据库表中的每条记录。
          • 表创建时创建 UNIQUE 约束:
            CREATE TABLE 表名
            (
            列名1 数据类型 UNIQUE,
            ....
            )
          • 命名 UNIQUE 约束,以及为多个列定义 UNIQUE 约束:
            CREATE TABLE 表名
            (
            列名1 数据类型,
            列名2 数据类型,
            ....
            CONSTRAINT 别名 UNIQUE (列名1, 列名2)
            )
          • 对已创建的表中的列创建 UNIQUE 约束:
            ALTER TABLE 表名
            ADD UNIQUE (列名)

            ALTER TABLE 表名
            ADD CONSTRAINT 别名 UNIQUE (列名1, 列名2)
          • 撤销 UNIQUE 约束
            ……
        • PRIMARY KEY
          • PRIMARY KEY 约束唯一标识数据库表中的每条记录,其拥有自动定义的 UNIQUE 约束。每个表可以有多个 UNIQUE 约束,但是每个表只能有一个 PRIMARY KEY 约束。
            主键列不能包含 NULL 值。
            每个表必须有且只有一个主键。
          • 表创建时创建 PRIMARY KEY 约束:
            CREATE TABLE 表名
            (
            列名1 数据类型 NOT NULL PRIMARY KEY,
            ....
            )
        • FOREIGN KEY
          • 一个表中的 FOREIGN KEY 指向另一个表中的 PRIMARY KEY。
          • 表创建时创建 FOREIGN KEY 约束:
            CREATE TABLE 表名
            (
            ....
            列名 数据类型 FOREIGN KEY REFERENCES 另一表名(其主键名),
            ....
            )
        • CHECK
          • CHECK 约束用于限制列中的值的范围。
          • 表创建时创建 CHECK 约束:
            CREATE TABLE 表名
            (
            ....
            列名 int CHECK (列名 > 0),
            ....
            )
        • DEFAULT
          • DEFAULT 约束用于向列中插入默认值。
          • 表创建时创建 DEFAULT 约束:
            CREATE TABLE 表名
            (
            ....
            列名 date DEFAULT GETDATE(),
            ....
            )
        • AUTO INCREMENT
          • AUTO INCREMENT 允许在每次插入新记录时,自动地创建主键字段的值,可以规定起始值和递增值。
    • ALTER TABLE - 变更数据库表
    • DROP TABLE - 删除表
    • CREATE INDEX - 创建索引(搜索键)
      • 在不读取整个表的情况下,索引使数据库应用程序可以更快地查找数据。
      • CREATE [UNIQUE] INDEX 索引名 ON 表名 (列名1 [DESC], 列名2)
        UNIQUE 在表上创建一个唯一的索引,意味着两个行不能拥有相同的索引值。
        如果希望以降序索引某个列中的值,可以在列名之后添加保留字 DESC。

    • DROP INDEX - 删除索引
    • TRUNCATE TABLE - 清空表
      • TRUNCATE TABLE 用于删除表中的所有行,而不记录单个行删除操作。不同于 DELETE * ,TRUNCATE 会使自动递增的标识还原
      • TRUNCATE TABLE 表名
  • 相关阅读:
    Redis详解(一)——RDB
    十、行锁
    go 上下文context
    go log
    go 结构体取代类
    go select
    go channel
    go 协程(Goroutine)
    go 学习之fmt包
    go 学习之bufio
  • 原文地址:https://www.cnblogs.com/wayne793377164/p/7218710.html
Copyright © 2020-2023  润新知