前面我们已经把大量的关键字,还有DML的一些基本的操作都已经过了一遍,在SQL(结构化查询语句)包含着3个方面,DML(数据操作查询)DDL(数据定义语句)DCL(数据控制语句),补充上面的一点就是distinct是 去除重复的行数据,也只能出现在我们的select关键字之后。再补充一点连接的东西 在之前的join的关键字我们有学到内链接,外连接(左外连接,右外连接,全外连接) 内连接除了等值连接还有不等值连接。还有一类就是我们的交叉连接(平时很少使用到)CROSS join.....where结果是笛卡尔乘积。在我们的union的关键字中,连接两个或者多个查询的集合合并。除了union 和union all 之外 还有 交集 intersect 和减法 minus。
1.分组查询
select ⑤ 确定数据列
from ①数据来源
where ②分组前过滤
group by ③执行分组操作
having ④针对分组数据进行过滤
order by ⑥数据排序 默认升序(ASC) 降序(DESC)
2.子查询
①.子查询返回的结果是单行单列的数据集的话 出现在 having,where
②.子查询返回多行单列的出现在where
③.子查询返回多行多列出现在FROM中
>any 最小值比较 >all 最大值比较 3.DDL(数据定义操作) ①序列 序列是一种数据库对象,用来自动产生一组唯一的序号;序列是一种共享式的对象。多个用户可以共同使用序列中的序号。 创建序列: create sequence 序列名称 [incrememt by n] 定义序列增长步长 默认为1 [start with n] 定义起始值为n,默认为1 [{MAXVALUE n | NOMAXVALUE}] 序列最大值 [{MINVALUE n | NOMINVALUE}] 序列最小值 [{CYCLE | NOCYCLE}] 到达最大值,或者最小值,继续产生序列 [{CACHE | NOCAHE}] CACHE 默认式20 使用序列 NEXTVAL和CURRVAL伪列 NEXTVAL返回序列中下一个有效值,任何用户都可以引用 CURRVAL 中存放序列当前值 第一次使用时CURRVAL不能用 使用时需要指定序列的对象名 将序列值装入内存提高访问效率 序列出现裂缝可能时以下原因 --回滚 --系统异常 --多个表使用同一个序列 使用序列eg: 查询序列 select * from 序列名称 删除序列 DROP SEQUENCE 序列名称 修改序列的注意事项 必须时序列的拥有者或者序列有alter权限 只有将来的序列值会被改变 改变序列的初始值只能通过删除序列之后重建序列的方法实现 ②视图 是一个虚拟的表,时一个表中的数据经过某种筛选后的显示方式,视图由一个预定义的查询select语句组成 特点: 视图中的数据并不属于视图本身,而是属于基本的表,对视图可以像表一样进行insert,update,delete操作 视图不能被修改,表修改或者删除应该删除视图再重建 视图没有数量的限制,但是命名不能和视图以及表重复,具有唯一性 视图可以被嵌套,一个视图中可以嵌套另一个视图 视图不能索引,不能由相关联的触发器和默认值,sql server 不能再视图后使用order by 排序 功能: 简化用户操作 能以不同的角度观察同一个数据库 对重构数据库提供了逻辑独立性 对机密数据提供安全保护 创建视图: create view 视图名 as 子查询 查询视图: select * from 视图名称 == 子查询结果 注意: 避免视图创建条件更新 设置只读视图 read only 放在最后面 视图不是真实数据,而是数据的一个映射。 ③索引 进行数据库查询优化,提升数据性能 聚集索引的意思可以理解为排列排序。我们创建的主键即为聚集索引,数据时按照我们的主键顺序进行排列的所以根据主键进行查询时会非常块。 非聚集索引可以简单的理解为有序目录,是一种空间换取时间的方法。添加了非聚集索引后,会给列进行排序(内部结构时B+树)。所以查询的时候我们就可以不用查询所有的数据。 在非聚集索引中,不重复的数据越多,那么索引的效率越高。 创建索引: create index 索引名称 on 表名(列名称1,列名称2) 或者 alter table 表名称 add index 索引名称 (列名称1,列名称2) 创建唯一索引 表示唯一的,不允许重复的索引。如果该字段信息保证不会重复可以设置为unique eg: create unique index 索引名称 on 表名称(列) 或者 alter table 表名称 add unique 索引名称(列) 或者在创建表的时候添加上唯一约束 删除索引 drop index 索引名称 on 表名称 或者 alter table 表名称 drop index 索引名称 查看索引 show index from 表名称 查看在表的所有索引 使用索引的原则: 较频繁的作为查询条件的字段应该创建索引 重复太多的字段不适合单独创建索引,即时频繁作为查询条件 不会出现在where字句中的字段不应该创建索引 不建议使用索引的 表的记录比较少 不重复的字段越多 ④存储过程 是一组为了完成特定功能的SQL语句集。经编译之后存储在数据库中,用户通过指定的存储过程的名字,并给出参数。存储过程中可以包含逻辑控制语句和数据操作语句。 存储过程的优点: 存储过程允许标准组件编程(存储过程创建后可以在程序中被多次调用执行,而不必重写编写该存储过程的SQL语句。而且专业的数据库专业人员可以随时对存储过程进行修海,但对应用程序代码却毫无影响,从而极大的提高了程序的可移植性) 存储过程能够实现较快的执行速度(如果某一操作包含大量的T-SQL语句代码,分别多次执行,那么存储过程要比批处理的执行速度块很多。因为存储过程是预编译的,在首次运行一个存储过程是,查询优化器对其进行分析优化,并给出最终被存在系统表中的储存计划。而批处理的T-SQL语句每次运行都需要编译和优化,所以速度要慢一些) 存储过程减轻网络流量(对于同一个针对数据库对象操作,如果者一操作所涉及到的T-SQL语句被组成一存储过程,那么当在客户机上调用该存储过程时,网络中传递只是调用语句,否则将会是多条SQL语句,从而减轻网络流量,减轻网络负载) 存储过程可被作为一种安全机制来充分利用(系统管理远可以对执行的某一个存储过程进行权限的限制,避免非授权用户对数据的访问,保证数据的安全) 不带参数的存储过程: drop proc 存储过程的名字 go create proc 存储过程的名字 as select * from 表名称 执行 exec 存储过程名称 修改存储过程: alter proc 存储过程名称 as 修改后的内容 带参数的存储过程 drop proc 存储过程名称 go create proc 存储过程名称(@startid int,@endid int) as select * from 表名称 where id between @startid and @endid go 执行存储过程 exec 存储过程名称 2,4; 没有输入输出的存储过程 create proceduce 存储过程名称 as insert into 表名称 (列名称,列名称) values (值1,值2) go 执行上面存储过程 exec 存储过程名称 有返回值的存储过程 create proc 存储过程名称 as insert into 表名称(列名称,列名称) values (值1,值2) return @@rowcount go 执行存储过程 exec 存储过程名称 有输入参数和输出参数的存储过程 create proc 存储过程名称 @username nchar(20), @userid in output as if (@username >=5) select @userid =count(*) from 表名称 where userid>25 else set @userid=1000 go 执行存储过程 exec 存储过程名称 '7',null create proc 存储过程名称 ( @id int,默认输入参数 @name varchar(20) out ,输出参数 @age varchar(20) output 输入输出参数 ) as select @name=name ,@age =age from 表名称 where id=@id and sex = @age go declare @id int, @name varchar(20), @temp varchar(20); set @id=1; set @temp=1; exec 存储过程名称 @id ,@name out,@temp output; select @name,@temp; print @name+'#'+@temp; 在as前 with recomppile 表示不缓存存储过程 eg: 分页存储过程 create proc 存储过程 ( @pageindex int, @pagesize int ) as declare @start int ,@ end int set @start = (@pageindex-1)*@pagesize +1 set @end =@start + @pagesize-1; select * from (select *, row_number over (order by id asc) as number from 表名称)t where t.number between @start and @end; 执行存储过程 exec 存储过程名称 2,2; 5.SQL server一些全局变量 select APP_NAME ( ) as w --当前会话的应用程序 insert into member(mid,name) values (myseq.nextval,'Tom');
select @@IDENTITY --返回最后插入的标识值
select USER_NAME() --返回用户数据库用户名
SELECT @@CONNECTIONS --返回自上次SQL启动以来连接或试图连接的次数。
SELECT GETDATE() --当前时间
SELECT @@CPU_BUSY/100 --返回自上次启动SQL 以来 CPU 的工作时间,单位为毫秒
USE tempdb SELECT @@DBTS as w --为当前数据库返回当前 timestamp 数据类型的值。这一 timestamp 值保证在数据库中是唯一的。
select @@IDENTITY as w --返回最后插入的标识值
SELECT @@IDLE as w --返回SQL自上次启动后闲置的时间,单位为毫秒
SELECT @@IO_BUSY AS w --返回SQL自上次启动后用于执行输入和输出操作的时间,单位为毫秒
SELECT @@LANGID AS w --返回当前所使用语言的本地语言标识符(ID)。
SELECT @@LANGUAGE AS w --返回当前使用的语言名
SELECT @@LOCK_TIMEOUT as w --当前会话的当前锁超时设置,单位为毫秒。
SELECT @@MAX_CONNECTIONS as w --返回SQL上允许的同时用户连接的最大数。返回的数不必为当前配置的数值
EXEC sp_configure --显示当前服务器的全局配置设置
SELECT @@MAX_PRECISION as w --返回 decimal 和 numeric 数据类型所用的精度级别,即该服务器中当前设置的精度。默认最大精度38。
select @@OPTIONS as w --返回当前 SET 选项的信息。
SELECT @@PACK_RECEIVED as w --返回SQL自启动后从网络上读取的输入数据包数目。
SELECT @@PACK_SENT as w --返回SQ自上次启动后写到网络上的输出数据包数目。
SELECT @@PACKET_ERRORS as w --返回自SQL启动后,在SQL连接上发生的网络数据包错误数。
SELECT @@SERVERNAME as w --返回运行SQL服务器名称。
SELECT @@SERVICENAME as w --返回SQL正在其下运行的注册表键名
SELECT @@TIMETICKS as w --返回SQL服务器一刻度的微秒数
SELECT @@TOTAL_ERRORS AS w --返回 SQL服务器自启动后,所遇到的磁盘读/写错误数。
SELECT @@TOTAL_READ as w --返回 SQL服务器自启动后读取磁盘的次数。
SELECT @@TOTAL_WRITE as w --返回SQL服务器自启动后写入磁盘的次数。
SELECT @@TRANCOUNT as w --返回当前连接的活动事务数。
SELECT @@VERSION as w --返回SQL服务器安装的日期、版本和处理器类型。