首页 > 数据库 >SQL学习笔记

SQL学习笔记

时间:2024-12-13 11:01:12浏览次数:7  
标签:-- 使用 笔记 查询 学习 参数 SQL NULL SELECT

在这里插入图片描述

DDL 数据库定义语言:创建或删除数据库或表对象。

CREATE|DROP 创建|删除数据库

CREATE|DROP DATABASE <数据库名称>;

CREATE TABLE 创建表

CREATE TABLE <表名> (
	<列名> <数据类型> <列约束>,
	······,
	<表约束>,······
);

列约束DEFAULT <默认值>,约束为默认值。

DROP TABLE 删除表

DROP TABLE <表名>;

DML 数据操作语言:增删改查

SELECT:查询表中数据

语法和执行顺序

(8)SELECT 
(9)DISTINCT (11)<TOP num> <列名>,······
(1)FROM <表名>
(3)<join_type> JOIN <表名> (2)ON <join_conditon>
(4)WHERE <where_condition>
(5)GROUP BY <列名>,······ (6)WITH <cube|rollup>
(7)HAVING <having_condition>
(10)ORDER BY <列名> ASC|DESC,······;
  • SELECT 可以单独查询整列常数(字符串、数字、日期等)和算术运算。
  • 在DISTINCT时,NULL也属于一类数据。DISTINCT可以去重多列,多列完全相同的记录合并成一行。

运算符

算术运算符
+ - *  /,加减乘除四则运算可以用于任何表达式中,使用+可以拼接字符串。
  • 除数不可以为0。
  • 包含NULL的算术运算,其结果也是NULL。
  • 括号()可以提升运算优先顺序。
比较运算符
>:大于
>=:大于等于
<:小于
<=:小于等于
= :等于
!=|<>:不等于
  • 比较运算符可以对计算结果进行比较。
  • 字符串类型数据按字典顺序进行排序,比较大小时优先比较前面数据(从左往右)。
  • 不能对NULL值使用比较运算符。
逻辑运算符
AND:逻辑与
OR:逻辑或
NOT:逻辑非
  • AND运算符的优先级高于OR运算符。想要优先执行OR运算符时可以使用括号。
  • AND逻辑运算称为逻辑积,OR逻辑运算称为逻辑和。

逻辑运算和比较运算对返回真值TRUE进行操作。
SQL三值逻辑:除了真(TRUE)、假(FALSE)还有不确定值(UNKNUWN),在逻辑运算中属于中间值:

真AND不确定为不确定,
假AND不确定为假,
真OR不确定为真,
假OR不确定为不确定。

GROUP BY 分组聚合

聚合函数:将多行数据汇总为一行。

COUNT():计算列行数,排除NULL行。用参数*号返回所有行数,包括NULL行。
SUM():计算列数据合计值
AVG():计算列数据平均值
MAX():求出列数据最大值
MIN():求出列数据最小值
  • SUM()和AVG()函数计算时自动排除NULL值行数据。只能对数值类型数据使用。
  • 使用DISTINCT可以删除重复值行再进行聚合函数计算。
  • 只有SELECT、HAVING和ORDER BY字句可以使用聚合函数。

GROUP BY子句指定列称为聚合键。
GROUP BY子句如果使用表达式,SELECT子句也要使用同样的表达式。例:

SELECT CONVERT(VARCHAR(10),日期,20)
FROM T
GROUP BY CONVERT(VARCHAR(10),日期,20)

使用GROUP BY时,SELECT子句和HAVING子句只能存在以下三种元素:

常数  	
聚合函数
聚合键
  • 聚合键包含NULL时,结果会以空行形式表现出来。
  • GROUP BY 不能使用别名。
  • GROUP BY 子句的结果顺序是随机的。
  • HAVING分组聚合条件,写在GROUP BY后面,可以对聚合函数进行条件筛选。
  • 聚合键条件可以写在WHERE和HAVING中,更适合写在WHERE子句上。WHERE子句指定行对应条件,HAVING子句指定组对应条件。

ORDER BY 结果排序

  • ORDER BY需写在SELECT语句末尾,可以指定多个排序键,多个排序键时从左往右依次排序。
  • ASC升序,DESC倒序。
  • 排序键中包含NULL时,会集中在开头或者末尾。
  • 因为ORDER BY是最后执行的子句,所以可以使用SELECT子句中定义的别名。
  • 排序键可以使用并不包含在SELECT子句中的列和聚合函数。

