SQL 語句

--语 句                                功 能
--数据操作
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
     and stockindex = 24
     not stocksex = '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 smallint, 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)
                       --把弧度转换为角度返回与表达式相同的数据类型可为
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 负数返回的数据类型
        --与表达式相同可为INTEGER/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函数可用来查找声音相似的字符串但SOUNDEX函数对数字和汉字均只返回0 值    
DIFFERENCE()    --函数返回由SOUNDEX 函数返回的两个字符表达式的值的差异
    --0 两个SOUNDEX 函数返回值的第一个字符不同
    --1 两个SOUNDEX 函数返回值的第一个字符相同
    --2 两个SOUNDEX 函数返回值的第一二个字符相同
    --3 两个SOUNDEX 函数返回值的第一二三个字符相同
    --4 两个SOUNDEX 函数返回值完全相同
                                      
QUOTENAME()  --函数返回被特定字符括起来的字符串
/*select quotename('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(<datepart> , <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 的值

Feedback

#1楼 [楼主]   回复  引用  查看    

2007-07-19 08:26 by 苹果引擎
1、创建数据库:create database Flights; //Flights数据库名。
示例1:一个数据库文件和一个日志文件
CREATE DATABASE stuDB
(
/*数据文件的具体描述*/
NAME='stuDB_data', //主数据文件的逻辑名。
FILENAME='D:/project/stuDB_data.mdf', //主数据文件的物理名。
SIZE=5mb, //主数据文件的大小。
MAXSIZE=100mb, //主数据文件增长的最大值。
FILLEGROWTH=15%, //主数据文件的增长率。
)
LOG ON
(
/*日志文件的具体描述,各参数含义同上。*/
NAME='stuDB_log',
FILENAME='D:/project/stuDB_log.ldf',
SIZE=2mb,
FILEGROWTH=1mb,
)
GO //和后续的SQL语句分隔开。
/*------数据文件的组成:
主数据文件:*.mdf
次要数据文件:*.ndf
日志文件:*.ldf
------*/
2、删除数据库:drop database Flights;
3、配置数据库选项:
EXEC sp_dboption 'pubs','read only','true' //将pubs数据库设为只读。
——用EXECUTE(EXEC)命令配置SQL Server 2000数据库。参数sp_dboption为存储过程,可以显示或更改数据库选项。'master'和'tempdb'不能使用此存储过程。
EXEC sp_dboption 'pubs',autoshrink,true //自动周期性收缩'pubs'数据库文件。
——和sp_dboption一起使用的选项autoshrink。SQL Server 2000允许把数据库中的文件收缩,这样可以删除未使用页并建立更多空间。可以手动收缩或者设置为定期自动收缩数据库文件。收缩过程可以设置为后台运行,而其他的任务可以继续在前台进行。
EXEC sp_dboption 'pub','single user' //同一时间内只有一个用户可以访问这个数据库。
——分离数据库
EXEC sp_detach_db '数据库名'
——附加数据库
EXEC sp_attach_db '数据库名','数据库文件的物理位置'
——更改数据库名
EXEC sp_renamedb '旧数据库名','新数据库名'
——添加Windows登录帐户
EXEC sp_grantlogin 'windows域名/域帐户' //windows域名/域帐户:计算机名,在计算机管理器中添加。
——添加SQL登录帐户
EXEC sp_addlogin '帐户名','密码'
——创建数据库用户
EXEC sp_grantdbaccess '登录帐户','数据库用户' //"数据库用户"为可选项,默认为登录帐户,即数据库用户默认和登录帐户同名。

