数据库分析
1.DDL (Data Definition Language )数据库定义语言 statements are used to define the database structure or schema.
DDL是SQL语言的四大功能之一。
DDL不需要commit.
CREATE
ALTER
DROP
2.DML (Data Manipulation Language)数据操纵语言 statements are used for managing data within schema objects.
由DBMS提供,用于让用户或程序员使用,实现对数据库中数据的操作。
DML分成交互型DML和嵌入型DML两类。
依据语言的级别,DML又可分成过程性DML和非过程性DML两种。
需要commit.
SELECT
INSERT
UPDATE
DELETE
LOCK TABLE
3、DCL(Data Control Language)数据库控制语言 授权,角色控制等
GRANT 授权
REVOKE 取消授权
4.TCL(Transaction Control Language)事务控制语言
sql中any和all的区别
这两个都是用于子查询的
any 是任意一个
all 是所有
select * from student where 班级=01' and age > any(select age from student where 班级='02');
以上就是说,查询出01班中,年龄大于 02班所有人 的 同学
相当于:select * from student where 班级='01' and age > (select max(age) from student where 班级='02');
而:select * from student where 班级='01' and age > any (select age from student where 班级='02'); 就是说,查询出01班中,年龄大于 02班任意一个 的 同学
相当于
select * from student where 班级='01' and age > (select min(age) from student where 班级='02');
select into from 和 insert into select 的用法和区别
select into from 和 insert into select都是用来复制表,两者的主要区别为: select into from 要求目标表不存在,因为在插入时会自动创建。insert into select from 要求目标表存在
如果两个表结构一样:
insert into table_name_new select * from table_name_old
如果两个表结构不一样:
insert into table_name_new(column1,column2...) select column1,column2... from table_name_old
select into from的用法:
select a.BookId, a.BookName,a.BookPrice,a.ChuMemo,a.FileName into table_name_new from BuyCard.dbo.Book a
union和union all
UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。
SQL UNION 语法
SELECT column_name FROM table_name1
UNION
SELECT column_name FROM table_name2
注释:默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。
SQL UNION ALL 语法
SELECT column_name FROM table_name1
UNION ALL
SELECT column_name FROM table_name2
SQL查找重复数据
SELECT RoleId
FROM RoleEmployee
where RoleId in (select RoleId from RoleEmployee group by RoleId having COUNT(RoleId)>1)
SQL中常用的函数:
--系统函数
SELECT COL_NAME(OBJECT_ID('Role'),1)--返回表中第1个字段的名称;
SELECT HOST_ID(); --使用该函数返回服务器端计算机的标识号
SELECT HOST_NAME();--返回服务器端计算机的名称;
--数学函数
--1、ABS(X)绝对值函数;
SELECT ABS(-2.0),ABS(2);
--2、PE()返回圆周率的函数;
SELECT PI();
--3、SQRT(X)平方根函数;
SELECT SQRT(9),SQRT(11);
SELECT RAND() ----生成的随机数;
--8、FLOOR(X)函数:返回比X小的最大整数;
SELECT FLOOR(33.333),FLOOR(-33.333);
SELECT SQUARE(0),SQUARE(3),SQUARE(-3),SQUARE(3.3);--SQUARE(X)函数:返回x的平方;
SQL日期和字符串函数
- SQLServer,时间日期,
- 1. 当前系统日期、时间
- select getdate()
- 2. dateadd 在向指定日期加上一段时间的基础上,返回新的 datetime 值
- 例如:向日期加上2天
- select dateadd(day,2,'2004-10-15') --返回:2004-10-17 00:00:00.000
- 3. datediff 返回跨两个指定日期的日期和时间边界数。
- select datediff(day,'2004-09-01','2004-09-18') --返回:17
- select datediff(day,'2004-09-18','2004-09-01') --返回:-17
- 4. datepart 返回代表指定日期的指定日期部分的整数。
- SELECT DATEPART(month, '2004-10-15') --返回 10
- 5. datename 返回代表指定日期的指定日期部分的字符串
- SELECT datename(weekday, '2004-10-15') --返回:星期五
- select 本年第多少周=datename(week,'2004-10-15')
- ,今天是周几=datename(weekday,'2004-10-15')
--返回字符表达式最左侧指定数目的字符串
select LEFT('abcdefg',0)--''
select LEFT('abcdefg',1)--'a'
select LEFT('abcdefg',2)--'ab'
--返回字符表达式最右侧指定数目的字符串select RIGHT('abcdefg',0)--''
select RIGHT('abcdefg',1)--'g'
select RIGHT('abcdefg',2)--'gf'
--SUBSTRING(被截取字符串,开始位置,长度)
SELECT SUBSTRING('abcd',1,1)--a
SELECT SUBSTRING('abcd',2,2)--bc
--返回转换为小写的字符串select LOWER('abcdefg')--'abcdefg'
--返回转换为大写的字符串select UPPER('abcdefg')--ABCDEFG
--返回去左空格的字符串select LTRIM(' abcdefg')--'abcdefg'
--返回去右空格的字符串select RTRIM('abcdefg ')--'abcdefg'
--replace(被搜索字符串,要被替换的字符串,替换的字符串)
select REPLACE('abcdefg','cd','a')--abaefg
select REPLACE('abcdefg','cd','')--abefg
--返回指定次数重复的表达式select REPLICATE('a',4)--aaaa
select REPLICATE('abc|',4)--abc|abc|abc|abc|
--返回反转后的字符串select REVERSE('ABC')--CBA
--返回字符串的长度select LEN('abcdefg')—7
SQL自定义函数:
一、标量值函数(返回一个值)
CREATE FUNCTION MySTR(@strs VARCHAR(50))
RETURNS VARCHAR(50)
AS
BEGIN
DECLARE @str2 VARCHAR(30)
SET @str2=@strs
RETURN @str2
END
--执行函数
SELECT dbo.MySTR('aa') AS result
--在sql 语句也可以这样用:
DECLARE @str3 VARCHAR(30)
SET @str3=(select name from userinfo where huji=dbo.MySTR('邯郸') and id=23 )
select @str3
二、表格值函数(返回多列或者一张表)
CREATE FUNCTION tabcmess(@title VARCHAR(10))
RETURNS TABLE
AS
return(select a.GoodsId,a.GoodsName from GoodsDB.dbo.Goods a where a.GoodsName like '%'+@title+'%')
--执行
SELECT * FROM tabcmess('韭菜炒鸡蛋')
Sql创建临时表
create table #table1(局部临时表)
(
id int,
name varchar(50)
)
create table ##table2(全局临时表)
(
id int,
name varchar(50)
)
select a.GoodsId,a.GoodsName,a.GoodsNum into #table3 from GoodsDB.dbo.Goods a
SQL条件判断和循环语句
if语句使用示例:
declare @a int
set @a=12
if @a>100
begin
print @a
end
else
begin
print 'no'
end
2、while语句使用示例:
declare @i int
set @i=1
while @i<30
begin
insert into test (userid) values(@i)
set @i=@i+1
end
SQL类型转换函数
select CAST('123.4' as decimal(9,2)) -- 123.40
select CONVERT(decimal(9,2), '123.4') -- 123.40
SQL视图
什么是视图?
视图是一个虚拟的表,是一个表中的数据经过某种筛选后的显示方式,视图由一个预定义的查询select语句组成。
视图的特点。
视图中的数据并不属于视图本身,而是属于基本的表,对视图可以像表一样进行insert,update,delete操作。
视图不能被修改,表修改或者删除后应该删除视图再重建。
视图的数量没有限制,但是命名不能和视图以及表重复,具有唯一性。
视图可以被嵌套,一个视图中可以嵌套另一个视图。
视图不能索引,不能有相关联的触发器和默认值,sql server不能在视图后使用order by排序。
视图的优点:
简单性。视图不仅可以简化用户对数据的理解,也可以简化他们的操作。那些被经常使用的查询可以被定义为视图,从而使用户不必为以后的操作每次都指定全部的条件。
安全性。通过视图用户只能查询和修改他们所能见到的数据。数据库中的其他数据则既看不见也取不到。数据库授权命令可以使每个用户对数据库的检索限制到特定的数据库对象上,但不能授权到数据库特定行和特定的列上。通过视图,用户可以被限制在数据的不同子集上。
视图的缺点
即使是视图的一个简单查询,SQL Server也把它变成一个复杂的结合体,需要花费一定的时间。
在后期的维护上 数据库的表结构变了 也会影响视图的改变,维护繁琐。
所以在定义数据库的时候,要合理的使用视图。
SQL索引:
拿汉语字典的目录页(索引)打比方:正如汉语字典中的汉字按页存放一样,SQL Server中的数据记录也是按页存放的,每页容量一般为4K 。为了加快查找的速度,汉语字(词)典一般都有按拼音、笔画、偏旁部首等排序的目录(索引),我们可以选择按拼音或笔画查找方式,快速查找到需要的字(词)。
同理,SQL Server允许用户在表中创建索引,指定按某列预先排序,从而大大提高查询速度。
• SQL Server中的数据也是按页( 4KB )存放
• 索引:是SQL Server编排数据的内部方法。它为SQL Server提供一种方法来编排查询数据 。
• 索引页:数据库中存储索引的数据页;索引页类似于汉语字(词)典中按拼音或笔画排序的目录页。
• 索引的作用:通过使用索引,可以大大提高数据库的检索速度,改善数据库性能。
USE GoodsDB
Go
IF EXISTS (SELECT name FROM sysindexes
WHERE name = 'IX_writtenExam')
begin
DROP INDEX Employee.IX_writtenExam--根据索引名进行删除
end
else
begin
CREATE clustered index IX_writtenExam--创建聚集索引
ON Employee(Phone)
end
create nonclustered index NONCLU_ABC on abc(A)--创建非聚集索引
/*-----指定按索引 IX_writtenExam 查询----*/
SELECT * FROM stuMarks (INDEX=IX_writtenExam)
WHERE writtenExam BETWEEN 60 AND 90
索引的优缺点
• 优点
– 加快访问速度
– 加强行的唯一性
• 缺点
– 带索引的表在数据库中需要更多的存储空间
– 操纵数据的命令需要更长的处理时间,因为它们需要对索引进行更新
创建索引的指导原则
• 请按照下列标准选择建立索引的列。
– 该列用于频繁搜索
– 该列用于对数据进行排序
• 请不要使用下面的列创建索引:
– 列中仅包含几个不同的值。(如果该列存在大量重复的数据,则不能在该列上创建索引,否则会降低性能)
– 表中仅包含几行。为小型表创建索引可能不太划算,因为SQL Server在索引中搜索数据所花的时间比在表中逐行搜索所花的时间更长
SQL触发器:
触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程。触发器主要是通过事件(增、删、改)进行触发被自动调用执行的。而存储过程可以通过存储过程的名称被调用。
触发器是在对表进行增、删、改时,自动执行的存储过程。触发器常用于强制业务规则,它是一种高级约束,通过事件进行触发而被执行。
二、触发器分类
SQL Server 包括两种常规类型的触发器:事前触发器,事后触发器
1、触发器分为:
(1) after触发器(事后触发)
a、 insert触发器
b、 update触发器
c、 delete触发器
(2) instead of 触发器 (事前触发)
注:after触发器要求只有执行某一操作**insert、update、delete之后触发器才被触发,且只能定义在表上。而**instead of触发器表示并不执行其定义的操作(insert、update、delete)而仅是执行触发器本身。
create trigger InsertName
on Goodsindent--触发器创建在哪张表上
with encryption--给触发器加密
for insert--创建添加类型触发器
as
declare @goodsname varchar(50),@qty int
select @goodsname=GoodsName,@qty=qty from inserted
update Goods set GoodsNum=GoodsNum-@qty where GoodsName=@goodsname
SQL游标:
游标(cursor)
游标是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果
在数据库中,游标是一个十分重要的概念。游标提供了一种对从表中检索出的数据进行操作的灵活手段,就本质而言,游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制
游标的一个常见用途就是保存查询结果,以便以后使用。游标的结果集是由SELECT语句产生,如果处理过程需要重复使用一个记录集,那么创建一次游标而重复使用若干次,比重复查询数据库要快的多。如果我们做的数据量大,而且系统上跑的不只我们一个业务。所以,我们都要求尽量避免使用游标,游标使用时会对行加锁,可能会影响其他业务的正常进行。而且,数据量大时其效率也较低效。另外,内存也是其中一个限制。
因为游标其实是相当于把磁盘数据整体放入了内存中,如果游标数据量大则会造成内存不足,内存不足带来的影响大家都知道了。所以,在数据量小时才使用游标
存储过程:
1.存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般 SQL 语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
2.当对数据库进行复杂操作时(如对多个表进行 Update,Insert,Query,Delete 时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。这些操作,如果用程序来完成,就变成了一条条的 SQL 语句,可能要多次连接数据库。而换成存储,只需要连接一次数据库就可以了。
3.存储过程可以重复使用,可减少数据库开发人员的工作量。
4.安全性高,可设定只有某此用户才具有对指定存储过程的使用权。