SQL语句及其种类
SQL用关键子,表名,列名等组合而成的一条语句来描述操作的内容。关键字是指那些含义或使用方法已事先定义好的英语单词,存在包含“对表进行查询”或者“参考这个表”等各种意义的关键字。
SQL语句客分为以下三类:
DDL
DDL(Data Definition Language, 数据定义语言)用来创建或删除存储数据用的数据库以及数据库中的表对象。
CREATE:创建数据库和表等对象
DORP: 删除数据库和表等对象
ALTER:修改数据库和表等对象的结构。
DML
DML(Data Manipulation Language,数据操纵语言)用来查询或者变更表中的记录。
SELECT: 查询表中的数据。
INSERT: 向表中插入新数据。
PUDATE: 更新表中的数据。
DELETE: 删除表中的数据。
DCL
DLC(Data Control Language,数据控制语言)用来确认或者取消对数据库中的数据进行的变更。对数据库用户是否有权限操作数据库中的对象进行设定。
COMMINT: 确定对数据库中的数据进行变更
ROLLBACK: 取消对数据库中的数据进行的变更。
GRANT: 赋予用户操作权限。
REVOKE: 取消用户的操作权限。
SELECT语句基础
列的查询
从表中选取数据是需要使用 SELECT语句,也就是只从表中选出(SELECT)必要数据的意思。通过SELECT语句查询病选出必要数据的过程称为 匹配查询。
SELECT 语句是SQL语句中使用最多的最基本的SQL语句。
SELECT <列名>,... FROM <表名>,...;
该SELECT语句包含了SELECT和FROM两个子句。子句是SQL语句的组成要素,是以SELECT或FROM等作为起始的短句。
SELECT子句中列出了希望从表中查询出的列的名称,而FROM子句则指定了选取出数据的表的名称。
查询出表中所有的列
想要查询出全部列是,可以使用代表所有列的*
SLEECT * FROM <表名>
如果使用*的话,就无法设定列的显示顺序。
为列设定别名
SQL语句可以使用AS关键字为列设定别名。
SELECT <列名> AS <别名>... FROM 表名
别名可以用汉语设定,设定汉语别名是需要使用双引号("").
常数的查询
SELECT 子句中不仅可以书写列名,还可以书写常数。
SELECT '表格中的数据' AS ‘表头’ FROM 表名;
这样就可以显示常数。
结果中删除重复行
要删除重复行是,可以通过在SELECT子句中使用 DISTINCT来实现
SELECT DISTINCT 行名 FROM 表名 ;
在使用DISTINC时,NULL也被视为一类数据。NULL存在于多行中时,也会被合并成一条NULL数据。
根据WHERE语句来选择记录
SELECT语句通过WHERE子句来指定查询数据的条件。在WHERE子句中可以指定“某一列的值和这个字符串相等”或者"某一列的值大于这个数字"等条件。
SELECT <列名>,... FORM <表名> WHERE <条件表达式>;
WHERE子句要紧跟在FROM子句之后。
聚合查询
聚合函数
通过SQL对数据进行某种操作或计算式需要使用函数。
COUNT : 计算表中的记录数(行数)
SUM: 计算表中数值列中数据的合计值。
AVG: 计算表中数值列中数据的平均值。
MAX:求出表中任意列中数据的最大值
MIN: 求助表中任意列中数的最小值。
用于汇总的函数称为聚合函数或者聚集函数。所谓聚合,就是讲多行汇总为一行。所有的聚合函数都是输入多行输出一行。
计算表中数据的行数
使用COUNT函数是,输入表的列,就能够输出数据行数。
SELECT COUNT(*) FROM 表名;
COUNT函数的结果根据参数的不同而不同。COUNT(*)会得到包含NULL的数据行数,而COUNT(<列名>)会得到NULL之外的数据行数。
计算合计制
使用SUM函数,会计算出所求列的合计值。
SELECT SUM(<列名>) FROM 表名;
计算平均值
使用AVG函数,其语法和SUM函数完全相同。
SELECT AVG(<列名>) FROM 表名;
计算最大值和最小值
SELECT MAX(<列名>),MIN(<列名>) FORM 表名;
使用聚合函数删除重复值
SELCT COUNT(DISTINCT <列名>) FROM 表名;
分组
GROUP BY 子句
SELECT <列名1>,<列名2>,<列名3>,... FROM <表名> GROUP BY <列名1>,<列名2>,<列名3>,...;
未使用GROUP BY 子句是,是将表中的所有数据作为一组来对待的。而使用GROUP BY子句是,会将表中的数据分为多个组进行处理。
GROUP BY 子句就像切蛋糕一样讲表进行分组。在GROUP BY 子句中指定的列称为聚合建或者分组列。
GROUP BY子句的书写位置一定要写FROM语句之后(如果有WHERE子句的话,需要写在WHERE子句之后)。
聚合键中包含NULL时,在结果中会以“不确定”(空行的形式表示。)
GROUP BY 和WHERE 并用时SELECT语句执行顺序。
GROUP BY -> WHERE ->GROUP BY-> SELECT
在使用GROUP BY 子句是,SELELCT 子句中不能出现聚合键之外的列名。
在GROUP BY子句中不能使用SELECT 子句中定义的别名。
只有SELECT子句和HAVING子句(以及ORDER BY 子句)中能够使用聚合函数。
HAVING 子句
对集合指定条件就需要使用其他子句了,此时便可以用HAVING子句。
SELECT <列名1>,<列名2>,<列名3>,.... FROM <表名> GROUP BY <列名1>,<列名2>,<列名3>,... HAVING <分组结果对应的条件>;
HAVING 子句必须写在GROUP BY 子句之后。
构成要素
HAVING子句中能使用的3种要素如下:
- 常数
- 聚合函数
- GROUP BY 子句中指定的列名(即聚合键)
聚合键所对应的条件不应该书写在HAVING子句中,而应该书写在WHERE子句中。
排序
通常从表中抽取数据是,如果没有特别指定顺序,最终排列顺序便无从得值。即使是同一条SELELCT语句,每次执行时排列顺序很可能发生改变。
可以在SELECT语句末尾添加ORDER BY 子句来明确指定排序顺序。
SELECT <列名1>,<列名2>,<列名3>,... FROM <表名> ORDER BY <排序基准列1>,...;
指定升序或降序, 在列名后面使用DESC 就是降序排列。
数据更新
数据插入
语法
INSERT INTO <表名>(列1,列2,列3,...) VALUES(值1,值2,值3,...);
表名后面的列清单和values子句中的值清单的列数必须保持一致,列数不一致时,无法插入数据。
数据删除
删除数据的方法大体上可以分为两种:
- DROP TABLE 讲表完全删除
- DELETE 会留下表,从而删除表中的全部数据。
DELETE FROM <表名>;
想要删除部分数据行是,可以像SELECT语句那样使用WHERE子句指定删除条件。这种指定了删除对象的DELETE语句称为搜索型DELETE。
DELETE FROM <表名> WHERE <条件>;
数据更新
UPDATE <表名> SET <列名>=<表达式>;
搜索型UPDATE语句。
UPDATE <表名> SET <列名>=<表达式> WHERE <条件>;
NULL清空
使用UPDATE将列更新为NULL.将表达式写作null.
事务
事务是对表中数据进行更新的单位。事务就是需要在同一个处理单元中执行的一系列更新处理的集合。
创建事务
事务开始语句;
DML语句;
DML语句;
事务结束语句(COMMIT或ROLLBACK);
在标准SQL中并没有定义事务的开始语句,而是由各个DBMS自己实现的。
- SQL Server ,PostgreSQL
- BEGIN TANSACETION
- MySQL
- START TANSACTION
COMMIT 提交事务
COMMIT是提交事务包含的全部更新处理的结束指令,相当于文件处理中覆盖保存。一旦提交,就无法恢复到事务开始前的状态。
ROLLBACK 取消处理
ROLLBACK是取消事务包含的全部更新处理的结束指令,相当于文件处理中放弃保存,一旦回滚,数据库就会恢复到事务开始前的状态。
ACID特性
原子性(Atomicity)
原子性是指在事务结束时,其中所包含的更新处理要么全部执行,要么全不执行。
一致性(Consistency)
一致性是指事务中包含的处理要满足数据库前设置的约束,如主键约束或者NOT NULL约束等。对于事务来说,这些不合法的SQL会被回滚。
隔离性(Isolation)
隔离性指的是保证不同事务之间互不干扰的特性。该特性保证了事务之间不会互相嵌套。在某个事务中进行的更改 ,在该事务结束之前,对其他事务而言是不可见得。
持久性(Durability)
持久性指的是事务(不管是提交还是回滚)结束后,DBMS能够保证该事件点的数据状态会被保存的特性。即使由于系统故障导致数据丢失,数据库也一定能通过某种手段进行恢复。
视图
视图,“从SQL的角度来看视图就是一张表”视图和表的区别“是否保存了实际的数据。”
通常,在创建表示,会通过INSERT语句讲数据保存到数据库中,而数据库中的数据实际上会被保存到计算机的存储设备中。使用SELECT语句查询数据是,实际上就是从存储设备中读取数据。
但是使用视图是并不会讲数据保存到存储设备中,而且也不会将数据保存到其他任何地方。
从视图读取数据是,视图会在内部执行该SELECT语句并创建出一张临时表。
视图优点
- 由于视图无需保存数据,可以节省存储设备的容量。
- 将频繁使用SELECT语句保存成视图
表中存储的是实际数据,而视图中保存的是从表中去出数据是所使用的SELECT语句。
应该将经常使用SELECT语句做成视图。
创建视图
创建视图需要使用CREATE VIEW语句。
CARETE VIEW 视图名称(<视图列名1>,<视图列名2>,...)
AS
<SELECT语句>;
SELECT 语句需要书写在AS关键字之后。SELECT语句中排列顺序和视图中列的排列顺序相同。SELECT语句中的第1列就是视图中的第1列,SELECT语句中的第2列就是视图中的第2列。以此类推。视图的列名在视图名称之后的列表中定义。
使用视图
SELECT <视图列名>,<视图列名>,... FROM 视图名称;
应该避免在视图的基础上创建视图。
视图的限制
- 定义视图时不能使用ORDER BY子句
- 对视图进行更新(以下情况视图可被更新)
- SELECT子句中未使用DISTINC
- FROM子句中只有一张表
- 未使用GROUP BY
- 未使用HAVING子句
- 原表更新,视图中的数据也更新。
视图和表需要同时进行更新,因此通过汇总得到的视图无法进行更新。
删除视图
DROP VIEW 视图名称(<视图列名1>,<视图列名2>,...)
子查询
子查询就是将用于定义视图的SELECT语句直接用于FROM子句当中。
SELECT <列1>,<列2>,... FROM (
SELECT <列3>,<列4>,... FROM <表1>,<表2>,...
)AS 子查询别名;
子查询首先执行的是FROM子句中的SELECT语句,然后在执行外层的SELECT语句。
子查询作为内层查询会首先执行。
标量子查询
标量子查询就是返回单一值得子查询。
标量子查询的可以在能够使用常数或者列名的地方。
关联子查询
**在子查询中添加WHERE子句的条件。**就是关联子查询。为了解决标量子查询返回返单一值时出错。将两张表连接起来,就叫关联子查询。
在细分的组内进行比较是,需要使用关联子查询。
结合条件一定要写在子查询中。
谓词
谓词是满足特定条件的函数,该条件就是返回值是真值。
LIKE谓词
字符串的部分一致查询。
前方一致性
SELECT * FROM <表名> WHERE <列名> LIKE ‘查找的字符串%’;
中间一致性
SELECT * FROM <表名> WHERE <列名> LIKE '%查找的字符串%';
后方一致性
SELECT * FROM <表名> WHERE <列名> LIKE '%查找的字符串'
BETWEEN谓词
范围查询。
SELECT * FROM <表名> WHERE <列名> LIKE BETWEEN 小范围 AND 大范围;
BETWEEN的特点就是结果中包含大范围和小范围的值。<> 这个两个符号不包含。
IS NULL,IS NOT NULL
判断是否为NULL,为了取出某些值为NULL的列的数据,不能使用=,只能使用特定的谓词IS NULL。与此相反,想要选出NULL以外的数据时,需要使用IS NOT NULL
IN谓词
OR的简便用法。
IN(值,...)
参考资料:
<SQL基础教程>