目录

  • DQL
  • DML
  • DDL
  • DCL
  • TCL
  • 变量、存储过程、函数、流程控制语句

本文仅仅是个人的学习笔记,不建议当作学习参考,建议看下方文档
SQL语句具体用法

DQL

DQL(Data QueryLanguage,数据查询语言),用于查询数据。有些关键词前面的*代表可选。

--基本查询
SHOW DATABASES;(查看数据库列表)
SHOW CREATE DATABASE database_name;(查看某库建库信息)
SHOW CREATE TABLE table_name;(查看某表建表信息)
USE database_name;(转到指定数据库)
SHOW TABLES;(查看库中的表列表,前提要USE切换到指定数据库)
DESC table_name;(查看表的属性)

//#################################################
-表内查询
SELECT *DISTINCT(去重选项)  *|column_name(要查询的列名,*为指定表所有列,查询多个用,隔开);
FROM	table_name(表名,多个用,隔开) *AS t(取别名,可以省略,空格后加别名即可) 
*WHERE		column_name=val|函数|表达式……;
			模糊查询
			column_name *NOT LIKE '%.%;
			column_name	*NOT BETWEEN val_1 AND val_2(等价column_name>=val_1 && column_name<=val_2);
			column_name IN (val1,val2,val3,……)
			column_name IS *NOT NULL(查询为NULL或不为NULL的数据);
*GROUP BY	column_name;
*HAVING (用法和WHERE一致,用于GROUP BY之后筛选,因为WHERE不能用于GROUP BY之后)
*ORDER BY	column_name1 ASC(默认升序)|DESC(降序),column_name2;
*LIMIT n1,n2(从n1开始打印n2条记录,只写n2默认n1从0开始,等价 n1 OFFSET n2;LIMIT常用于分页查询且和ORDER BY搭配)

//####################################################

-多表查询
-sql92标准
--等值链接
SELECT *|column_name 
FROM t1,t2
WHERE t1.column_name=t2.column_name;

--不等值链接
SELECT *|column_name 
FROM t1,t2
WHERE t1.column_name BETWEEN t2.column_name1 AND t2.column_name2;

--自链接
SELECT *|column_name 
FROM t AS t1, t AS t2
WHERE t1.column_name=t2.column_name;


-sql99标准
-内连接
--等值连接
SELECT *|column_name 
FROM t1
INNER JOIN t2
ON t1.column_name=t2.column_name;

--非等值连接
SELECT *|column_name 
FROM t1
INNER JOIN t2
ON t1.column_name BETWEEN t2.column_name1 AND t2.column_name2;

--子链接
SELECT *|column_name 
FROM t AS t1,
JOIN t AS t2
ON t1.column_name=t2.column_name;

-外链接=内连接结果+主表中有而从表没有的记录
--左外连接
SELECT *|column_name 
FROM t1
LEFT OUTER JOIN t2
ON t1.column_name=t2.column_name;

--右外连接
(和左外连接作用一样,区别是LEFT改成RIGHT,左外连接主表在FROM后,右外连接从表在FROM后)

--全外连接=内连接+表1中有而表2没有的记录+表2中有而表1没有的记录
SELECT *|column_name 
FROM t1
FULL OUTER JOIN t2
ON t1.column_name=t2.column_name;

-交叉连接 笛卡尔乘积
SELECT *|column_name 
FROM t1
CROSS JOIN t2

总结:简单来说,内连接相当于交集,外连接相当于差集,交叉连接相当于并集

//##############################################

-子查询
 按位置可分为:SELECT之后、WHERE或HAVING之后、EXISTS之后
 按结果集的行列数不同分为:标量子查询(结果集一行一列)
 					   列子查询(结果集一列多行)
 					   行子查询(结果集一行多列,很少使用)
 					   表子查询(解结果集一般多行多列)
 					   
 
例子:查找工资比A高的所有员工 				   
SELECT name
FROM employees
WHERE salary > (//标量子查询    列子查询>替换成IN(还可以换成ANY、ALL但是这两个不常用,有其他替代方法)
				SELECT salary
				FROM   employees
				WHERE  name="A";
)


//########################################### 

-联合查询(当多表没有连接关系,但又需要把表按条件拼接在一起的查询方法)

SELECT a1,a2,a3 FROM t1
UNION  *ALL(UNION默认会去重,尽管两个数据并没有联系)
SELECT b1,b2,b3 FROM t2

结果 a1 | a2 | a3|
		-----
