SQL 学习笔记

SQL 语言的分类

SQL语言共分为四大类:数据查询语言DQL,数据操纵语言DML,数据定义语言DDL,数据控制语言DCL

1. 数据库查询语言 DQL

数据查询语言DQL基本结构是由SELECT子句,FROM子句,WHERE
子句组成的查询块:
SELECT <字段名表>
FROM <表或视图名>

2. 数据操纵语言DML

数据操纵语言DML主要有三种形式:
1) 插入:INSERT
2) 更新:UPDATE
3) 删除:DELETE

3. 数据定义语言DDL

数据定义语言DDL用来创建数据库中的各种对象:表、视图、
索引、同义词、聚簇等
CREATE TABLE/VIEW/INDEX/SYN/CLUSTER

4. 数据控制语言DCL

数据控制语言DCL用来授予或回收访问数据库的某种特权,并控制
数据库操纵事务发生的时间及效果,对数据库实行监视等。如授权,撤销授权,提交,回滚等。
其中,提交又有:
  1. 显式提交: COMMIT;
  2. 隐式提交: CREATE, DROP, ALTER, AUDIT, COMMENT, CONNECT, DISCONNECT, EXIT, GRANT, NOAUDIT, REVOKE, RENAME;
  3. 自动提交: SET AUTOCOMMIT ON;

CURD

  1. INSERT INTO 表名(字段1, 字段2, 字段3) VALUES(内容1, 内容2, 内容3);
  2. DELETE FROM 表名 WHERE 条件;
  3. UPDATE 表名 SET 字段1=内容1, 字段2=内容2, WHERE 条件;
  4. SELECT 字段 FROM 表名 WHERE 条件;

常见数据库的数据类型

  1. char 文本,富文本,可变长度
  2. int 整型数据
  3. float 浮点型数据
  4. date 日期
  5. timestamp 时间戳
  6. bool 布尔值

常见的 SQL 关键字

关键字 解释
SELECT 查询字段内的内容
DISTINCT 对查询结果进行去重操作
AS 对查询结果的字段进行重命名
WHERE 添加查询条件
AND 逻辑与
OR 逻辑或
IN 查询某个字段是否存在后续的内容
BETWEEN 获取两个区间内的值
LIKE 提供范围,其中_占位单个字符串,%占位所有字符串
REGEXP 正则表达式
IS NULL 字段的值为空
ORDER BY 升序排列,后置 DESC 则为降序
LIMIT 限制查询范围
JOIN 多表查询
USING 多表查询时若存在共同字段则返回结果
LEFT JOIN 所有 FROM 表中的记录,无论是否与 ON 逻辑成立,LEFT JOIN 的表的结果都会返回
RIGHT JOIN 所有 RIGHT JOIN 表中的记录,无论是否与 ON 逻辑成立,FROM 的表的结果都会返回
NATURAL JOIN 自动合并表(不推荐)
CROSS JOIN 交叉合并(用于多选项合并)
UNION 直接将两个查询语句连接而不用分号隔开并返回查询结果
INSERT INTO … VALUES … 添加值
UPDATE … SET … WHERE … 修改值
GROUP BY 对值进行分组
HAVING 将分组后的值按条件进行查询,相当于GROUP BY前的WHERE
ROLLUP 将分组后的表进行统计

SQL 常用内置函数

