《SQL必知必会》个人笔记

简介: 《SQL必知必会》个人笔记

第一章 了解SQL


主键:一列(或几列),其值能唯一标识表中每一行。


  1. 表中每一行都应该有一列(或几列)可以唯一标识自己。
  2. 主键可以是一列构成,也可以是几列共同构成。
  3. 主键需要满足以下条件
  1. 唯一
  2. 非空


第二章 检索数据


2.1 检索不同的值(去重)


DISTINCT

  1. 如果使用 DISTINCT 关键字,它必须直接放在列的前面。
SELECT DISTINCT user_name FROM user WHERE age > 10;
  1. 不能部分使用 DISTINCT , DISTINCT 关键字作用于所有的列,不仅仅是跟在其后面的那一列。
SELECT DISTINCT user_name, city FROM user WHERE age > 10;


2.2 分页


LIMIT 关键字


2.2.1 MySQL

SELECT user_name, city FROM user WHERE age > 10 LIMIT 0,10;
SELECT user_name, city FROM user WHERE age > 10 LIMIT 10 OFFSET 0;

注意

  1. 上面两种写法效果是一样的:第一页的十行数据。
  2. ‘,’ 和 ‘OFFSET’ 前后的参数意义截然相反的奥(详情见下方截图)
  3. 第一个被检索的数据是第 0 行。

分割线

2.2.2 Oracle

SELECT user_name, city FROM user WHERE ROWNUM <= 5;

Oracle 三种分页方法_oracle 分页-CSDN博客


2.3 注释

-- 注释

# 注释

/* 
注释
*/


第三章 排序


ORDER BY

如果想在多个列上进行排序,必须对每一列指定关键字


第四章 WHERE


4.1 BETWEEN AND 是闭区间

-- 表示 id >= 10 && id <= 20
SELECT id, name FROM user WHERE id BETWEEN 10 AND 20;


4.2 IS NULL

-- city 为空
SELECT id, name FROM user WHERE city IS NULL;
-- city 不为空
SELECT id, name FROM user WHERE city IS NOT NULL;


4.3 NOT

NOT 操作符有且只有一个功能,那就是否定其后所跟的任何条件。

SELECT id, name FROM user WHERE NOT city = 'HK';

与其有同样效果的语句如下:

SELECT id, name FROM user WHERE city != 'HK';
SELECT id, name FROM user WHERE city <> 'HK';


4.4 通配符


  1. % 表示任何字符出现任意次数(0个 1个 或多个)
  2. _ 表示任何字符出现一次(精准的1个)


第八章 函数


lower() 将字符型转换为小写

upper() 将字符型转换为大写

SELECT YEAR(CURDATE()), MONTH(CURDATE()), DAY(CURDATE()), 
  HOUR(CURTIME()), MINUTE(NOW()), SECOND(SYSDATE()) FROM DUAL;


第九章 聚合函数


AVG() :会忽略 NULL 值

MAX():会忽略 NULL 值

MIN():会忽略 NULL 值

SUM():会忽略 NULL 值

COUNT(): COUNT(列) 会忽略NULL值,COUNT(*)不会忽略NULL值。

不能在 WHERE 子句中使用聚合函数。


第十章 分组函数


注意

  1. 除了聚合函数外,SELECT 语句中的每一列都必须在 GROUP BY 子句中给出。

执行如下语句,报错如下:

SELECT resource_object_id, maintenance_id,  operator_time 
FROM procatch_work_om_log 
GROUP BY resource_object_id

  1. 位置:在 WHERE 之后 ,在 ORDER BY 之前。
  2. GROUP BY 后可以跟 HAVING 进行过滤数据
  1. **WHERE 和 HAVING 的对比 **

区别1:WHERE 可以直接使用表中的字段作为筛选条件,但不能使用分组中的计算函数作为筛选条件;HAVING 必须要与 GROUP BY 配合使用,可以把分组计算的函数和分组字段作为筛选条件。

这决定了,在需要对数据进行分组统计的时候,HAVING 可以完成 WHERE 不能完成的任务。这是因为,在查询语法结构中,WHERE 在 GROUP BY 之前,所以无法对分组结果进行筛选。HAVING 在 GROUP BY 之后,可以使用分组字段和分组中的计算函数,对分组的结果集进行筛选,这个功能是 WHERE 无法完成的。另外,WHERE 排除的记录不再包括在分组中。