(因为查询结果共用字段且查询结果的字段名是第一条查询语句的字段,所以每条查询的语句的列数必须一致,类型和顺序最好一致)

DML

DML(DataManipulationLanguage,数据操纵语言),用于修改表内数据。

--插入新行
INSERT INTO table_name VALUE(val_1,val_2……),(val_1,val_2………);(根据表中默认列的排序插入值)
INSERT INTO table_name (column_1 column_2……) VALUE(val_1,val_2……),(val_1,val_2………);(值和列名一一对应,所以顺序可以无所谓)
INSERT INTO table_name SET column_name_1=val_1,column_name_2=val_2……;(一二种方法可以一次性插入多行,第三种不行)

--修改单表
UPDATE table_name SET column_name_1=newval_1,column_name_2=newval_2…… 
*WHERE(不加where选项所选列的值全都改变,所以大多数情况必须得加) condition;

--删除指定行
DELETE FROM table_name WHERE(同上) column_name=val;(HWM不会降低,例如删掉序号10之前的数据,新插入的行序号为11,可以回滚)

--清空表所有数据
TRUNCATE TABLE table_name;(HWM从1开始,不能回滚)

--修改多表
sql92
UPDATE table1_name AS t1,table2_name AS t2,……
SET column_name_1=newval_1,column_name_2=newval_2…… 
WHERE link_condition

DDL

DDL(Data Definition Language,数据定义语言),用于建库,建表,修改表的结构等

-数据库
CREATE DATABASE database_name *CHARSET utf8mb4(字符集) *(IF NOT EXISTS database_name);

RENAME DATABASE database_name TO new_database_name;(库一般修改不了,修改库名的操作5.1之后也不允许了)
ALTER DATABASE database_name CHARSET SET 字符集;

DROP DATABASE database_name *(IF EXISTS database_name);

-表
--建表
CREATE TABLE table_name
	(
		column_name1 data_type *constraint_type(列级约束)  *COMMENT notes1,(注意是逗号分隔)
		column_name2 data_type *constraint_type  *COMMENT notes2,
		column_name3 data_type *constraint_type  *COMMENT notes3,
		……
		*constraint_type1,(表级约束)
		*constraint_type2		
	)*ENGINE=INNODB(mysql默认INNODB)  *CHARSET=utf8mb4;


--data_type数据类型
[数据类型]https://www.w3school.com.cn/sql/sql_datatypes.asp

--constraint_type约束类型
NOT NULL(约束字段必须包含值,若不想该字段添加值就无法插入新纪录,无法用于表级约束)

UNIQUE	(约束唯一标识数据库表中的每条记录,每张表可有多个UNIQUE 约束)

PRIMARY KEY	(与UNIQUE类似,每张表只可有一个主键,且同时伴随NOT NULL的约束)

FOREIGN KEY (一个表中的 FOREIGN KEY 指向另一个表中的 PRIMARY KEY,保证该字段的值必须来源于关联列的值;
			  无法用于列级约束;
			  主表的关联列必须是一个KEY ;
			  用法:FOREIGN KEY (约束的字段) REFERENCES 外表(所要链接的字段);)
			
CHECK 	(如果对单个列定义 CHECK 约束,那么该列只允许特定的值。
		如果对一个表定义 CHECK 约束,那么此约束会在特定的列中对值进行限制。有些数据库不支持)
		
DEFAULT(默认值,无法用于表级约束)

UNSIGNED(无符号数,只能用于数字列)


--改表
ALTER TABLE table_name ADD COLUMN column_name data_type *constraint_type *COMMENT notes;
ALTER TABLE table_name DROP COLUMN column_name ;
ALTER TABLE table_name DROP constraint_type column_name;(删除某字段的约束)
ALTER TABLE table_name CHANGE COLUMN old_column_name new_column_name data_type;(可以重命名字段,不能修改字段属性)
ALTER TABLE table_name MODIFY COLUMN column_name data_type constraint_type……; (可以修改字段属性,不能重命名字段)
[CHANGE和MODIFY的区别]

--删表
DROP TABLE table_name;

TRUNCATE TABLE table_name;(与DROP TABLE table_name不同,只删除表的数据)

DCL

DCL(Data Control Language,数据控制语句),用于修改库、表、用户的权限等;

TCL

TCL(Transaction Control Language,事务控制语言)

TCL特性-acid
Atomicity(原子性):事务是一个不可分割的单位,事务中所有SQL语句要么都执行,要么都不执行。
Consistency(一致性):事务从一个一致性状态变换到另一个一致性状态。
Isolation(隔离性):事务间的执行不会相互干扰,即一个事务内部的操作对并法的其他事务是隔离的。
Durability(持久性):是指事务一旦被提交,其对数据库的改变就是永久性的,后续的操作和数据库故障都不会对其产生影响

