【转】SQL 语句基础

From: www.youkuaiyun.com && www.cnblogs.com

-- 数据操作

SELECT --从数据库表中检索数据行和列

INSERT --向数据库表添加新数据行

DELETE --从数据库表中删除数据行

UPDATE --更新数据库表中的数据

-- 数据定义

CREATE TABLE -- 创建一个数据库表

DROP TABLE -- 从数据库中删除表

ALTER TABLE --修改数据库表结构

CREATE VIEW --创建一个视图

DROP VIEW --从数据库中删除视图

CREATE INDEX --为数据库表创建一个索引

DROP INDEX -- 从数据库中删除索引

CREATE PROCEDURE --创建一个存储过程

DROP PROCEDURE --从数据库中删除存储过程

CREATE TRIGGER --创建一个触发器

DROP TRIGGER --从数据库中删除触发器

CREATE SCHEMA --向数据库添加一个新模式

DROP SCHEMA --从数据库中删除一个模式

CREATE DOMAIN --创建一个数据值域

ALTER DOMAIN -- 改变域定义

DROP DOMAIN --从数据库中删除一个域

--数据控制

GRANT --授予用户访问权限

DENY -- 拒绝用户访问

REVOKE -- 解除用户访问权限

--事务控制

COMMIT -- 结束当前事务

ROLLBACK --中止当前事务

SET TRANSACTION -- 定义当前事务数据访问特征

--程序化 SQL

DECLARE -- 为查询设定游标

EXPLAN --为查询描述数据访问计划

OPEN -- 检索查询结果打开一个游标 

FETCH --检索一行查询结果

CLOSE --关闭游标

PREPARE -- 为动态执行准备 SQL  语句

EXECUTE -- 动态地执行 SQL  语句

DESCRIBE --描述准备好的查询

---局部变量

declare @id char(10)

-- set @id = '10010001'

select @id = '10010001' 

---全局变量

---必须以@@开头

-- IF ELSE

declare @x int @y int @z int

select @x = 1 @y = 2 @z=3

if @x > @y

print 'x > y' -- 打印字符串'x > y'

else if @y > @z

print 'y > z'

else print 'z > y'

--CASE

use pangu

update employee

set e_wage =

case

when job_level = 1‟ then e_wage*1.08

when job_level = 2‟ then e_wage*1.07

when job_level = 3‟ then e_wage*1.06

else e_wage*1.05

end

-- WHILE CONTINUE BREAK

declare @x int @y int @c int

select @x = 1 @y=1  

while @x < 3

begin

print @x --打印变量 x  的值

while @y < 3

begin

select @c = 100*@x + @y

print @c --打印变量 c  的值

select @y = @y + 1

end

select @x = @x + 1

select @y = 1

End

-- WAITFOR

--例  等待 1  小时 2  分零 3  秒后才执行 SELECT  语句

waitfor delay 01:02:03

select * from employee

--例  等到晚上 11  点零 8  分后才执行 SELECT  语句

waitfor time 23:08:00

select * from employee

***SELECT***

select *(列名) from table_name(表名) where column_name operator value

ex:(宿主)

select * from stock_information where stockid = str(nid)

stockname = 'str_name' 

stockname like '% find this %' 

stockname like '[a- zA- Z]%' ---------  ([]指定值的范围)

stockname like '[^F- M]%' ---------  (^排除指定范围)

---------   只能在使用 like 关键字的 where 子句中使用通配符)

or stockpath = 'stock_path'

or stocknumber < 1000

an d stockindex = 24

not stock*** = 'man'

stocknumber between 20 and 100

stocknumber in(10,20,30)  

order by stockid desc(asc) ---------   排序,desc - 降序,asc- 升序

order by 1,2 ---------  by 列号

stockname = (select stockname from stock_information where stockid = 4)

---------   子查询

---------   除非能确保内层 select 只返回一个行的值,

---------   否则应在外层 where 子句中用一个 in 限定符

select distinct column_name form table_name ---------  distinct 指定检索独有的列值,不重复

select stocknumber ,"stocknumber + 10" = stocknumber + 10 from table_name

select stockname , "stocknumber" = count(*) from table_name group by stockname

---------  group by  将表按行分组,指定列中有相同的值

having count(*) = 2 ---------  having 选定指定的组

select * 

from table1, table2 

where table1.id *= table2.id --------   左外部连接,table1 中有的而 table2 中没有得以 null 表示

table1.id =* table2.id - -------   右外部连接

select stockname from table1

union [all] -----  union 合并查询结果集,all- 保留重复行

select stockname from table2

***insert***

insert into table_name (Stock_name,Stock_number) value ("xxx","xxxx")