技巧:在查询时分组聚合后可以把列数据转换为行数据。

INSERT:向表插入数据

INSERT INTO <表名>
	(列1,······)	-- 对表进行全列插入时可以省略列清单
VALUES		-- 使用SELECT子句(任何语法)代替VALUES可以插入其他表数据
	(值1,······),
	······;		-- 插入多行值
  • 插入字符串和日期类型要加双引号。
  • 括号的列为列清单,值为值清单,列清单和值清单列数必须保持一致。
  • NULL值也可以插入,但列不能设置NOT NULL约束。
  • 显示默认值需制定插入DEFAULT关键字,隐式默认值省略DEFAULT关键字就可以,推荐使用显示默认值。

DELETE:删除表中数据

DELETE FROM <表名>		-- 不加条件会删除全部行数据
	WHERE <条件>;
  • DElETE语句删除对象并不是表或列,而是行。
TRUNCATE TABLE <表名>;
  • TRUNCATE属于DDL语句,删除表中的所有行,而不记录单个行删除操作,类似把整表删除然后创建结构相同的新表。 在这个指令之下,表格中的资料会完全消失,可是表格本身会继续存在。truncate 在使用上和 delete 最大的区别是,delete 可以使用条件表达式删除部分数据,而 truncate 不能加条件表达式。

UPDATE:更新表中数据

UPDATE <表名>
	SET <列名> = <表达式>,		--不加条件会把所有行更新为新值,包括NULL值
	······		-- 更新多列
WHERE <条件>;
  • 可以使用NULL值更新,称为NULL清空,只限于未设置NOT NULL约束的列。

技巧:把相同键的表T2数据更新到表T1中:

UPDATE T1 SET <T1列名> = T2.<列名>		-- T1不使用别名
FROM T1,T2
WHERE <T1列名> = T2.<列名>

视图

创建视图

CREATE VIEW 视图名称 (
	<视图列1>,
	<视图列2>,
	······
) AS
<SELECT语句>	-- SELECT语句的排列顺序和视图列排序顺序相同
  • 视图创建的是SELECT语句创建的一个临时表,不保存数据。优点:
    1、节省存储空间。
    2、将频繁使用的SELECT语句保存成视图进行调用。
    3、提高安全性。
  • 查询视图类似查询表。
  • 多重视图:以视图为基础创建视图。多重视图会降低SQL性能,应避免使用多重视图,尽量使用单一视图。
  • 定义视图时不要使用ORDER BY子句。
  • 不能对视图进行更新操作。(实际满足部分条件可以更新,不建议这样操作)

删除视图

DROP VIEW 视图名称

子查询

普通子查询

子查询就类似访问一个临时表,把子查询嵌套到主查询上,原则上需要使用AS定义一个子查询名称。

  • SQL执行过程中优先执行子查询再执行主查询。
  • 查询可以嵌套多层子查询,但会使语句越来越难读懂和影响性能,应避免嵌套多层子查询。

标量子查询

返回单一值的子查询。可以用在比较运算符中。

  • 标量子查询可以当成常数使用在各种位置上。
  • 聚合函数可以统计出标量子查询

关联子查询

SELECT * FROM T1
WHERE T1.column1 > (SELECT <聚合列>
                    FROM T2
                    WHERE T1.关联键 = T2.关联键	-- 关联条件一定要放在子查询上
                    GROUP BY <分组列>)

关联名称(别名)有作用域,子查询内的关联名称只能在内部使用,不可以在主查询使用。

谓词

谓词是需要满足特定条件的函数,该条件返回的是真值,这也是谓词和函数的区别。

LIKE

通配符:

%	代替0个或多个字符
_	代替一个字符

NOT LIKE 选取不匹配模式

BETWEEN

BETWEEN 小值 AND 大值	  -- 筛选小值和大值范围的数据,包含大小值数据

IS NULL

判断是否为空值,IS NOT NULL:判断值是否不为空。

IN

IN (值1,值2,······)	-- 判断是否在括号值内,NOT IN为否定,不可以判断NULL值。

谓词IN括号后面可以使用子查询。

IF EXIST

判断是否满足某种条件的记录,常用在触发器上,符合条件执行相应操作。

CASE 表达式

-- 搜索CASE表达式,每个WHEN后都有一个求值
CASE 
	WHEN <求值表达式> THEN <表达式>
	WHEN <求值表达式> TEHN <表达式>
	······
	ELSE <表达式> END		-- ELSE省略默认为NULL,不建议省略。