区别2:如果需要通过连接从关联表中获取需要的数据,WHERE 是先筛选后连接,而 HAVING 是先连接后筛选。

这一点,就决定了在关联查询中,WHERE 比 HAVING 更高效。因为 WHERE 可以先筛选, 用一个筛选后的较小数据集和关联表进行连接,这样占用的资源比较少,执行效率也比较高。HAVING 则需要先把结果集准备好,也就是用未被筛选的数据集进行关联,然后对这个大的数据集进行筛选,这样占用的资源就比较多,执行效率也较低。

开发中的选择: WHERE 和 HAVING 也不是互相排斥的,我们可以在一个查询里面同时使用 WHERE 和 HAVING。包含 分组统计函数的条件用 HAVING,普通条件用 WHERE。

这样,我们就既利用了 WHERE 条件的高效快速,又发挥了 HAVING 可以使用包含分组统计函数的查询条件的优点。当数据量特别大的时候,运行效率会有很大的差别。

  1. GROYP BY 后不可以跟别名(执行顺序原因)


第 11,12,13,14 章 子查询&联结表


要避免笛卡尔积

对于数据库中表记录的查询和变更,只要涉及多个表,都需要在列名前加表的别名(或 表名)进行限定。


内连接(交集)


合并具有同一列的两个以上的表的行, 结果集中不包含一个表与另一个表不匹配的行

基本语法:

SELECT table1.column, table2.column,table3.column
FROM table1
JOIN table2 ON table1 和 table2 的连接条件
JOIN table3 ON table2 和 table3 的连接条件(有疑惑)

举例1:

SELECT e.employee_id, e.last_name, e.department_id, d.department_id, d.location_id
FROM employees e JOIN departments d
ON (e.department_id = d.department_id);

举例2:

SELECT employee_id, city, department_name
FROM employees e
JOIN departments d
ON d.department_id = e.department_id
JOIN locations l
ON d.location_id = l.location_id;


外连接


两个表在连接过程中除了返回满足连接条件的行以外还返回左(或右)表中不满足条件的行 ,这种连接称为左(或右) 外连接。没有匹配的行时, 结果表中相应的列为空(NULL)。

  • 如果是左外连接,则连接条件中左边的表也称为 主表 ,右边的表称为 从表 。

SELECT e.last_name, e.department_id, d.department_name
FROM employees e
LEFT OUTER JOIN departments d   -- OUTER可以省略
ON (e.department_id = d.department_id) ;
  • 如果是右外连接,则连接条件中右边的表也称为 主表 ,左边的表称为 从表 。

SELECT e.last_name, e.department_id, d.department_name
FROM employees e
RIGHT OUTER JOIN departments d -- OUTER可以省略
ON (e.department_id = d.department_id) ;

注意:我们要 控制连接表的数量 。多表连接就相当于嵌套 for 循环一样,非常消耗资源,会让 SQL 查询性能下降得很严重(建议不要超过 3 个),因此不要连接不必要的表。在许多 DBMS 中,也都会有最大连接表的限制。


多表连接

UNION


UNION 操作符返回两个查询的结果集的并集,去除重复记录。

SELECT * FROM user WHERE did = 2
UNION
SELECT * FROM user WHERE did = 1 

UNION 操作符返回两个查询的结果集的并集,去除重复记录。


与 OR 有啥区别:UNION 效率高,对于 OR 表连接来说,每连接一次新表则匹配的次数满足笛卡尔积。但是 UNION 可以减少匹配的次数。


UNION ALL


UNION ALL 操作符返回两个查询的结果集的并集。对于两个结果集的重复部分,不去重。

union和union all的差异主要是前者需要将结果集合并后再进行唯一性过滤操作,这就会涉及到排序,增加大量的CPU运算,加大资源消耗及延迟。

当然,union all的前提条件是两个结果集没有重复数据。所以一般是我们明确知道不会出现重复数据的时候才建议使用 union all 提高速度。


第十五章 插入数据


INSERT INTO user(name, age, city) VALUES ('snow', 120, '香港');

特殊插入(将查询结果插入)