value (select Stockname , Stocknumber from Stock_table2)--- value 为 select 语句

***update***

update table_name set Stockname = "xxx" [where Stockid = 3]

Stockname = default 

Stockname = null

Stocknumber = Stockname + 4

***delete***

delete from table_name where Stockid = 3

truncate table_name -----------   删除表中所有行,仍保持表的完整性

drop table table_name ---------------   完全删除表

***alter table*** ---   修改数据库表结构

alter table database.owner.table_name add column_name char(2) null .....

sp_help table_name ----   显示表已有特征

create table table_name (name char(20), age small int, lname varchar(30))

insert into table_name select .........  -----   实现删除列的方法(创建新表)

alter table table_name drop constraint Stockname_default ----   删除 Stockname 的default 约束

***function(/*常用函数*/)***

---- 统计函数----AVG --求平均值

COUNT --统计数目

MAX --求最大值

MIN --求最小值

SUM --求和

-- AVG

use pangu

select avg(e_wage) as dept_avgWage  

from employee

group by dept_id

-- MAX

--求工资最高的员工姓名

use pangu

select e_name

from employee

where e_wage =

(select max(e_wage)

from employee)

-- STDEV()

-- STDEV()函数返回表达式中所有数据的标准差

-- STDEVP()

-- STDEVP()函数返回总体标准差

-- VAR()

-- VAR()函数返回表达式中所有值的统计变异数

-- VARP()

-- VARP()函数返回总体变异数

---- 算术函数----/***三角函数***/

SIN(float_expression) --返回以弧度表示的角的正弦

COS(float_expression) -- 返回以弧度表示的角的余弦

TAN(float_expression) -- 返回以弧度表示的角的正切

COT(float_expression) -- 返回以弧度表示的角的余切

/***反三角函数***/

ASIN(float_expression) -- 返回正弦是 FLOAT  值的以弧度表示的角 

ACOS(float_expression) --返回余弦是 FLOAT  值的以弧度表示的角

ATAN(float_expression) --返回正切是 FLOAT  值的以弧度表示的角

ATAN2(float_expression1,float_expression2) --返回正切是 float_expression1 /float_expres- sion2 的以弧度表示的角

DEGREES(numeric_expression)--把弧度转换为角度返回与表达式相同的数据类型可为

-- INTEGER/MONEY/REAL/FLOAT  类型

RADIANS(numeric_expression) --把角度转换为弧度返回与表达式相同的数据类型可为

-- INTEGER/MONEY/REAL/FLOAT  类型

EXP(float_expression) -- 返回表达式的指数值

LOG(float_expression) -- 返回表达式的自然对数值

LOG10(float_expression)--返回表达式的以 10  为底的对数值

SQRT(float_expression) --返回表达式的平方根

/***取近似值函数***/

CEILING(numeric_expression) -- 返回>=表达式的最小整数返回的数据类型与表达式相同可为

-- INTEGER/MONEY/REAL/FLOAT  类型

FLOOR(numeric_expression) --返回<=表达式的最小整数返回的数据类型与表达式相同可为

-- INTEGER/MONEY/REAL/FLOAT  类型

ROUND(numeric_expression) --返回以 integer_expression  为精度的四舍五入值返

回的数据

--类型与表达式相同可为 INTEGER/MONEY/REAL/FLOAT  类型

ABS(numeric_expression) -- 返回表达式的绝对值返回的数据类型与表达式相同可为

-- INTEGER/MONEY/REAL/FLOAT  类型

SIGN(numeric_expression) -- 测试参数的正负号返回 0  零值 1  正数或- 1  负数返回的数据类型

--与表达式相同可为 INTEG ER/MONEY/REAL/FLOAT  类型

PI() --返回值为 π  即 3.1415926535897936

RAND([integer_expression]) --用任选的[integer_expression]做种子值得出 0- 1  间

的随机浮点数

---- 字符串函数----ASCII() --函数返回字符表达式最左端字符的 ASCII  码值

CHAR() --函数用于将 ASCII  码转换为字符

--如果没有输入 0 ~ 255  之间的 ASCII  码值 CHAR  函数会返回一个 NULL  值

LOWER() -- 函数把字符串全部转换为小写

UPPER() --函数把字符串全部转换为大写

STR() -- 函数把数值型数据转换为字符型数据 

LTRIM() --函数把字符串头部的空格去掉

RTRIM() --函数把字符串尾部的空格去掉

LEFT(),RIGHT(),SUBSTRING() --函数返回部分字符串

CHARINDEX(),PATINDEX() -- 函数返回字符串中某个指定的子串出现的开始位置