4、收缩数据库:
DBCC SHRINKDATABASE(PUBS,10) //用DBCC命令收缩数据库,减少'pubs'数据库中文件大小,并允许其有 10%的未用空间。
5、创建表:
creat table Airlines_Master(Aircode char(2),AirName varchar(15))
创建表Airlines_Master,表有两个字段Aircode和AirName,数据类型char和varchar,大小2,15。
6、SQL Server数据类型
7、数据完整:
(1)实体完整性:
“实体完整性”的规则规定,基表主键的任何部分都不可以接受空值。
主键:唯一地标识表中的记录的一个或一组列称为“主键”。
每个表都应有一个主键。
(2)域完整性:
指定输入到给定列的数据的合法性。
(3)引用完整性:
“引用完整性”的规则规定,所引用的外部数据必须存在。
DBMS负责确保外键的属性值有效,并且在该属性作为主键的表中能找到与之对应的匹配项。仅当在其他表中没有与之对应的外键时,主表中的记录才能删除。外键中不能引入新的值。
外键:是一个或一组列,其中列的值与另外一个表中的主键或唯一键匹配。
   1、两个表是通过外键关联起来的。
   2、在给定的表中,要将某一列设置为外键,那么该列应该对应另外一个表的主键或唯一键。
   3、两个通过外键关系关联到一起的表,其相应字段的类型定义应该相同。