统计类函数 解释
MAX 获取最大值
MIN 获取最小值
AVG 获取平均值
SUM 取和
COUNT 统计查询结果,若需去重需要配合 DISTINCT 关键字
数学函数 解释
ROUND 四舍五入
TRUNCATE 直接截取
CEILING 向左取整
FLOOR 向右取整
ABS 取绝对值
RAND 取随机数
字符串类函数 解释
LENGTH 获取字符串长度
UPPER 全部大写
LOWER 全部小写
TRIM 去除字符串左右的空格
LTRIM 去除字符串左侧的空格
RTRIM 去除字符串右侧的空格
LEFT 取字符串从左起至指定的字符
RIGHT 取字符串从右起至指定的字符
SUBSTRING 取字符串内的指定范围内的字符
LOCATE 定位字符在字符串中的位置
REPLACE 替换字符串
CONCAT 拼接字符
时间戳函数 解释
NOW 当前时间
CURTIME 当前时间
EXTRACT EXTRACT (YEAR FROM NOW())
DATE_FORMAT 格式化时间
DATE_ADD DATE_ADD(NOW(), INTERVAL 1 DAY)
DATE_SUB 时间戳相减
DATEDIFF 时间戳间隔
TIME_TO_SEC 时间转换为秒
逻辑函数 解释
IFNULL 若为空则替换为某个字符串
COALESCE 若为空则替换为某个字段
IF IF(expression, true, false)
CASE CASE WHEN THEN ELSE END

几个数据库的基础知识

  • 表的主键不做强制要求,但建议设立
  • 主键值必须唯一
  • 每行必须有一个主键,不可为空
  • 主键值不可被修改
  • 主键值被删除后不可重用
  • 表 A 的主键,可以作为表 B 的字段,此时不受以上规则约束

使用例子

  1. 使用 Limit 限制搜索条目减少查询时间
    SELECT * FROM data
    limit 100;
    
  2. 升序 / 降序排列
    SELECT * FROM data
    order by dataID [desc];
    
  3. 查找包含某个字符串
    SELECT * FROM data
    where dataset like '%string%';
    
  4. 对数据进行分组并求出其中的数量
    SELECT dataset1, count(dataset2), count(1), count(*) FROM data
    group by dataset1;
    
  5. 数据去重
    SELECT dataset1, count(distinct dataset2) FROM data
    group by dataset1;
    
  6. 针对 group by 分组后的结果进行过滤
    SELECT * FROM data
    group by dataset1
    having count(dataset2) >= 100;
    
  7. Python 中常用的逻辑判断可用于 SQL
    SELECT count(if(dataset1 like 'string') OR if(dataset2 BETWEEN 1 AND 100)) FROM data
    group by dataset3;
    
  8. 别名 as 必须在下一个筛选关键字段后才能使用
    SELECT dataset1 as d1 From data
    group by dataset2 having d1 > 10;
    
  9. 字符串查找
    SELECT left(dataset1, 1), locate('string', dataset1, 3),
    length(dataset1),
    right(dataset1, length(dataset1) - locate('string', dataset1)),
    substr(dataset1, 0, 3)
    FROM data
    
  10. 多表查询 (表的自合并)
    USE sql_store;
    -- Explicity
    SELECT * FROM orders JOIN customers ON orders.customer_id = customers.customer_id
    -- Implicity
    SELECT * FROM order_items oi JOIN sql_inventory.products p USING (product_id)
    
  11. 快速复制整个表
    -- Whole
    CREATE TABLE orders_archived AS 
    SELECT * FROM orders
    -- Limit
    INSERT INTO orders_archived
    SELECT * FROM orders
    WHERE order_date < "2019-01-01"
    
  12. 更新表内容
    UPDATE invoices
    SET payment_total = 10, payment_date = '2019-08-09'
    WHERE invoice_id IN ((1, 2) AND 
    (SELECT client_id FROM clients WHERE name = 'MyWorks'))
    
  13. 删除表的内容
    DELETE FROM invoices
    WHERE invoice_id = (SELECT * FROM clients WHERE name = "MyWorks")
    
  14. 查询数据分组
    SELECT client_id, SUM(invoice_total) AS total_sales
    FROM invoices 
    GROUP BY client_id
    
  15. 交叉合并
    -- Explicity
    SELECT c.first_name AS customer, p.name AS product FROM customers c CROSS JOIN products p ORDER BY c.first_name
    -- Implicity 
    SELECT c.first_name AS customer, p.name AS product FROM customers c, orders o ORDER BY c.first_name
    

参考资料

评论