-- 简单CASE表达式,单一求值放在CASE后
CASE <表达式>
	WHEN <表达式> THEN <表达式>
	WHEN <表达式> THEN <表达式>
	······
	END <表达式> END
  • CASE属于表达式,可以放在可以用表达式的所有地方。

CASE表达式用在SELECT和GROUP BY中可以进行多条件判断分组查询。

SELECT CASE <表达式>,聚合函数(列)
FROM T
GROUP BY CASE <表达式>

CASE表达式用在聚合函数里,可以把“行结构”转换“列结构”。

SELECT 左列,聚合函数(CASE表达式)
FROM T
GROUP BY 左列

集合运算

对满足统一规则的记录进行加减乘除等四则运算,进行集合运算的运算符为集合运算符

UNION 行运算

SELECT 语句一  -- SELECT语句一和语句二的列数和类型需相同
UNION|INTERSECT|EXCEPT  -- 去除重复的记录,加关键字ALL保留重复记录
SELECT 语句二  -- ORDER BY子句只能在最后SELECT语句使用
  • UNION 行并集:合并两张表的记录数据
  • INTERSECT 行交集:刷选两张表中相交的记录
  • EXCEPT 行差集:去除表1中存在表2的记录

JOIN 列运算

SELECT *
FROM T1
INNER|OUT|LEFT|RIGHT JOIN T2 ON T2.<联结键> = T1.<联结键>	-- 指定多条件时可以使用AND、OR。
  • ON用来指定联结条件,作用同WHERE,但要区分开。
  • INNER JOIN 内联结:相交记录,左右表共同存在的记录。
  • OUT JOIN 外联结:全部记录,左右表都存在对方的NULL记录。
  • LEFT JOIN 外联结:左主表记录,左边存在右表NULL记录,平时用的最多。
  • RIGHT JOIN 外联结:右主表记录,右边存在左表NULL记录。
  • CROSS JOIN 交叉联结:笛卡儿积,交叉联结不用使用ON子句,记录为左右表行数乘积。

  • 内联结(过时的语法):
SELECT * FROM T1,T2 WHERE T2.<联结键> = T1.<联结键>  -- 缺点:不好判定内外联结,ON和WHERE条件混合那区分。

函数

窗口函数

<窗口函数> OVER (PARTITION BY <分组列> ORDER BY <排序列>|DESC)
  • PARTITION BY分组的记录集合称为“窗口”,类似GROUP BY分组,但不具备汇总功能,不会减少记录行数,仍然显示所有分组列的值。
  • PARTITION BY可以省略,省略后相当于将整个表作为一个大窗口使用,使整表进行排序。

聚合函数可以作为窗口函数使用:

  • SUM():按行顺序累计统计总数量
  • AVG():按行顺序累计统计平均数
  • COUNT()、MAX()、MIN()
  • ORDER BY后加ROWS <前行数> PRECEDING:统计前行数到本行的数据
  • ORDER BY后加ROWS <后行数> FOLLOWING:统计本行到后行数的数据
  • ORDER BY后加ROWS BETWEEN <前行数> PRECEDING AND <后行数> FOLLOWING:统计本行前后行数的数据

专用窗口函数:

RANK():用数字计算分组后记录排序时,则会跳过之后的位次。如:1、1、3 
DENSE_RANK()用数字计算分组后记录排序时,不会跳过之后的位次。如:1、1、2 	
ROW_NUMBER()用数字计算分组后记录排序时,赋值唯一连续位次。如:1、2、3
  • 窗口函数只能写在SELECT子句中。
  • 专用窗口函数无需参数,括号是空的。

GROUPING运算符

ROULLUP:同时得出合计和小计,用在GROUP BY 后面
CUBE
GROUPING SETS

特殊符号

  • (*)代表全部意思
  • (AS)为表或列设定别名
  • (–)注释一行,(/* */)注释多行。

DCL 数据控制语言:确认或取消对数据进行的变更,管理权限。

COMMIT:确认对数据变更

ROLLBACK:取消对数据变更

GRANT:赋予用户操作权限

REVOKE:取消用户操作权限


事务

事务是需要在同一个处理单元中执行的一系列更新处理的集合。

事务遵循四种特性,也称为ACID特性:

  • 原子性(Atomicity):要么全部执行,要么全部不执行。
  • 一致性(Consistency):列属性约束无法执行时全部回滚。
  • 隔离性(Isolation):保证不同事务之间互不干扰。
  • 持久性(Durability):指事物结束后,DBMS能够保证该时间点的数据状态被保存。