(4)用户定义完整性:
8、主键(PRIMARY KEY)约束
(1)主键(PRIMARY KEY):
——创建主键方法一:
create table table_name
(PNR_no int PRIMARY KEY) //在建table_name表时,为PNR_no列创建主键约束。
——创建主键方法二:(更改主键约束)
alter table table_name
add constraint PK_const
PRIMARY KEY(PNR_NO)
//为表table_name的PNR_NO列添加PK_const(约束名)主键约束。
(2)组合键:
(3)标识主键:
(4)唯一约束:
(5)标识属性:
——IDENTITY(自动增长)
creat table table_name
(PNR_no int IDENTITY(1,1))
//创建表table_name,PNR_no列名,IDENTITY属性,1:初始值。1:步长(可以是负值)。
9、修改数据库表:
ALTER TABLE table_name
[ALTER COLUMN column_name int] //指定要修改的列,int 指定将列修改为新的数据类型int。
|ADD column_name int //int要添加列的数据类型,ADD向表中加一列。
|DROP COLUMN column_name //DROP COLUMN 从表中删除一列
10、删除数据库中表:
drop table table_name
drop table不能删除有外键约束引用的表。
11、约束和约束对象
12、DEFAULT
13、外键约束:
14、添加和删除表的约束对象:
——在创建表时创建约束:
create table table_name
(column_first char(2) primary key,column_second varchar(15));
//创建table_name表,给column_first 列创建主键约束。
——在现有表中创建约束
alter table table_name add constraint check_name check(unityprice>=10)
//给表table_name添加check_name约束条件为unityprice>=10,add constraint 关键字。
——添加主键约束(stuNo作为主键)
ALTER TABLE stuInfo
ADD CONSTRAINT PK_stuNo PRIMARY KEY(stuNO)
——添加唯一约束(身份证号唯一,因为每人的身份证号是全国唯一的)
ALTER TABLE stuInfo
ADD CONSTRAINT UQ_stuID UNIQUE(stuID)
——添加默认约束(如地址不添,默认值为“地址不详”)
ALTER TABLE stuInfo
ADD CONSTRAINT DF_stuAddress DEFAULT('地址不详') FOR stuAddress
——添加检查check约束,要求年龄只能在15—40岁之间。
ALTER TABLE stuInfo
ADD CONSTRAINT CK_stuAge CHECK(stuAge BETWEEN 15 AND40)
——添加外键约束(主表stuInfo和从表stuMarks建立关系,关联字段为stuNo)
ALTER TABLE stuMarks
ADD CONSTRAINT FK_stuNo
FOREIGN KEY(stuNo) REFERENCES stuInfo(stuNo)
GO
——删除约束
ALTER TABLE stuInfo
DROP CONSTRAINT DF_stuAddress
15、T-SQL中的条件表达式和逻辑运算符:
(1)一元运算符:
(2)二元运算符:
(3)比较运算符:
(4)通配符:
(5)逻辑运算符:
16、插入语句:
INSERT INTO jobs VALUES('Graphic Artist',25,100) //插入一行。
17、将一个表中的数据添加到另一个表中:
CREATE TABLE author_details(au_id varchar(11),au_lname varchar(40),)
GO
INSERT author_details SELECT authors.au_id,authors.au_lname, FROM authors
//将authors表中的au_id和au_lname列的内容插入到author_details表中。
18、更新表中的数据
(1)更新一行
UPDATA table_name
SET price=price+(25/100*price)
WHERE table_id='TC7777'
//更新table_name表的列table_id的TC7777行的price列的值为price+(25/100*price)。
(2)更新多行
UPDATA table_name
SET column_first='aaa',column_second=1
//将table_name表的column_first和column_second的所有行更新为aaa和1.
(3)使用关联信息更新
——内联接
——外连接
——自链接
19、从表中删除数据
(1)删除一行数据
delete from pub_info where pub_id=9999 //删除pub_id值为9999的行
(2)删除多行数据
delete from stores where state='CA' // 删除state所有值为CA的行。
(3)删除表中的所有数据
truncate table sales //truncate table 用于删除表中所有行的命令。
不能用于有外键约束引用的表,这种情况下,需要使用不带WHERE子句的DELETE语句。
20、查询语句:
SELECT column_1,column_2 FROM table_name;
//列名用“,”分开,";"是可选的。
SELECT * FROM table_name //搜索table_name的所有列。
SELECT au_fname FROM authors WHERE state='CA'; //WHERE指定了查询条件
SELECT state FROM authors GROUP BY state //查询authors表的state列,并按不同内容的state列分组。
SELECT * FROM authors WHERE state='CA' ORDER BY au_fname
//查询authors表的所有符合state='CA' 条件的列,并按au_fname排序。参数未指定默认为升序。DESC是降序,ASC是升序。
21、在查询中使用常量:
当连接字符列时,为了获得正确的格式或可读性,可以使用字符串常量。常数一般不会在结果集中作为单独的列指定。通常在显示结果集时,使用应用程序将常数值合并到结果集中比通过服务器合并常数值效率更高。
SELECT title_id+':'+title+'->'+type FROM titles
//搜索titles表中的title_id列、title列、type列,并用###:ttt->xx的形式显示。
注意:在已选的表中使用加号(+)时,一定要注意列的数据类型。该列与其左右两边的列的数据类型应该一致。否则SQL Server会给出错误信息。
22、使用AS子句命名列:
SELECT PNR_no AS 'PNR NUMBER' FROM Reservation
//搜索Reservation表的PNR_no列,显示列名为“PNR NUMBER”
23、使用标识列:
SELECT IDENTITY(datatype,seed,increment) AS column_name
INTO Table2
FROM Table1
//检索表Table1,将检索到的内容放到表Table2中列名为column_name的列中,datatype为数据类型(Int或Decimal);seed为第一行的值,increment为递增的步长。
24、使用TOP子句限制查询返回行数。
SELECT TOP 3 * FROM table;
//显示table表的前三行。
SELECT TOP 40 PERCENT * FROM table;
//显示表table所有行中前40%的行。
25、分组查询
26、聚合函数
——SUM:返回表达式中所有数值的总和。
——AVG:返回表达式中所有数值的平均值。
——COUNT:返回提供的表达式中非空值的数目。
——MAX:返回表达式中最大的值。
——MIN:返回表达式中最小的值。
27、使用HAVING子句选择行
28、向数据库用户授权
USE database_name //数据库名、
GO
//为DBUser分配对表table_name的select,insert,updata 权限。
GRANT select,insert,updata ON table_name TO DBUser
//为DBUser2分配建表的权限。
GRANT create table TO DBUser2
29、使用变量
——局部变量
DECLARE @variable_naem DataType //@variable_naem 局部变量名称,DataType为数据类型。
——局部变量的付值
1、
SET @variable_name=value
2、
SELECT @variable_name=value
——全局变量
全局变量有系统定义和维护。
@@ERROR           最后一个T-SQL错误的错误号
@@IDENTITY         最后一个插入的标识值
@@LANGUAGE        当前使用语言的名称
@@MAX_CONNECTIONS    可以创建的同时链接的最大数目
@@ROWCOUNT        受上一个SQL语言影响的行数
@@SERVERNAME        本地服务器的名称
@@SERVICENAME       该计算机上的SQL服务的名称
@@TIMETICKS         当前计算机上每刻度的微秒数
@@TRANSCOUNT       当前连接打开的事务数
@@VERSION          SQL Server的版本信息
30、输出语句
print '服务器的名称:'+@@SERVERNAME //本地服务器名称
SELECT @@ SERVERNAME AS '服务器名称'
示例:
//@@ERROR返回的是整型数值,用convert(varchar(5),@@ERROR)的方式将它转换为字符串。
INSERT INTO stuInfo(stuName,stuNo,stuSex,stuAge)VALUES('梅超风','s25318','女','23')
print '当前错误号'+convert(varchar(5),@@ERROR) //如果大于0,表示上一条语句执行有错误
print '刚才报名的学员,座位号为:' +convert(varchar(5),@@IDENTITY)
UPDATA stuinfo SET stuAge=85 WHERE stuName='李文才'
print 'SQL Server 的版本'+@@VERSION
GO
//输出结果为
当前错误号0
刚才报名的学员,座位号:12
服务器:消息547,级别16,状态1,行1
UPDATA 语句与COLUMN CHECK 约束’CK_stuAge‘冲突。该冲突发生于数据库'stuDB',表'stuInfo'
语句终止
当前错误号547
SQL Server的版本Microsoft SQL Server 2000-8.00.2039(Intel X86)
……
31、逻辑控制语句
IF-ELSE:
IF(条件)
BEGIN
语句1
语句2
END
ELSE
……
WHILE循环语句:
WHILE(条件)
BEGIN
语句或语句块
[BREAK]
END
CASE多分支语句:
CASE
WHEN 条件1 THEN 结果1
WHEN 条件2 THEN 结果2
[ELSE 其他结果]
END

