SQL笔记

基础知识

数据库与数据库软件

  • 数据库:保存有组织的数据的容器(通常是一个文件或一组文件)
  • 数据库软件:确切的说,数据库软件应称为数据库管理系统(DBMS)。数据库是通过DBMS创建和操纵的容器。

SQL是什么

  • SQL(Structured Query Language)中文名结构化查询语句,是一种专门用来与数据库沟通的语言。
  • SQL不是某个特定DBMS的语言,几乎所有重要的DBMS都支持SQL。
  • 许多DBMS厂商都通过增加语句或指令对SQL进行了扩展,但是一般只应用于特定的DBMS。

  • 数据存储在数据库的一张张表中,而表又可以分为行和列,每一行代表一个记录,每一行都可以分为一个或多个列,每一列的数据类型可以不同,分别储存着不同的信息。其中我们应该正确的分解数据,将他们保存在不同的列中,便于对数据进行分类和过滤。

主键

  1. 唯一标识表中每行的一列(或几列)称为主键。主键使得更新、删除表中特定的行变得简单。
  2. 作为主键的条件:
    • 任意两行都不具有相同的主键值;
    • 每一行都必须具有一个主键值(主键列不允许NULL值);
    • 主键列的值不允许修改或更新;
    • 主键值不能重用(如果某行从列表中删除,它的主键不能赋给以后的新行)。

PS:后续部分DBMS以MySQL为例讲解,独有部分会标注。

检索篇

普通检索

基础语句

1
2
SELECT column1 
FROM table;
  • 大写单词为SQL关键字,不能用做表或列的名字。值得注意的是SQL并不区分大小写,只不过是关键字用大写来表示比较好区分。
  • column表示表中的某一列,并且column可以不唯一,多个column是中间用 , 号隔开, table表示某一张表。
  • 通配符 * 表示显示该表中所有的列,列的顺序一般是在表中定义中出现的物理顺序。另外应注意,除非确实需要表中的每一列,否则最好不要使用通配符 * ,这样会降低检索和应用程序的性能。

扩展选项

  • 检索不同的值

    • DISTINCT 用于返回不同的值,相同时只返回一次。应注意的是其作用范围是所有的列,而不是紧跟其后的一列。
    • 代码示例:
      1
      2
      SELECT DISTINCT column1 
      FROM table;
  • 限制返回结果(数量等)

    • LIMIT 与 OFFSET 结合使用(适用于MySQL、MariaDB、PostgreSQL、SQLite)
    • LIMIT 后跟返回的行数,OFFSET 后跟起始位置(从0开始)
    • 代码示例:

      1
      2
      3
      SELECT column1 
      FROM table1
      LIMIT num1 OFFSET num2;

检索

ORDER BY

  • 采用 ORDER BY 进行检索约束时,检索结果将按照指定顺序返回。
  • 基础语句:

    1
    2
    3
    SELECT column1 
    FROM table1
    ORDER BY column2;

    此时检索结果按照column2的大小排序返回,默认生序排列

  • 扩展语法:

    • 可以按照多个列进行排序,此时只需要在 column2 后添加需要的列即可。当按照column2排列时某几行的大小相同将会按照后续的column排序。
    • 在排序列的后变添加关键字 DESC 时将会按照降序排列。需要注意的是 DESC 与 DISTINCT
      不同,DESC的作用范围只有其前边一个column。

      1
      2
      3
      SELECT column1 
      FROM table1
      ORDER BY column2 DESC, column3;
  • PS:
    ORDER BY应当位于所有语句的最后,但是当语句中含有LIMIT时,ORDER BY应位于LIMIT之后。

WHERE

  • 采用 WHERE 进行检索时,检索结果将会返回指定要求的结果。
  • 基础语句:

    1
    2
    3
    SELECT column1 
    FROM table1
    WHERE column2 = value;

    此时检索结果将返回 column2 = value 那些行的 column1。

  • WHERE 子句操作符 :
操作符 说明 操作符 说明
= 等于 > 大于
<> 不等于 >= 大于等于
!= 不等于 !> 不大于
< 小于 BETWEEN 在指定的两个值之间
<= 小于等于 IS NULL 为NULL值
!< 不小于
  • 使用示例:

    1
    2
    3
    SELECT column1 
    FROM table1
    WHERE column2 BETWEEN num1 AND num2;

    此时检索结果将返回 column2 在 num1 和 num2 之间的那些行的 column1

高级过滤

WHERE扩展

AND
1
2
3
SELECT column1, column2
FROM tabel1
WHERE value1 = value2 AND value3 = value4;
OR
1
2
3
SELECT column1, column2
FROM tabel1
WHERE value1 = value2 OR value1 = value3;

PS: 当多个ANDOR连用时注意用括号分割,避免逻辑性错误,避免歧义。

IN
1
2
3
SELECT column1, column2
FROM tabel1
WHERE value1 IN (value2,value3)

可以看出INOR相当,但是当合法选项很多时,前者的语法更清楚,更直观。

NOT:
1
2
3
SELECT column1, column2
FROM tabel1
WHERE NOT value1 IN (value2,value3)

其中NOT只否定其后一个语句,而不是全部语句。

通配符过滤–LIKE操作符:

%通配符:
1
2
3
SELECT column1, column2
FROM tabel1
WHERE value1 = 'value2%';

%表示任何字符出现任意次数,上例表示找出所有以 value2起头的单词,其中%可以使用任意次数。
应注意的是若指定value1 = 'value2%y', 即以value2起头,以y结尾,但是许多DBMS用空格填补字段,则无返回,应该为value1 = 'value2%y%'

_通配符:

%类似,但是_只匹配一个字符。

[]通配符:

[]用来指定一个字符集,它必须匹配指定位置(通配符的位置)的一个字符,[JM]表示此处的字符可以为 J 或 M。应注意的是[]通配符只有Access和SQL Server支持。

Summary:
  • 使用通配符导致搜索时间变长
  • 不要过度使用通配符,若可以达到相同目的,应使用其他操作符
  • 使用通配符时不要把它放在开始的位置,应尽量往后放。

创建计算字段

拼接字段

MySQL中使用Concat函数创建拼接字段,使用AS为新的字段创建一个名字, 其中AS是可选的,但是最好使用。

1
2
3
SELECT Concat(column1, '(', column2, ')') 
FROM table1
ORDER BY column2;

算术计算

可用操作符:

操作符 说明
+
-
*
/

函数处理

常用函数

函数 说明
SUBSTRING() 提取字符串的组成部分
CONCERT() 数据类型转换
CURDATE() 提取当前日期
LEFT() 返回字符串左边的字符
LENGTH() 返回字符串的长度
LOWER() 将字符串转换为小写
LTRIM() 去掉字符串左边的空格
RIGHT() 返回字符串右边的字符
RTRIM() 去掉字符串右边的空格
SOUNDEX() 返回字符串的SOUNDEX的值(可以用发音来进行相似性检测)
UPPER() 将字符串转换为大写

常用数值处理函数: 虽然该类型函数使用较少,但是在主要的DBMS中一致性、统一性最高,故而此处不做列举。

本文标题:SQL笔记

文章作者:Darren

发布时间:2018年05月07日 - 22:05

最后更新:2018年05月22日 - 19:05

原始链接:http://Darren2017.github.io/2018/05/07/SQL笔记/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。