Sql语句的分类详细总结
一、 数据定义语言DDL(Data Ddefinition Language)
SQL数据定义语言主要用来定义逻辑结构,包括定义基表,视图和索引。
1、 定义
定义表
Create table<表名> (<列名字><数据类型>[列级完整性约束条件] , ………….);
定义视图
视图:从一个或者几个基表或者视图导出的表(结果集),是一个逻辑上的虚表。数据库中只存放视图的定义,不存放视图的数据。所以基表的数据变化,视图的数据也会跟着变化。
Create view <视图名> [(列名),(列名)…] as <子查询> [with check option]
子查询可以是不包含order by 子句 和 distinct 短句的任意复杂select语句。
定义索引
Create[unque][cluster] index <索引名> on <表名>[次序] (<列名>……..)
Unique选项表示此索引的每一个索引值不能重复,对应唯一的数据记录。
Cluster 选项表示要建立的索引是聚簇索引。
<表名>是所需要创建索引的基表的名称。索引可以建立在对应标的一列或者多列上,个列名之间用逗号分隔。
(次序)指定了索引值的排列次序,ASC升序,DESC降序。缺省值ASC。
聚簇索引:指索引项的顺序与表中记录的物理顺序相一致的索引组织。(聚簇索引是将索引和表记录一起存放,一个基表只能建立一个聚簇索引。)(建立聚簇索引后,更新列数据时会导致表记录的物理顺序的变更,代价较高,经常更新的列不宜建立索引)
2、 修改
Alter table 语句
Alter table<表名>
[Add <新列名><数据类型>[完整性约束]]
[drop <完整性约束名>]
[modify <列名><数据类型>];
<表名>表示所要修改的基表,ADD子句用于增加新列和完整性约束条件,DROP子句用于三处指定的完整性约束条件,MODIFY子句用于修改原有的列定义,修改列名和数据类型
3、 删除
删除表
Drop table <表名>;
删除表后,表中的数据,表上的索引都将别删除。在oracle中,删除基表后,建立在表上的视图依然在数据字典中,但是用户引用会报错。
删除视图
Drop view <视图名>;
视图是定义在了数据字典中的。
删除索引:
索引由系统进行维护,如果数据频繁的删改,系统维护索引的时间就会增加,此时可以删除不必要的索引。索引删除后,系统会从数据字典中清除该索引的描述。
二、 数据查询语言DQL(Data Query Language)
SQL的数据查询语言主要用来对数据库中的各种数据对象进行查询。
完整语法:
SELECT[ALL | DISTINCT] TOP n[PERCENT] WITH TIES select_list
[INTO[new table name]]
[FROM{table_name | view_name} [(optimizer_hints)]
[,{table_name2| view_name2} [(optimizer_hints)]
[…,table_name6|view_name6][(optimizer hints)]]]
[WHEREclause]
[GROUPBY clause]
[HAVINGclause]
[ORDERBY clause]
[COMPUTEclause]
[FORBROWSE]
SQL 查询语句的解析顺序:
1、from子句组装来自不同数据源的数据;
2、where子句基于指定的条件对记录行进行筛选;
3、group by子句将数据划分为多个分组;
4、使用聚集函数进行计算;
5、使用having子句筛选分组;
6、计算所有的表达式;
7、select 的字段;
8、使用order by对结果集进行排序。
SQL语言不同于其他编程语言的最明显特征是处理代码的顺序。在大多数据库语言中,代码按编码顺序被处理。
简单查询
仅含有SELECT子句和FROM子句的查询就是简单查询。
1、使用FROM子句指定表
Select语句的不同部分常用来指定要从数据库返回的数据。Select语句使用from子句指定查询中包含的行和列所在的表。
2、使用 SELECT指定列
用户可以指定查询表中的某些列,属于投影操作。列名跟在SELECT关键词后面,每个列名用逗号隔开。
SELECTcolumn name1,……,column_name_n FROM table_name_1,….. table_name_n
4、 算术表达式
5、 在SELECT语句中可以使用算术表达式,+-*/和()。起别名
6、 DISTINCT关键字
去除重复行
例:SELECT distinct deptno_id from emp;
在select 语句中使用distinct 筛选重复
7、WHERE子句
WHERE 子句用于筛选从from子句中返回的值,完成选择操作。
子句中的条件表达式
A=B 表示A值=B值,返回true
A>B
A<B
A!=B或A<>B 表示不等
A LIKE B (通配符 % 任意字符 ,_代表任意一个字符)
NOT <条件表达式> NOT运算符用于对结果取反。
子语句中的连接运算符
常用连接运算符:AND和OR。AND 左右两边都是TRUE才是TRUE OR 是一边为TRUE就为TRUE
子语句中的NULL值
NULL是一个特定的术语,称之为空。
这是NULL的由来、也是NULL的基础,所有和NULL相关的操作的结果都可以从NULL的概念推导出来。
判断一个字段是否为NULL,应该用IS NULL或IS NOT NULL,而不能用‘=’。对NULL的判断只能定性,既是不是NULL(IS NULL/IS NOT NULL),而不能定值。简单的说,由于NULL存在着无数的可能,因此两个NULL不是相等的关系,同样也不能说两个NULL就不相等,或者比较两个NULL的大小,这些操作都是没有意义,得不到一个确切的答案的。因此,对NULL的=、!=、>、<、>=、<=等操作的结果都是未知的,也就算说,这些操作的结果仍然是NULL。
同理,对NULL进行+、-、*、/等操作的结果也是未知的,所以也是NULL。
所以,很多时候会这样总结NULL,除了IS NULL、IS NOT NULL以外,对NULL的任何操作的结果还是NULL。
上面这句话总结的很精辟,而且很好记,所以很多时候人们只记得这句话,而忘了这句话是如何得到的。其实只要清楚NULL的真正含义,在处理NULL的时候就不会出错。
8、 ORDERBY 子句(在select语句后执行)
ORDERBY 子句可以对结果集中的数据进行排序。
语法:
SELECT column_list
FROM table_name
ORDERBY[(order_by_expression[ASC|DESC])……]
order_by_expression表示将要排序的列名或者由列名组成的表达式,关键字ASC升序排列,DESC降序排列。
9、 GROUPBY 语句
用于在查询结果集中对记录进行分组,以汇总数居或者为整个分组显示单行的汇总信息。
使用GROUPBY 子句,必须满足下面的条件:
l 在SELECT子句的后面只可以有两类表达式:统计函数和进行分组的列名。
l 在SELECT子句中的列名必须是进行分组的列,初次之外添加其他的列名都是错误的,但是GROUP BY 子句后面的列名可以不出现在SELECT子句中。
l 如果使用了WHERE子句,那么所有参加分组计算的数据必须首先满足WHERE子句只等的条件。
l 在默认情况下,将按照GROUP BY 子句指定的分组列升序排列,如果需要重新排序,可以使用ORDERBY 子句指定新的排列顺序。
10、 HAVING 子句
HAVING 子句通常与GROUP BY子句一起使用,在完成对分组结果统计后,使用HAVING 子句的功能对分组的结果进一步的筛选。
在SELECT 子句中使用了GROUPBY子句,那么HAVING子句将应用于GRPUP BY创建的那些组。如果指定了WHERE子句,二没有指定GROUP BY子句那么HAVING子句将应用于WHERE子句的输出,并且整个输出别看做是一个组,如果在SELECT语句中既没有指定WHERE子句,也没有指定GROUP BY子句,那么HAVING子句将应用于FROM子句的输出,并且将其看作是一个组。
连接查询
1、 简单链接
(1)、基本形式
仅仅通过select子句和from子句连接多个表,查询结果是通过笛卡尔积生成的表。(两个表行数的乘积)
(2)、条件限定
笛卡尔积含有大量冗余数据,一般情况下毫无意义。为了避免这种情况的出现,添加过滤条件。
(3)、表的别名
表别名是在FROM子句中用于各表的间断名称,可以唯一的表示数据源。
{如果为表指定了别名,那么语句中的所有子句都必须使用别名,而不允许再使用实际的表名}
2、 JOIN连接
1、 内连接
内链节是常用的多表查询,用关键字 INNER JOIN 。可以省略 INNER。
使用内链接查询多个表时候,在FROM子句中除了JOIN关键字外,必须定义一个ON子句,自定内链接操作列出与条件匹配的数据行,使用比较运算符比较被链接值。
内链接就是使用JOIN关键字连接两个表,使用ON指定连接表的连接条件。记忆不限制查询范围,可以在后面添加where子句。
使用内连接仅仅包含符合查询条件和连接条件的行。
2、 自然连接
其限制条件,连接的各个表之间必须具有相同名称的列。
3、 外连结
外连接分为左外连接【LEFT OUTER JOIN 】右外连接【RIGHTOUTER JOIN 】全外连接【FULL OUTER JOIN】三种。
外连接不仅仅列出符合与连接条件相匹配的行,还列出所有符合搜索条件的数据行。
左外连接(显示左表)
右外连接(显示右表)
全链接(显示所有符合搜索条件的数据行)
3、 集合操作(复合查询)
将两个或者多个SQL查询结果合并构成复合查询。集合操作主要由集合操作实现,包括UNION(并运算),UNION ALL,INTERSECT(交运算)和MINUS(差运算)。
UNION
并运算符将多个查询结果集相加,形成一个结果集。将第一个查询中的所有行与第二个查询中的所有行相加,消除其中重复行形成一个集合。
UNION ALL
UNION ALL 操作符形成的结果集中包含有两个自结果集中重复的行。
INTERSECT
对两个结果集中的数据,取交集
MINUS
表示差集,返回从第一个查询中返回的,但是没有在第二个查询中返回的记录。
4、 子查询
子查询和连接查询,都提供了使用单个查询访问多个表中数据的方法。子查询在其他查询的基础上,提供一种进一步有效的方式来表示WHERE子句中的条件。子查询是一个SELECT 语句,可以在SELECT,INSERT,UPDATE或DELETE语句中使用。也可以在HAVING子句中使用子查询。
1、 IN关键字
使用IN关键可以将源表中特定列的值与子查询返回的结果集中的值进行比较,若某行的特定列的值存在,则在SELECT语句的查询结果中就包含这一行。
2、 EXISTS关键字
只需要考虑是否满足判断条件,数据本身不重要,就使用EXISTS。
查询返回一个或着多行,为TRUE否则为FALSE。
3、 比较运算符
确认子查询返回的结果中只包含一个单值,可以直接使用比较运算【=,<>|!=,<,>,<=,>=】
三、 数据操纵语言DML(Data Manipulation Language)
SQL的数据操纵语言,用于改变数据库中的数据,包括插入,删除,修改。
1、 插入
INSERT语句想数据表中插入数据,可以一次插入一条数据,也可以根据SELECT查询子句的结果集批量插入指定数据表。
1) 一般的INSERT语句
INSERT INTO[user] table [@db_link] [(column)]
VALUES(express,[express2])
Table:表名
Db_link:数据库链接名
Column:列名【字段】
Values:插入的值
2) 批量插入
用SELECT语句替换VALUES语句,由SELECT语句提供添加的数据
INSERT INTO [user]table [@db_link] [(column)] subquery
Subquery是子查询语句,可以是任何合法的select语句,其中所选列的个数和类型应该与前边的column相对应。
SELECT返回的语句必须满足表中列的约束。
2、 删除
从数据库中删除记录用DELETE语句。
DALETE FROMtable_name
[WHEREcondition]
(不加限定条件,会删除表中的全部记录)
3、 TRUNCATE语句
使用TRUNCATE,删除表中的所有数据,比DELETE快。
TRUNCATE 语句不能被撤销
4、 修改
使用UPDATE语句,可以修改表中一列或者多列的值,使用WHERE子句可以限定被修改的行。
UPDATEtable_name
SET {column1=express1[,column2=express2]
(column1[,column2])=(selectquery)}
[WHEREcondition]
l UPDATE子句用于指定要修改的表名称。需要后跟一个或多个要修改的表名称,这部分是必不可少的。
l SET子句用于设置要更新的列以及各列的新值。需要后跟一个或多个要修改的表列。
l WHERE后跟更新限定条件。
四、 数据控制功能DCL(Data Control Language)
数据控制指数据库的安全性和完整性控制
SQL的数据控制语言,对表和视图的授权,完整性规则的描述以及事务开始和结束等控制语句。
SQL通过对数据库用户的授权和取消授权命令来实现相关数据的存取控制,保证数据库的安全性,。还提供了数据完整性约束的定义和检查机制,保证数据库的完整性。
l 通过GRANT和REVOKE语句将授权的决定告知系统。
l 将授权结果存入数据字典
1、 授权
SQL用GRANT语句向用户授予操作权限:
GRANT <权限>[,权限]………
[ON <对象类型><对象名>]
TO <用户>[,<用户>]……
[WITH GRANTOPTION]
[WITH ADMINOPTION]
对属性列和视图权限:
SELECT(查询),INSERT(插入),UPDATE(修改),DELETE(删除),四种权限的总包(ALLPRIVILEGES)。
对表的权限:
查询,插入,修改,删除,修改表(ALTER),建立索引(INDEX)以及这六种权限的总和。(ALL PRIVILEGES)
对数据库:
CREATETAB(建表)
不同对象类型允许的操作权限
对象 | 对象类型 | 操作权限 |
属性列 | TABLE COLUMN | SELECT,INSERT,UPDATE,DELETE,ALL PRIVILEGES |
视图 | TABLE VIEW | SELECT,INSERT,UPDATE,DELETE,ALL PRIVILEGES |
基表 | TABLE | SELECT,INSERT,UPDATE,DELETE,ALTER,INDEX, ALL PRIVILEGES |
数据库 | DATABASE | CREATETAB |
接收权限的用户可以是一个或者多个具体用户,也可以是全体用户(PUBLIC)。
2、 回收
收回权限使用,REVOKE语句
REVOKE <权限>[,<权限>]………
[ON <对象类型><对象类>]
FROM <用户>[,<用户>]……;