32、批处理语句“GO”
"GO"就是批处理的标志,它是一条或多条SQL语句的集合,SQL Server将批处理语句编译成一个可执行单元,此单元成为执行计划。每个批处理可以编译成单个执行计划,从而提高执行效率。如果批处理包含多条SQL语句,执行这些语句所需的所有优化的步骤将编译在单个执行计划中。
批处理的主要好处就是简化数据库的管理。
批处理示例如下:
USE Master
GO
//GO关键字标志批处理结束。
另一个示例:
SELECT * FROM stuInfo
SELECT * FROM stuMarks
UPDATA stuMarks SET writtenExam=writtenExam+2
GO
//此时三条语句组成一个执行计划,然后再执行。
一般是将一些逻辑相关的业务操作语句,放置在同一批中,这完全由代码编写者决定。
但是,SQL Server规定:如果是建库、建表语句、以及我们后面学习的存储过程和视图等,则必须在语句末 尾加“GO”批处理标志。
33、简单子查询
方法一:采用T-SQL变量实现
DECLARE @age INT //定义变量,用于存放李斯文的年龄
SELECT @age=stuAge FROM stuInfo where stuName='李斯文' // 求出李斯文的年龄。
SELECT * FROM stuInfo WHERE stuAge>@age //筛选比李斯文年龄大的学员。
GO
方法二:采用子查询实现。
SELECT * FROM stuInfo
WHERE stuAge>(SELECT stuAge FROM stuIfo where stuName='李斯文')
GO
//必须保证子查询返回的值不能多于一个。
——将多表间数据组合在一起,替换连接查询。
方法一:采用表连接
SELECT stuName FROM stuInfo INNER JOIN stuMarks //INSERT JOIN 内连接
ON stuInfo.stuNo=stuMarks.stuNo WHERE writtenExam=60
GO
方法二:采用子查询
SELECT stuName FROM stuInfo
WHERE stuNo=(SELECT stuNo FROM stuMarks WHERE writtenExam=60)
go
一般来说,表连接都可以用子查询替换,但反过来说却不一定。有的子查询不能用表连接来替换。子查询比较灵活、方便,形式多样,适合于作为查询的筛选条件。而表连接更适合查多表的数据。
34、IN和NOT IN子查询
使用“=”、“>”等计较运算符号,要求子查询只能返回一条或空的记录。SQL Server中,当子查询跟随在=、!=、<、<=、>、>=之后,不允许子查询返回多条记录。
——采用IN子查询
//查询参见考试的学员名单
SELECT stuName FROM stuInfo
WHERE stuNo IN (SELECT stuNo FROM stuMarks)
go
——采用NOT IN子查询
//查询未参加考试学员的名单
SELECT stuName FROM stuInfo
WHERE stuNo NOT IN (SELECT stuNo FROM stuMarks)
GO
35、EXISTS和NOT EXISTS子查询
IF EXISTS(SELECT * FROM sysDatabase WHERE name='stuDB')
DROP DATABASE stuDB
CREATE DATABASE stuDB
……建库代码略
问题:检查本次考试,本班如果有人笔试成绩达到80分以上,则每人提2分。否则,每人允许提5分。
IF EXISTS(SELECT * FROM stuMarks WHERE writtenExam>80)
BEGIN
print '本班有人笔试成绩高于80分,每人只加2分,加分后的成绩为:'
UPDATE stuMarks SET writtenExam=writtenExam+2
SELECT * FROM stuMarks
END
GO
//EXISTS 和IN 一样,同样允许添加NOT取反,表示不存在。
问题:检查本次考试,本班如果没有一人通过考试(笔试和机试成绩都>60分),则实体偏难,每人加3分,否则,每人加1分。
IF NOT EXISTS(SELECT * FROM stuMarks WHERE writtenExam>60 AND labExam>60)
BEGIN
print '本班无人通过考试,考试题偏难,每人加3分,加分后的成绩为:'
UPDATE stuMarks SET writtenExam=writtenExam+3,labExam=labExam+3
SELECT * FROM stuMarks
END
ELSE
BEGIN
print '本班考试成绩一般,每人只加1分,加分后的成绩为:'
UPDATE stuMarks SET writtenExam=writtenExam+1,labExam=labExam+1
SELECT * FROM stuMarks
END
GO
36、T-SQL语句的综合应用
假定目前本次考试学员信息表(stuIfo)和学员成绩表(stuMarks)的原始数据为如下:
stuIfo表:
stuName stuNo stuSex stuAge stuSeat stuAddress
1 张秋丽 s25301 男 18 1 北京海淀
2 李文才 s25302 男 31 3 地址不详
3 李斯文 s25303 女 22 2 河南洛阳
4 欧阳俊雄 s25034 男 28 4 新疆威武哈
5 梅超风 s25318 女 23 5 地址不详
stuMarks表:
ExamNo stuNo writtenExam labExam
1 S271811 s25303 93 59
2 S271813 s25302 63 91
3 S271816 s25301 90 83
4 S271817 s25318 63 53
问题:
1、统计本次考试的缺考情况,结构如下:
应到人数 实到人数 缺考人数
1 5 4 1
2、提取学员的成绩信息并保存结果,包括学员姓名、学号、笔试成绩、机试成绩、是否通过。
3、比较笔试平均分和机试平均分,较低者进行循环提分,但提分后最高分不能超过97分。
4、提分后,统计学员的成绩和通过情况,如下:
姓名 学号 笔试成绩 机试成绩 是否通过
1 张秋丽 s25301 90 89 是
2 李文才 s25302 63 97 是
3 李斯文 s25303 93 65 是
4 欧阳俊雄 s25034 缺考 缺考 否
5 梅超风 s25318 63 59 否 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值