事务开始语句:
BEGIN TRANSACTION		-- SQL Server、PostgreSQL使用
START TRANSACTION		-- MySQL使用
	DML语句一:
	DML语句二:
	······
事务结束语句:
(END或COMMIT或ROLLBACK)

存储过程

--创建|更新存储过程

CREATE|ALTER PROCEDURE procedure_name [; number]
  [{@parameter data_type}[VARYING][= default][OUTPUT]]
  [,...n]
  [WITH {RECOMPILE | ENCRYPTION | RECOMPILE,ENCRYPTION}]
  [FOR REPLICATION]
AS 
  sql_statement [...n]

-- 调用存储过程,存储过程如果有参数,后面加参数格式为:@参数名=value,也可直接为参数值value
EXECUTE Procedure_name '' 

-- 删除存储过程,在存储过程中能调用另外一个存储过程,而不能删除另外一个存储过程
drop procedure procedure_name    

参数解释:

procedure_name :存储过程的名称,在前面加#为局部临时存储过程,加##为全局临时存储过程。
number:是可选的整数,用来对同名的过程分组,以便用一条 DROP PROCEDURE 语句即可将同组的过程一起除去。例如,名为 orders 的应用程序使用的过程可以命名为 orderproc;1、orderproc;2 等。DROP PROCEDURE orderproc 语句将除去整个组。如果名称中包含定界标识符,则数字不应包含在标识符中,只应在 procedure_name 前后使用适当的定界符。
@parameter:存储过程的参数。可以有一个或多个。用户必须在执行过程时提供每个所声明参数的值(除非定义了该参数的默认值)。存储过程最多可以有 2100 个参数。
使用 @ 符号作为第一个字符来指定参数名称。参数名称必须符合标识符的规则。每个过程的参数仅用于该过程本身;相同的参数名称可以用在其它过程中。默认情况下,参数只能代替常量,而不能用于代替表名、列名或其它数据库对象的名称。有关更多信息,请参见 EXECUTE。
data_type:参数的数据类型。所有数据类型(包括 text、ntext 和 image)均可以用作存储过程的参数。不过,cursor 数据类型只能用于 OUTPUT 参数。如果指定的数据类型为 cursor,也必须同时指定 VARYING 和 OUTPUT 关键字。有关 SQL Server 提供的数据类型及其语法的更多信息,请参见数据类型。
说明对于可以是 cursor 数据类型的输出参数,没有最大数目的限制。
VARYING:指定作为输出参数支持的结果集(由存储过程动态构造,内容可以变化)。仅适用于游标参数。
default: 参数的默认值。如果定义了默认值,不必指定该参数的值即可执行过程。默认值必须是常量或 NULL。如果过程将对该参数使用 LIKE 关键字,那么默认值中可以包含通配符(%、_、[] 和 [^])。
OUTPUT:表明参数是返回参数。该选项的值可以返回给 EXEC[UTE]。使用 OUTPUT 参数可将信息返回给调用过程。Text、ntext 和 image 参数可用作 OUTPUT 参数。使用 OUTPUT 关键字的输出参数可以是游标占位符。
RECOMPILE:表明 SQL Server 不会缓存该过程的计划,该过程将在运行时重新编译。在使用非典型值或临时值而不希望覆盖缓存在内存中的执行计划时,请使用 RECOMPILE 选项。
ENCRYPTION:表示 SQL Server 加密 syscomments 表中包含 CREATE PROCEDURE 语句文本的条目。使用 ENCRYPTION 可防止将过程作为 SQL Server 复制的一部分发布。 说明在升级过程中,SQL Server 利用存储在 syscomments 中的加密注释来重新创建加密过程。
FOR REPLICATION:指定不能在订阅服务器上执行为复制创建的存储过程。使用 FOR REPLICATION 选项创建的存储过程可用作存储过程筛选,且只能在复制过程中执行。本选项不能和 WITH RECOMPILE 选项一起使用。
as:指定过程要执行的操作。
sql_statement:过程中要包含的任意数目和类型的 Transact-SQL 语句。但有一些限制。


触发器

CREATE TRIGGER trigger_name		-- 创建触发器名称
ON table_name [WITH ENCRYPTION]		-- 表或视图
[AFTER | INSTEAD] OF [DELETE | INSERT | UPDATE]
AS
BEGIN
  SQL语句
