SQL语法整理[8]——SQL语言编程
2011-12-12 08:30
381 查看
SQL语法整理[8]——SQL语言编程
/*使用变量查询学生成绩信息,以学生号为变量查询*/
DELCARE @id INT /*使用DECLARE来定义变量*/
SET @id=(SELECT TOP 1 id FROM student) /*为变量赋值*/
SELECT * FROM result WHERE student_id=@id
GO
注意:每一行的结尾都没有逗号。
SQL语言详述
(1)数据定义(DDL---Data Definition Language),如CREATE TABLE命令。
(2)数据操作(DML---Data Manipulation Language),如SELECT命令。
(3)数据控制(DCL---Data Control Language),如GRANT命令。
GRANT CREATE TABLE TO user_one//授予用户user_one创建表权限。
REVOKE CREATE TABLE FROM user_one//撤消用户user_one创建表权限。
DENY SELECT ON student user_one//拒绝用户user_one在表student上的查询权限。
变量的使用
变量是可以赋值的SQL语句元素,在SQL Server中有局部与系统变量两种。
(1)局部变量
局部变量的声明需要使用DECLARE语句。语法如下:
DECLARE {@variable_name datatype[,…n]}
局部变量必须以@开头,例如:
DECLARE @age INT --声明一个整数型的变量
SET @age=23 --为变量赋值
--或者使用 SELECT @age=23
SELECT * FROM student WHERE age=@age
GO
(局部变量首先需要声明,一方面要声明其变量名称,另一方面要声明变量的数据类型。变量声明以后需要赋值,这样才能使用。赋值的方法有两种:SET和SELECT关键字。局部变量仅仅作用在语句块中,跨出了这个范围就失效了。)
系统变量
系统变量是由SQL Server系统提供的预先声明好的变量,通过在名称前保留两个(@@)符号区别于局部变量。在SQL Server中系统变量以函数的形式出现。
SELECT @@VERSION AS ‘SQL Server版本’
Go
变量的使用
变量的范围是非常大的,在SQL语句块、视图、存储过程、函数中都可以使用。
例如:创建一函数,要求在输入学生编号时输出年龄,如果年龄为0或者负值则警报。
CREATE FUNCTION fun_age(@id INT)
RETURNS VARCHAR(20)
AS
BEGIN
DECLARE @age INT,@result VARCHAR(20)
SET @age=(SELECT age FROM student WHERE id=@id)
IF(@age<0 OR @age=0)
SET @result='错误的年龄'
IF(@age>0)
SET @result='正确年龄'
RETURN @result
END
GO
运算符
运算符是进行数据计算、字符操作、常量和变量比较的符号。SQL Server主要使用的运算符包括:算术运算符、比较运算符、逻辑运算符和字符串串联运算符(+)。
控制流程语句
(1)IF ELSE
IF ELSE条件判断
IF logical_expression
expressions1
[ELSE expressions2]
(2)BEGIN END
使用BEGIN END封装的是SQL语句块,其每个语句块都是完整的单元,在SQL Server中允许使用嵌套的BEGIN END语句块.
(3)WHILE
WHILE logical_expression
BEGIN
Expression
[BREAK]
[CONTINUE]
END
(4)CASE
CASE
[WHEN logical_expression THEN result_expression][…n]
ELSE result_expression
END
/*对grade字段使用CASE关键字*/
SELECT id AS ‘学生编号’,
name AS ‘学生姓名’,
CASE grade
WHEN 1 THEN ‘一年级’
WHEN 2 THEN ‘二年级’
WHEN 3 THEN ‘三年级’
END
FROM student
GO
以上语句改为如下语句也对.但第三列没列名
SELECT id AS 学生编号,
name AS 学生姓名,
CASE
WHEN grade=1 THEN '一年级'
WHEN grade=2 THEN '二年级'
WHEN grade=3 THEN '三年级'
END
FROM student
GO
以上语句改为如下语句也对.但第三列有列名
SELECT id AS 学生编号,
name AS 学生姓名,
年级=
CASE
WHEN grade=1 THEN '一年级'
WHEN grade=2 THEN '二年级'
WHEN grade=3 THEN '三年级'
END
FROM student
GO
(5)GO
(6)RETURN
其他SQL
(1)EXISTS
EXISTS使用
存在判断函数,如果表达式返回至少一行记录,则判断为存在,返回1;如果返回的结果是空集,则判断为不存在,返回0.
IF EXISTS(SELECT COUNT(*) FROM result)
BEGIN
PRINT(‘学生成绩表格中存储了数据’)
END
ELSE
BEGIN
PRINT(‘学生成绩表格中没有存储数据’)
END
GO
(2)INSERT INTO
使用INSERT INTO语句一次性插入多条数据
前提数据库中,必须有表存储了要插入的数据,或者可以通过系统函数来提供(比如使用GETDATE()来提供当前系统时间).表数据类型以及长度必须满足要插入的数据.
例如:将学生表中的数据插入到一张新的表中。
1. 创建名称为student_demo表
2. 将student表中的数据插入到student_demo中
INSERT INTO student_demo
(学生编号,姓名,性别,年龄,年级,班级,老师编号,家长编号,毕业时间,生源地,身份证号)
SELECT id,name,age,gender,grade,class,teacher_id,parents_id,graduation,city,cardno FROM student
GO
(3)SELECT INTO
能够实现快速地转移数据,或者以现有的数据快速地创建一张表,起到一个快速备份的作用。
a.使用单表数据创建表
/*使用SELECT INTO关键字创建teacher_bak的表格*/
SELECT * INTO teachers_bak
FROM teachers
GO
b.使用多表数据创建表
例如:创建一张同时有学生表与家长表数据的表。
/*创建表格family*/
SELECT s.id AS ‘学生编号’,
s.name AS ‘学生姓名’,
s.age AS ‘学生年龄’,
s.grade AS ‘年级’,
s.class AS ‘班级’,
p.id AS ‘家长编号’,
p.father AS ‘父亲名称’,
p.mother AS ‘母亲名称’
INTO family
FROM student s
INNER JOIN
parents p
ON
s.parents_id=p.id
GO
(4)TRUNCATE(截断)和DELETE
TRUNCATE和DELETE命令都是删除数据,但TRUNCATE将表中所有数据都删除,而DELETE则可以有选择地删除,也同样可以将表中所有数据清除.
DELETE删除数据是记录在日志中的,可以通过其将数据恢复,而TRUNCATE命令则是将整个表截断,其操作是不记录在日志中的.所以,TRUNCATE命令清空表数据更加快捷.
表在录入数据以后,占用了一定的系统磁盘空间,当使用DELETE命令以后,并不是将数据原来占有的空间收回,而是继续保留一段时间.而通过TRUNCATE命令则是将表所有的空间收回到系统中,这是TRUNCATE与DELETE命令最根本的区别。
动态SQL语句执行
/*在school数据库中创建create_table存储过程*/
CREATE PROCEDURE create_table @table_name VARCHAR(30)
AS
BEGIN
DECLARE @v_sql VARCHAR(200)
SET @v_sql=’CREATE TABLE ’+@table_name+’(
id INT,
[name] CHAR(20),
city CHAR(20),
age INT)’
EXEC(@v_sql) /* 将字符串转化为语句并执行*/
END
GO
注意:不要漏掉空格,否则会报错.
/*使用存储过程create_table创建linshi表*/
EXEUTE create_table ‘linshi’
GO
(动态的SQL语句,主要是在存储过程与函数中调用了DDL语言,由于通过正常的方式无法实现这些功能,只有通过动态的SQL来实现.动态SQL语句,在所有的大型数据库中都有,通过这种方式,能够实现一般SQL语句无法实现的功能.原理是将普通的SQL语句(主要是DDL语句)封装在一个长的字符串中,通过EXEC命令来调用。)
嵌套查询
基于列的查询
例如:要查找在学生表中,出现的所有老师的信息。
/*以teacher_id为嵌套查询的内容*/
SELECT id AS ‘老师编号’,
name AS ‘老师姓名’,
age AS ‘老师年龄’,
subject AS ‘老师所教的科目’,
teaching_age AS ‘教学年龄’
FROM teachers
WHERE id IN(
SELECT teacher_id FROM student
)
GO
基于比较的查询
例如:在成绩表中找出大于平均成绩的信息.
/*通过对AVG()函数求得学生的平均年龄来对比*/
SELECT * FROM result
WHERE
result>(
SELECT AVG(result) FROM result
)
GO
游标的使用
数据库中的游标类似于C语言的指针.特别是交互式联机应用程序,其并不总能将整个结果集作为一个单元来有效地处理.这些应用程序需要一种机制,以便每次处理一行或部分.游标就是提供这种机制的对结果集的一种扩展。
(1)声明游标
DECLARE cursor_name [INSENSITIVE][SCROLL] CURSOR
FOR
select_statement
[FOR {READ ONLY|UPDATE[OF column_name[,…n]]}]
例如:
DECLARE cursor_student CURSOR
FOR select * from student
(2)使用游标
a.打开/关闭/释放游标
使用游标之前必须要能够打开.语法:OPEN cursor_name
游标在使用完毕以后要关闭.语法:CLOSE cursor_name.关闭游标后,可以再次打开,在一个批处理过程中,也可以多次打开和关闭。
游标本身会占用一定的计算机资源,在使用完后,为了能回收占有的系统资源,应该将其释放。语法:DEALLOCATE cursor_name.当游标释放完毕,如果要重新使用那么就需要重新声明.
b.使用游标取数
在打开游标以后,就可以使用游标取数.
FETCH
[[NEXT|PRIOR|FIRST|LAST
|ABSOLUTE{n|@nvar}
|RELATIVE{n|@nvar}
]
FROM
]
{{[GLOBAL] cursor_name}|@cursor_variable_name}
[INTO @variable_name[,…n]]
c.使用游标
例如:使用游标来将家长表中的信息输出。
/*以表parents为游标的基准*/
USE school
GO
/*声明游标*/
DECLARE cursor_parents CURSOR FOR
SELECT id,father,mother,f_telephone,m_telephone
FROM parents
/**打开游标/
OPEN cursor_parents
/*第一次使用游标取数*/
FETCH NEXT FROM cursor_parents
/*检查@@FETCH_STATUS以确定是否还可以继续取数*/
WHILE @@FETCH_STATUS=0
BEGIN
FETCH NEXT FROM cursor_parents
END
/*关闭游标*/
CLOSE cursor_parents
——大二的期末考试整理 peace_power@126.com
/*使用变量查询学生成绩信息,以学生号为变量查询*/
DELCARE @id INT /*使用DECLARE来定义变量*/
SET @id=(SELECT TOP 1 id FROM student) /*为变量赋值*/
SELECT * FROM result WHERE student_id=@id
GO
注意:每一行的结尾都没有逗号。
SQL语言详述
(1)数据定义(DDL---Data Definition Language),如CREATE TABLE命令。
(2)数据操作(DML---Data Manipulation Language),如SELECT命令。
(3)数据控制(DCL---Data Control Language),如GRANT命令。
GRANT CREATE TABLE TO user_one//授予用户user_one创建表权限。
REVOKE CREATE TABLE FROM user_one//撤消用户user_one创建表权限。
DENY SELECT ON student user_one//拒绝用户user_one在表student上的查询权限。
变量的使用
变量是可以赋值的SQL语句元素,在SQL Server中有局部与系统变量两种。
(1)局部变量
局部变量的声明需要使用DECLARE语句。语法如下:
DECLARE {@variable_name datatype[,…n]}
局部变量必须以@开头,例如:
DECLARE @age INT --声明一个整数型的变量
SET @age=23 --为变量赋值
--或者使用 SELECT @age=23
SELECT * FROM student WHERE age=@age
GO
(局部变量首先需要声明,一方面要声明其变量名称,另一方面要声明变量的数据类型。变量声明以后需要赋值,这样才能使用。赋值的方法有两种:SET和SELECT关键字。局部变量仅仅作用在语句块中,跨出了这个范围就失效了。)
系统变量
系统变量是由SQL Server系统提供的预先声明好的变量,通过在名称前保留两个(@@)符号区别于局部变量。在SQL Server中系统变量以函数的形式出现。
SELECT @@VERSION AS ‘SQL Server版本’
Go
变量的使用
变量的范围是非常大的,在SQL语句块、视图、存储过程、函数中都可以使用。
例如:创建一函数,要求在输入学生编号时输出年龄,如果年龄为0或者负值则警报。
CREATE FUNCTION fun_age(@id INT)
RETURNS VARCHAR(20)
AS
BEGIN
DECLARE @age INT,@result VARCHAR(20)
SET @age=(SELECT age FROM student WHERE id=@id)
IF(@age<0 OR @age=0)
SET @result='错误的年龄'
IF(@age>0)
SET @result='正确年龄'
RETURN @result
END
GO
运算符
运算符是进行数据计算、字符操作、常量和变量比较的符号。SQL Server主要使用的运算符包括:算术运算符、比较运算符、逻辑运算符和字符串串联运算符(+)。
控制流程语句
(1)IF ELSE
IF ELSE条件判断
IF logical_expression
expressions1
[ELSE expressions2]
(2)BEGIN END
使用BEGIN END封装的是SQL语句块,其每个语句块都是完整的单元,在SQL Server中允许使用嵌套的BEGIN END语句块.
(3)WHILE
WHILE logical_expression
BEGIN
Expression
[BREAK]
[CONTINUE]
END
(4)CASE
CASE
[WHEN logical_expression THEN result_expression][…n]
ELSE result_expression
END
/*对grade字段使用CASE关键字*/
SELECT id AS ‘学生编号’,
name AS ‘学生姓名’,
CASE grade
WHEN 1 THEN ‘一年级’
WHEN 2 THEN ‘二年级’
WHEN 3 THEN ‘三年级’
END
FROM student
GO
以上语句改为如下语句也对.但第三列没列名
SELECT id AS 学生编号,
name AS 学生姓名,
CASE
WHEN grade=1 THEN '一年级'
WHEN grade=2 THEN '二年级'
WHEN grade=3 THEN '三年级'
END
FROM student
GO
以上语句改为如下语句也对.但第三列有列名
SELECT id AS 学生编号,
name AS 学生姓名,
年级=
CASE
WHEN grade=1 THEN '一年级'
WHEN grade=2 THEN '二年级'
WHEN grade=3 THEN '三年级'
END
FROM student
GO
(5)GO
(6)RETURN
其他SQL
(1)EXISTS
EXISTS使用
存在判断函数,如果表达式返回至少一行记录,则判断为存在,返回1;如果返回的结果是空集,则判断为不存在,返回0.
IF EXISTS(SELECT COUNT(*) FROM result)
BEGIN
PRINT(‘学生成绩表格中存储了数据’)
END
ELSE
BEGIN
PRINT(‘学生成绩表格中没有存储数据’)
END
GO
(2)INSERT INTO
使用INSERT INTO语句一次性插入多条数据
前提数据库中,必须有表存储了要插入的数据,或者可以通过系统函数来提供(比如使用GETDATE()来提供当前系统时间).表数据类型以及长度必须满足要插入的数据.
例如:将学生表中的数据插入到一张新的表中。
1. 创建名称为student_demo表
2. 将student表中的数据插入到student_demo中
INSERT INTO student_demo
(学生编号,姓名,性别,年龄,年级,班级,老师编号,家长编号,毕业时间,生源地,身份证号)
SELECT id,name,age,gender,grade,class,teacher_id,parents_id,graduation,city,cardno FROM student
GO
(3)SELECT INTO
能够实现快速地转移数据,或者以现有的数据快速地创建一张表,起到一个快速备份的作用。
a.使用单表数据创建表
/*使用SELECT INTO关键字创建teacher_bak的表格*/
SELECT * INTO teachers_bak
FROM teachers
GO
b.使用多表数据创建表
例如:创建一张同时有学生表与家长表数据的表。
/*创建表格family*/
SELECT s.id AS ‘学生编号’,
s.name AS ‘学生姓名’,
s.age AS ‘学生年龄’,
s.grade AS ‘年级’,
s.class AS ‘班级’,
p.id AS ‘家长编号’,
p.father AS ‘父亲名称’,
p.mother AS ‘母亲名称’
INTO family
FROM student s
INNER JOIN
parents p
ON
s.parents_id=p.id
GO
(4)TRUNCATE(截断)和DELETE
TRUNCATE和DELETE命令都是删除数据,但TRUNCATE将表中所有数据都删除,而DELETE则可以有选择地删除,也同样可以将表中所有数据清除.
DELETE删除数据是记录在日志中的,可以通过其将数据恢复,而TRUNCATE命令则是将整个表截断,其操作是不记录在日志中的.所以,TRUNCATE命令清空表数据更加快捷.
表在录入数据以后,占用了一定的系统磁盘空间,当使用DELETE命令以后,并不是将数据原来占有的空间收回,而是继续保留一段时间.而通过TRUNCATE命令则是将表所有的空间收回到系统中,这是TRUNCATE与DELETE命令最根本的区别。
动态SQL语句执行
/*在school数据库中创建create_table存储过程*/
CREATE PROCEDURE create_table @table_name VARCHAR(30)
AS
BEGIN
DECLARE @v_sql VARCHAR(200)
SET @v_sql=’CREATE TABLE ’+@table_name+’(
id INT,
[name] CHAR(20),
city CHAR(20),
age INT)’
EXEC(@v_sql) /* 将字符串转化为语句并执行*/
END
GO
注意:不要漏掉空格,否则会报错.
/*使用存储过程create_table创建linshi表*/
EXEUTE create_table ‘linshi’
GO
(动态的SQL语句,主要是在存储过程与函数中调用了DDL语言,由于通过正常的方式无法实现这些功能,只有通过动态的SQL来实现.动态SQL语句,在所有的大型数据库中都有,通过这种方式,能够实现一般SQL语句无法实现的功能.原理是将普通的SQL语句(主要是DDL语句)封装在一个长的字符串中,通过EXEC命令来调用。)
嵌套查询
基于列的查询
例如:要查找在学生表中,出现的所有老师的信息。
/*以teacher_id为嵌套查询的内容*/
SELECT id AS ‘老师编号’,
name AS ‘老师姓名’,
age AS ‘老师年龄’,
subject AS ‘老师所教的科目’,
teaching_age AS ‘教学年龄’
FROM teachers
WHERE id IN(
SELECT teacher_id FROM student
)
GO
基于比较的查询
例如:在成绩表中找出大于平均成绩的信息.
/*通过对AVG()函数求得学生的平均年龄来对比*/
SELECT * FROM result
WHERE
result>(
SELECT AVG(result) FROM result
)
GO
游标的使用
数据库中的游标类似于C语言的指针.特别是交互式联机应用程序,其并不总能将整个结果集作为一个单元来有效地处理.这些应用程序需要一种机制,以便每次处理一行或部分.游标就是提供这种机制的对结果集的一种扩展。
(1)声明游标
DECLARE cursor_name [INSENSITIVE][SCROLL] CURSOR
FOR
select_statement
[FOR {READ ONLY|UPDATE[OF column_name[,…n]]}]
例如:
DECLARE cursor_student CURSOR
FOR select * from student
(2)使用游标
a.打开/关闭/释放游标
使用游标之前必须要能够打开.语法:OPEN cursor_name
游标在使用完毕以后要关闭.语法:CLOSE cursor_name.关闭游标后,可以再次打开,在一个批处理过程中,也可以多次打开和关闭。
游标本身会占用一定的计算机资源,在使用完后,为了能回收占有的系统资源,应该将其释放。语法:DEALLOCATE cursor_name.当游标释放完毕,如果要重新使用那么就需要重新声明.
b.使用游标取数
在打开游标以后,就可以使用游标取数.
FETCH
[[NEXT|PRIOR|FIRST|LAST
|ABSOLUTE{n|@nvar}
|RELATIVE{n|@nvar}
]
FROM
]
{{[GLOBAL] cursor_name}|@cursor_variable_name}
[INTO @variable_name[,…n]]
c.使用游标
例如:使用游标来将家长表中的信息输出。
/*以表parents为游标的基准*/
USE school
GO
/*声明游标*/
DECLARE cursor_parents CURSOR FOR
SELECT id,father,mother,f_telephone,m_telephone
FROM parents
/**打开游标/
OPEN cursor_parents
/*第一次使用游标取数*/
FETCH NEXT FROM cursor_parents
/*检查@@FETCH_STATUS以确定是否还可以继续取数*/
WHILE @@FETCH_STATUS=0
BEGIN
FETCH NEXT FROM cursor_parents
END
/*关闭游标*/
CLOSE cursor_parents
——大二的期末考试整理 peace_power@126.com
相关文章推荐
- SQL语法整理[6]——函数
- SQL基础语法笔记教程整理
- SQL语句 - 1 - 语法整理
- SQL语法整理[5]——存储过程
- SQL语法整理[4]——视图
- SQL基础语法笔记教程整理
- SQL语法整理[7]——触发器
- SQL常用语法网络整理版本
- SQL_Server 常用语句以及语法整理
- [导入]全面接触SQL语法(网络收集,整理转载)
- SQL语法整理[10]——事务与锁
- SQL常用语法网络整理版本
- SQL语法整理[9]——索引
- SQL语法粗整理
- SQL 语法整理
- SQL语法整理
- 数据库语言(一):SQL语法实例整理
- sql 基本语法整理
- SQL中部分语法整理
- SQL server 学习(1)--SQL常用语法命令整理