SOUNDEX() --函数返回一个四位字符码 

-- SOUNDEX 函数可用来查找声音相似的字符串但 SOUN DEX 函数对数字和汉字均只返回 0  值 

DIFFERENCE() --函数返回由 SOUNDEX  函数返回的两个字符表达式的值的差异

-- 0  两个 SOUNDEX  函数返回值的第一个字符不同

-- 1  两个 SOUNDEX  函数返回值的第一个字符相同

-- 2  两个 SOUNDEX  函数返回值的第一二个字符相同

-- 3  两个 SOUNDEX  函数返回值的第一二三个字符相同

-- 4  两个 SOUNDEX  函数返回值完全相同

QUOTENAME() --函数返回被特定字符括起来的字符串

/*select quote name('abc', '{') quotename('abc')

运行结果如下

---------------------------------- {

{abc} [abc]*/

REPLICATE() -- 函数返回一个重复 character_expression  指定次数的字符串

/*select replicate('abc', 3) replicate( 'abc',  - 2)

运行结果如下

-----------   -----------abcabcabc NULL*/

REVERSE() --函数将指定的字符串的字符排列顺序颠倒

REPLACE() --函数返回被替换了指定子串的字符串

/*select replace('abc123g', '123', 'def')

运行结果如下

-----------   -----------abcdefg*/

SPACE() --函数返回一个有指定长度的空白字符串

STUFF() --函数用另一子串替换字符串指定位置长度的子串

---- 数据类型转换函数----CAST()  函数语法如下

CAST() (<expression> AS <data_ type>[ length ])

CONVERT()  函数语法如下

CONVERT() (<data_ type>[ length ], <expression> [, style])

select cast(100+99 as char) convert(varchar(12), getdate())

运行结果如下

------------------------------   ------------199 Jan 15 2000

---- 日期函数----DAY() -- 函数返回 date_expression  中的日期值

MONTH() -- 函数返回 date_expression  中的月份值

YEAR() --函数返回 date_expression  中的年份值

DATEADD(<datepart> ,<number> ,<date>) --函数返回指定日期 date  加上指定的额外日期间隔 number  产生的新日期

DATEDIFF(<datepart> ,<number> ,<date>)--函数返回两个指定日期在 datepart  方面的不同之处

DATENAME(<da tepart> , <date>) -- 函数以字符串的形式返回日期的指定部分

DATEPART(<datepart> , <date>) --函数以整数值的形式返回日期的指定部分

GETDATE() --函数以 DATETIME  的缺省格式返回系统当前的日期和时间

---- 系统函数----

APP_NAME() -- 函数返回当前执行的应用程序的名称

COALESCE() -- 函数返回众多表达式中第一个非 NULL  表达式的值

COL_LENGTH(<'table_name'>, <'column_name'>) -- 函数返回表中指定字段的长度值

COL_NAME(<table_id>, <column_id>) -- 函数返回表中指定字段的名称即列名

DATALENGTH() -- 函数返回数据表达式的数据的实际长度

DB_ID(['database_name']) -- 函数返回数据库的编号

DB_NAME(database_id) --函数返回数据库的名称 

HOST_ID() --函数返回服务器端计算机的名称

HOST_NAME() --函数返回服务器端计算机的名称

IDENTITY(<data_type>[, seed increment]) [AS column_name])

-- IDENTITY()  函数只在 SELECT INTO  语句中使用用于插入一个 identity 

column 列到新表中

/*select identity(int, 1, 1) as column_name

into newtable

from oldtable*/

ISDATE() -- 函数判断所给定的表达式是否为合理日期

ISNULL(<check_expression>, <replacement_value>)  --函数将表达式中的 NULL 

值用指定值替换

ISNUMERIC() -- 函数判断所给定的表达式是否为合理的数值

NEWID() --函数返回一个 UNIQUEIDENTIFIER  类型的数值

NULLIF(<expression1>, <expression2>)

--NULLIF  函数在 expression1  与 expression2  相等时返回 NULL  值若不相等时

则返回 expression1  的值

 

SQLSERVER2000 -数据库的登陆及其用户权限

相应的系统存储过程:

登陆管理:sp_addlogin  新增帐号

sp_droplogin  删除帐号

sp_grantlogins  允许某 windows 帐号访问

sp_denylogins  禁止某 windows 帐号访问

sp_revokelogins  删除某 windows 帐号访问

sp_helplogin  查看帐号信息

sp_addsrvrolemember  将某用户添加到服务器角色

sp_dropsrvrolemember  将某用户从数据库角色中删除

sp_helpsrvrole  查看服务器角色的信息