脏读:对于T1、T2事务,T1读取了已经被T2更新但没有提交的字段之后,若T2回滚,T1读取的内容就是临时且无效的。
不可重复读:对于T1、T2事务,T1读取了一个字段,若T2更新了该字段,T1再次读取同一字段值就不同了。
幻读:对于T1、T2事务,T1从一个表读取一个字段,然后T2在该表中插入一些新行,若T1再次读取同一行就会发现多出几行。
SET autocommit=0;(关闭自动提交功能)
START TRANSACTION;(开启事务)
sql_1;(事务不适用DDL语言)
sql_2;
……
COMMIT;(提交事务)

SAVEPOINT point_name;(设置保存点,和ROLLBACK配合使用)
ROLLBACK *point_name;(回滚,必须使用在COMMIT之前,否则数据写入磁盘就没法撤销)


SELECT @@tx_isolation;(查看事务隔离级别)
SET SESSION(当前)|GLOBAL(全局) TRANSACTION ISOLATION LEVEL isolation_level;(设置事务隔离级别)
isolation_level:
				READ UNCOMMITTED(读未提交,不可避免全部情况)
				READ COMMITTED(读提交,oracle默认,可避免脏读,不可避免不可重复读)
				REPEATED READ(可重复读,mysql默认,可避免脏读和不可重复读,不可避免幻读)
				SERIALIZABLE(序列化,可避免全部情况)
202

-视图
SHOW CREATE VIEW view_name;(查看存在的视图)
CREATE VIEW view_name AS sql_;(创建视图)
SELECT * FROM view_name;(使用视图,和DQL用法一样,后续可接WHERE、ORDER BY等语句)
CREATE OR REPLACE VIEW view_name AS sql_new;(修改视图,若不存在则创建)
ALTER VIEW view_name AS sql_new;(修改视图)
DROP VIEW view_name1,view_name2……;(删除视图)

变量、存储过程、函数、流程控制语句

-变量
SHOW GLOBAL|SESSION(默认) VARIABLES *LIKE(筛选) ‘condition';(打印的变量列表)
SELECT @@GLOBAL|SESSION.variable_name;(查看具体变量的值)
SET GLOBAL|SESSION variable_name=val;(设置变量名)
SET @@GLOBAL|SESSION.variable_name=val;(设置变量名)
SET @user_variable := val;(用户变量创建,必须加@,不用限定类型)
DEClARE variable data_type  *DEFAULT val;(局部变量创建,可以不加@,需要限定类型,且必须在BEGIN END作用域第一句话声明)

//####################################################
-存储过程
SHOW CREATE PROCEDURE 存储过程名;(查看存储过程)

--存储过程创建
DELIMITER $(定义结束标记符,这里以$为例子)
CREATE PROCEDURE 存储过程名(参数列表)
BEGIN(如果存储过程体内只有一句话,BEGIN END可省略,就像if-else语句内只有一句话括号可省略)
		方法体;
END $

参数列表包含三部分且顺序如下:参数模式、参数名、参数类型
参数模式:
		IN
		OUT
		INOUT
		

--调用存储过程
CALL 存储过程名(实参列表) $  

--删除存储过程名
DROP PROCEDURE 存储过程名;
//##############################################
-函数
--函数创建
CREATE FUNCTION function_name(argument_list) RETURNS return_type
BEGIN
			function_body;
			RETURN val;(必须要返回值)
			
END $

--函数调用
SELECT function_name(argument_list)

--查看函数
SHOW CREATE FUNCTION function_name;

--删除函数
DROP FUNCTION function_name;

//###############################################
-流程控制结构

--分支结构
IF 条件1 THEN 语句1;
ELSEIF 条件2 THEN 语句2;
……
END IF;

CASE 表达式
WHEN 条件1   THEN  返回值1或语句;
WHEN 条件2   THEN  返回值2或语句;
……
*ELSE  默认值(没有ELSE,在所有情况都不满足则返回NULL)
END CASE;


--循环结构
--循环控制
ITERATE 类似其他语言continue
leave 类似其他语言break

标签: WHILE 循环条件 DO
	循环体;
END WHILE 标签(标签用于循环控制);.


LOOP 
	循环体;
END LOOP


REPEAT
	循环体;
UNTIL 结束循环条件;
END REPEAT