END


快捷方式

  • Ctrl + / 注释
  • Tab 缩进,Shift + Tab 反缩进

标签:--,使用,笔记,查询,学习,参数,SQL,NULL,SELECT
From: https://blog.csdn.net/weixin_45124070/article/details/144311566

相关文章

  • 【原创学习笔记】西门子1200 PLC如何实现伺服控制
    一、实现的功能及应用的场合通过PLC的不同指令,发送指令控制电机的启停和速度大小二、硬件配置1、西门子1214PLC2.TIAV163.SINAMICSG120C三、实现功能步骤1.添加设备G120CPN-调整以太网地址根据实际情况选择有无滤波器,电机参数,有无电机抱闸,最后完成调试向导......
  • qt学习之事件
    事件经过:事件派发(QApplication调用notify())->事件过滤(eventFilter())->事件分发(窗口事件分发器event())->事件处理(事件处理器函数,鼠标事件,键盘事件,绘图事件)以上函数由qt控件维护,会在合适的时机执行,是虚函数可以重写。两张蝴蝶图片实现飞舞效果//.h文件#ifndefBUTTERFLY_......
  • mysql 的row_count函数和found_rows函数【转】
    row_count()row_count函数返回的是当前连接中最近一次操作数据库的所影响的行数,增删改语句都能对它有效果。一定要是当前连接中,这个条件很重要!下面两条语句如果是用mysql客户端工具运行,一定要将两条sql全部选中一起运行才有效果。deletefromTwhereid=1;selectrow_count()......
  • 【笔记】数论初步
    1.整除和同余1.1整除1.1.1定义\(\text{如果有}a,b,c\inN,\text{且}b=a\timesc,\text{则称}a\text{整除}b,\text{记作}a\midb\)1.1.2性质\(a\mida\)若\(a\midb\)且\(b\midc\),则\(a\midc\)若\(a\midb_1,a\midb_2,\cdots,a\midb_n\),则\(a\......
  • 江科大STM32学习:01 C语言(2)指针
    1.指针简介指针Pointer是C语言的一个重要知识点,使用灵活,功能强大指针和底层硬件联系紧密(寄存器),使用指针可操作数据的地址,实现数据的间接访问2.计算机存储机制每个区域都是一个字节,线性分配下去,每个字节对应一个地址。注:一个字节是8bitinta=0x12345678;//十六进制,八......
  • 0基础如何入门大模型? 这是我看过最全的大模型学习路线
    0基础入门大模型,transformer、bert这些是要学的,但是你的第一口不一定从这里咬下去。真的没有必要一上来就把时间精力全部投入到复杂的理论、各种晦涩的数学公式还有编程语言上,这样不仅容易让你气馁,而且特别容易磨光热情。当我们认识复杂新事物时,最舒适的路径应当是:感性认......
  • 2024-2025 20241323计算机基础与程序设计》第十二周学习总结
    这个作业属于https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP这个作业要求https://www.cnblogs.com/rocedu/p/9577842.html#WEEK01这个作业的目标:文件操作作业正文https://www.cnblogs.com/gly03/p/18604346教材学习内容总结打开文件使用fopen函数来打开一个文......
  • 大模型快速入门+学习路线,非常详细收藏我这一篇就够了!
    什么是大模型大模型,是指在人工智能领域,特别实在自然语言处理和机器学习中,拥有大量参数的深度学习模型。这些模型通过在大规模数据集上进行训练,能够学到丰富的数据表示和模式,从而在各种任务上表现出色,如文本生成,语言理解,图像识别等。大模型是具有大量参数和复杂结构的模型......
  • AI大模型学习全攻略,2025年最新,学到就是赚到!
    AI大模型学习全攻略本文详细介绍了AI大模型的学习路线,包括基础数学与编程、机器学习入门、深度学习深入、实战应用与持续学习等阶段,并推荐了相关学习资源和实战项目,最后强调了持续学习与实践的重要性。在人工智能领域,大模型以其强大的数据处理和模式识别能力,正逐渐成为推......
  • 举例说明学习数据结构和算法有什么用?
    前端开发中,虽然不像后端开发那样频繁地处理海量数据和复杂算法,但数据结构和算法的知识仍然非常重要,它能帮助你写出更高效、更优雅的代码,提升用户体验。以下是一些前端开发中数据结构和算法的应用场景示例:1.数组和链表操作:场景:虚拟列表/无限滚动。当需要展示成千上万条数据......