数据库用户管理:sp_grantaccess  建立数据库用户

sp_revokedbaccess  删除数据库用户

sp_helpuser  查看用户信息

数据库角色管理:sp_addrole  建立数据库角色

sp_addrolemember  将用户加入数据库角色

sp_helprole  查看数据库角色信息

sp_helprolemember  查看某数据库角色的所有成员

sp_droprole  删除角色

sp_droprolemember  删除角色中的某一成员

SQLSERVER 中使用存储过程(Stored Procedure)

优点:

1.执行效率高(这点不容置疑)

2.统一的操作流程:也就是通过存储过程的操作避免了一些操作过程中可能无意中认为的错误,只要确定了制作存储过程时是正确地,以后在调用过程中就不用担心了。大家使用时流程是一样的。

3.重复使用

4.安全性:这一点我们在数据库的安全策略里讨论过,可以参考前边的文章。

也就是说:我们可以利用存储过程作为数据存储的管道。可以让客户在一定的范围内对数据进行操作。另外,存储过程是可以加密的,这样别人就看不到他的内容了。

存储过程分为三类:

系统存储过程(System stored Procedure)sp_开头,为 SQ LSERVER 内置存储过程:

screen.width - 333)this.width=screen.width- 333" border="0" 

galleryimg="no" />

扩展存储过程(Extended stored Procedure),也就是外挂程序,用于扩展

SQLSERVER 的功能,以 sp_或者 xp_开头,以 DLL 的形式单独存在。 

(观察上面的你会发现系统存储过程和扩展存储过程都是在 master 数据库中。sp_开头的可是全局的,任何一个数据库都可以直接调用的。)

用户定义的存储过程(User- defined stored Procedure),这个就是用户在具体的数据库中自己定义的,名字最好不要以 sp_和 xp_开头,防止混乱。了解了基本概念,就到应用的阶段了。

首先创建一个存储过程(在 pubs 数据库中),我们命名为 MyProce 示例代码如下(功能为向 stores 表中插入 stor_id,stor_name 两个字段值):

create procedure MyProce

@param1 char(4), @param2 varchar(40) -- 定义参数,作为存储过程的接口

with encryption -- 存储过程加密

as insert stores (stor_id,stor_name) values(@param1,@param2)

go

我们如此调用:

exec MyProce 111111,Leijunbook‟ --参数赋值,调用存储过程用企业管理器创建如图所示:


如果我们要修改,可以查看相应的存储过程的“ 属性“ ,如上图在” 文本“ 窗体中修改。

但是注意我们这个因为用了 with encryption 语句,所以,打开时将有下面的提示,不允许查看,这也就是加密。


看了上面的是不是有所了解了,其实创建时还有其他的参数可以使用,我们这里只是一个简单的例子,更多的应用需要我们在实践中不断的总结,这样才能更加灵活的应用。  下面我们再来看一个创建的例子(这个的作用是在 authors 表中查找一个人名,表中把一个名字分为两字段存储了,如果查到了,打印“ 查有此人ID:” 及其 au_id 字段值):

CREATE procedure SearchMe

@param1 varchar(10),@param2 varchar(30)

as

select @param2=au_id

from aut hors

where au_fname+au_lname=@param1 

if @@rowcount>0 -- 全局变量,记录影响到的行

print'查有此人 ID:'+@param2

GO

我们这样执行:Exec SearchMe leijun,null

下面我们谈谈使用过程中我了解到的注意事项:

1.在存储过程中,有些建立对象的语句是不可使用的:create default,create 

trigger,create procedure,create view,create rule.

2.在同一数据库中,不同的所有者可以建立相同名称的对象名。例如:

a.sample,b.sample,c.sample 三个数据表可以同时存在。如果存储过程中未指明对象的所有者(例如存储过程中的语句 select * from sample,这句中的 sample 没有指明所有者),在执行的过程中默认的所有者查找顺序是:相应的存储过程的建立者->相应数据库的所有者。如果这个查找过程中没有把所有者确定下来,系统就要报错。