INSERT INTO user(name, age, city) SELECT name, age, city FROM user WHERE ...;

从一个表复制到另一个表

CREATE TABLE user2 AS SELECT * FROM user;


第十六章 更新和删除数据


第十七章 创建表和操作表


删除表

DROP TABLE user;

清空表

TRUNCATE TABLE user;


第十八章 视图


【MySQL】View 视图用法及作用-CSDN博客


第十九章 存储过程


第二十章 事务


BEGIN;

SAVEPOINT P1;

COMMIT;

ROLLBACK;
相关文章
|
5天前
|
SQL 关系型数据库 MySQL
《SQL必知必会》个人笔记(一)
《SQL必知必会》个人笔记(一)
44 0
|
5天前
|
SQL 关系型数据库 MySQL
【MySQL实战笔记】02.一条SQL更新语句是如何执行的-1
【4月更文挑战第4天】SQL更新语句执行涉及查询和日志模块,主要为`redo log`和`binlog`。`redo log`先写日志再写磁盘,保证`crash-safe`;`binlog`记录逻辑日志,支持所有引擎,且追加写入。执行过程分为执行器查找数据、更新内存和`redo log`(prepare状态)、写入`binlog`、提交事务(`redo log`转commit)。两阶段提交确保日志逻辑一致,支持数据库恢复至任意时间点。
22 0
|
8月前
|
SQL 数据库 索引
阿里P8整理出SQL笔记:收获不止SOL优化抓住SQL的本质
开头我先说: 有人就有江湖,有江湖就有IT系统,有IT系统就有数据库,有数据库就有SQL,SQL应用可一字概括:“"广"。加之其简单易学,SQL实现也可一字概括:“乐”。
|
6月前
|
SQL 分布式计算 HIVE
pyspark笔记(RDD,DataFrame和Spark SQL)1
pyspark笔记(RDD,DataFrame和Spark SQL)
60 1
|
5天前
|
SQL 关系型数据库 MySQL
【MySQL系列笔记】常用SQL
常用SQL分为三种类型,分别为DDL,DML和DQL;这三种类型的SQL语句分别用于管理数据库结构、操作数据、以及查询数据,是数据库操作中最常用的语句类型。 在后面学习的多表联查中,SQL是分析业务后业务后能否实现的基础,以及后面如何书写动态SQL,以及完成级联查询的关键。
204 6
|
5天前
|
SQL 存储 关系型数据库
【MySQL系列笔记】SQL优化
SQL优化是通过调整数据库查询、索引、表结构和配置参数等方式,提高SQL查询性能和效率的过程。它旨在减少查询执行时间、减少系统资源消耗,从而提升数据库系统整体性能。优化方法包括索引优化、查询重写、表分区、适当选择和调整数据库引擎等。
234 3
|
5天前
|
SQL 存储 关系型数据库
【MySQL实战笔记】02.一条SQL更新语句是如何执行的-2
【4月更文挑战第5天】两阶段提交是为确保`redo log`和`binlog`逻辑一致,避免数据不一致。若先写`redo log`, crash后数据可能丢失,导致恢复后状态错误;若先写`binlog`,crash则可能导致重复事务,影响数据库一致性。一天一备相较于一周一备,能缩短“最长恢复时间”,但需权衡额外的存储成本。
20 1
|
5天前
|
SQL 存储 缓存
【MySQL实战笔记】01.一条SQL查询语句是如何执行的?
【4月更文挑战第3天】MySQL执行SQL的流程包括连接器、查询缓存、分析器、优化器和执行器。连接器负责建立连接、权限验证,查询缓存(MySQL 8.0已移除)存储查询结果,分析器解析SQL确保语法正确,优化器选择最佳索引和查询路径,执行器执行查询并管理权限。连接器使用长连接可能导致内存问题,可定期断开或使用`mysql_reset_connection`。注意,更新操作会导致查询缓存失效。
21 3
|
5天前
|
SQL 存储 数据库
【数据库SQL server】自学终极笔记
【数据库SQL server】自学终极笔记
104 0
|
5天前
|
SQL 存储 安全
《SQL必知必会》个人笔记(四)
《SQL必知必会》个人笔记(四)
32 0
http://www.vxiaotou.com