(这里我额外插一句:如果需要严密的数据操作,在任何操作中尽量加上所有者,例如 leijun.sample

3.在存储过程名称前边添加#或者##,所建立的存储过程则是“ 临时存储过程“ (#是局部临时存储过程,##是全局临时存储过程)。

上面的都是一些容易忽略的,特别是第二条,我们一定的认真思考,也许这些有意无意的忽略是我们造成错误的根源!!

MSSQL 经典语句 

1. 按姓氏笔画排序:Select * From TableName Order By CustomerName CollateChinese_PRC_Stroke_ci_as 

2. 数据库加密:select encrypt('原始密码')

select pwdencrypt('原始密码')

select pwdcompare('原始密码','加密后密码') = 1-- 相同;否则不相同  encrypt('原始密码')

select pwdencrypt('原始密码')

select pwdcompare('原始密码','加密后密码') = 1-- 相同;否则不相同

3. 取回表中字段:declare @list varchar(1000),@sql nvarchar(1000) 

select @list=@list+','+b.name from  sysobjects a,syscolumns b where a.id=b.id and a.name='表 A'

set @sql='select '+right(@list,len(@list)- 1)+' from  表 A' 

exec  (@sql)

4. 查看硬盘分区:EXEC  master.. xp_fixeddrives

5. 比较 A,B 表是否相等:

if (select checksum_agg(binary_checksum(*)) from A) = (select checksum_agg(binary_checksum(*))  from   B)

print '相等'

else

print '不相等'

6. 杀掉所有的事件探察器进程:DECLARE  hcforeach CURSOR  GLO BAL FOR 

SELECT 'kill '+RTRIM(spid) FROM  master.dbo.sysprocesses

WHERE program_name IN('SQL profiler',N'SQL  事件探查器')

EXEC sp_msforeach_worker '?'

7. 记录搜索:开头到 N 条记录

Select  Top N * From   表

------------------------------- 

N 到 M 条记录( 要有主索引 ID)Select  Top M- N * From   表  Where  ID in (Select  Top M ID From  表) Order by ID  Desc

----------------------------------N 到结尾记录

Select  Top N * From   表  Order by  ID  Desc

8. 如何修改数据库的名称:sp_renamedb 'old_name', 'new_name' 

9:获取当前数据库中的所有用户表 select Name from  sysobjects where  xtype='u' and status>=0

10:获取某一个表的所有字段 select  name  from   syscolumns  where  id=object_id('表名')

11:查看与某一个表相关的视图、存储过程、函数 select a.*  from  sysobjects a, 

sy scomments b where a.id = b.id and b.text like '%表名%'

12:查看当前数据库中所有存储过程 select  name as  存储过程名称  from

sysobjects where  xtype='P'

13:查询用户创建的所有数据库 select *  from   master..sysdatabases D where sid not in(select sid from master..syslogins where name='sa')

或者

select db id, name AS DB_NAME  from  master..sysdatabases  where sid <> 0x01

14:查询某一个表的字段和数据类型 select column_name,data_type  from information_schema.columns where table_name = '表名' 

[n].[标题]:Select * From TableName Order By CustomerName 

[n].[标题]:Select * From TableName Order By CustomerName 

 

触发器-MSSQL 常用操作

1、触发器。

定义:  何为触发器?在 SQL Server 里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序。触发器是一个特殊的存储过程。常见的触发器有三种:分别应用于 Insert , Update , Delete  事件。 (SQL Server 2000定义了新的触发器,这里不提)

我为什么要使用触发器?比如,这么两个表:

Create Table Student( --学生表

StudentID int primary key, -- 学号....)

Create Table BorrowRecord( --学生借书记录表

BorrowRecord int identity(1,1), -- 流水号 

StudentID int , -- 学号

BorrowDate datetime, --借出时间

ReturnDAte Datetime, -- 归还时间

...

)

用到的功能有:

1. 如果我更改了学生的学号,我希望他的借书记录仍然与这个学生相关(也就是同时更改借书记录表的学号);

2. 如果该学生已经毕业,我希望删除他的学号的同时,也删除它的借书记录。等等。

这时候可以用到触发器。对于 1,创建一个 Update 触发器:

Create Trigger truStudent

On Student

for Update

As

if Update(StudentID)

begin

Update BorrowRecord 

Set StudentID=i.StudentID

From BorrowRecord br , Deleted d ,Inserted i 

Where br.StudentID=d.StudentID

end 

理解触发器里面的两个临时的表:Deleted , Inserted  。注意 Deleted  与 Inserted分别表示触发事件的表“ 旧的一条记录” 和“ 新的一条记录”。一个 Update  的过程可以看作为:生成新的记录到 Inserted 表,复制旧的记录到Deleted 表,然后删除 Student 记录并写入新纪录。对于 2,创建一个 Delete 触发器

Create trigger trdStudent

On Student

for Delete

As

Delete BorrowRecord 

From BorrowRecord br , Delted d

Where br.StudentID=d.StudentID

从这两个例子我们可以看到了触发器的关键:A.2 个临时的表;B.触发机制。

这里我们只讲解最简单的触发器。复杂的容后说明。事实上,我不鼓励使用触发器。触发器的初始设计思想,已经被“ 级联” 所替代.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值