发新话题
打印

[转载]Transact-SQL及其程序设计基础

[转载]Transact-SQL及其程序设计基础

信息来源:http://bbs.woodenhead.org/htm_data/8/0504/389.html

5.2.2 数据查询
1.查询表中所有的列
例如,要查询表book中的所有书籍的信息,可在SQL查询分析器中输入如下命令:
SELECT * FROM book
2.查询表中指定的列
例如,要查询所有书籍的名称和价格,可输入下面的SQL语句:
SELECT book_name,price FROM book
可以重新排列列的次序,在SELECT后的列名的顺序决定了显示结果中的列序。如果想把价格放在前面,则上面的SQL语句应该写成:
SELECT price,book_name FROM book
3.使用单引号加入字符串
例如,要查询所有书籍的名称和价格,并在价格前面显示字符串“价格为:”,可输入下面的SQL语句:
SELECT book_name,'价格为:',price FROM book
4.使用别名
例如,查询所有书籍的名称和价格,并在标题栏种显示“书名”和“价格”字样,而不是显示book_name和price。可输入下面的SQL语句:
SELECT book_name AS 书名,price AS 价格 FROM book
或者:SELECT book_name 书名,price 价格 FROM book
或者:SELECT '书名'=book_name,'价格'=price FROM book
5.查询特定的记录
例如,要查询《Windows 2000 网络管理》一书的信息,则可以输入以下SQL语句:
SELECT * FROM book WHERE book_name='Windows 2000 网络管理'
6.对查询结果进行排序
例如,依照价格高低来显示所有书籍的信息,输入以下SQL语句:
SELECT * FROM book ORDER BY price DESC
7. 多表查询
输入下面的SQL语句:
SELECT book.book_name,authors.author_name
FROM book,authors
WHERE book.author_id=authors.author_id
8.消除重复的行
例如,查询所有书籍所属的出版社。输入SQL语句如下:
SELECT DISTINCT publisher FROM book
5.2.3 数据插入和删除
在表authors中插入一笔记录,即新增一个作者。输入SQL语句如下:
INSERT authors(author_id,author_name) VALUES(3,'张英魁')
表示加入了一笔记录。使用SELECT语句查询authors表,可看到新增加的记录。输入如下SQL语句:
SELECT * FROM authors
例如,删除book表中《“Windows 2000 Professional 看图速成》一书的记录,可以输入以下SQL语句:
DELETE book
WHERE book_name='Windows 2000 Professional 看图速成'
下面的例子即为删除authors表中的所有数据:
TRUNCATE TABLE authors
5.2.4 数据修改
例如,将authors表中作者为“王小明”全部改为“王晓明”,SQL语句如下:
UPDATE authors SET author_name='王晓明'
WHERE author_name='王小明'
5.2.5 使用函数
例如,在orderform表中,提交一笔订单,在插入数据时,即可使用GETDATE()函数来获取当前的日期。为了保持数据完整性,首先在clients表中插入一个客户,然后再在orderform表中提交一笔订单。输入下面的SQL语句:
INSERT clients VALUES(1,'刘明耀','北京市海淀区')
INSERT orderform VALUES(1,2,50,GETDATE(),1)
按F5键,然后使用SELECT语句可查看执行结果:
SELECT * FROM orderform
5.2.6 使用公式
例如,要查询所有订单中的书名、数量和总额。此时,就可以使用公式来计算总额。输入的SQL语句如下:
SELECT book.book_name,orderform.book_number,
   '总额为:',(book.price*orderform.book_number)
FROM orderform,book
WHERE orderform.book_id=book.book_id
5.2.7 数据库的操作语句
5.2.7.1 创建数据库
例如,建立一个名为test的数据库,可以输入如下的SQL语句:
CREATE DATABASE test
例如,要创建一个销售数据库,并设定数据文件为d:\销售.LDF,大小为5MB,最大为20MB,每次增长5MB。事务日志文件为d:\ 销售.LDF,大小为5MB,最大为10MB,每次增长为1MB。则创建的SQL语句为:
CREATE DATABASE 销售数据库
ON (
NAME = 销售数据,
FILENAME = 'd:\Program Files\Microsoft SQL Server\MSSQL\data\销售数据.MDF',
SIZE = 10MB,
MAXSIZE = 50MB,
FILEGROWTH = 10MB
)
LOG ON(
NAME = 销售数据日志,
FILENAME = 'd:\Program Files\Microsoft SQL Server\MSSQL\data\销售数据日志.LDF',
SIZE = 10MB,
MAXSIZE = 20MB,
FILEGROWTH = 5MB
)
5.2.7.2 修改数据库
例如,为销售数据库新增一个逻辑名为“销售数据2”的数据文件,其大小及其最大值分别为10MB和50MB。输入的SQL语句为:
ALTER DATABASE 销售数据库
ADD FILE (
NAME = 销售数据2,
FILENAME = 'd:\Program Files\Microsoft SQL Server\MSSQL\data\销售数据2.MDF',
SIZE = 10MB,
MAXSIZE = 50MB,
FILEGROWTH = 5MB
)
5.2.7.3 使用和删除数据库
例如,可以使用如下SQL语句来删除销售数据库:
DROP DATABASE 销售数据库
5.2.8 表的操作语句
5.2.8.1 表的创建
1.基本用法
在test数据库中创建一个clients表,SQL语句如下:
USE test
CREATE TABLE clients (
    client_id int,
    client_name char(8),
    address char(50)
)
2.段属性参数
下面的SQL语句是在test数据库中建立一个book表,并指定book_id为主键,而book_name为非空:
CREATE TABLE book (
    book_id int NOT NULL PRIMARY KEY,
    book_name char(8) NOT NULL,
    author_id char(50)
)
3.与其他表建立关联
例如,可以将book表中的author_id字段关联到authors表的author_id字段。在企业管理器中将上面创建的book表删除,然后执行下面的语句:
CREATE TABLE authors(
   author_id int NOT NULL PRIMARY KEY,
   author_name char(8) NOT NULL,
   address char(50) NULL
)
CREATE TABLE book (
    book_id int NOT NULL PRIMARY KEY,
    book_name char(8) NOT NULL,
    author_id int FOREIGN KEY REFERENCES authors (author_id)
)
5.2.8.2 修改表
例如,在test数据库中给book表增加一个“简介”字段:
ALTER TABLE book ADD 简介 text
5.2.8.3 删除关联和表
例如,要删除表book,可执行下述SQL语句:
DROP TABLE book

5.3.1 标识符
5.3.1.1 常规标识符
例如:
SELECT * FROM TableX WHERE KeyCol = 124
5.3.1.2 分隔标识符
例如,打开和关闭该选项的SET语句如下:
SET QUOTED_IDENTIFIER ON
SET QUOTED_IDENTIFIER OFF
5.3.1.3 使用标识符
例如,一个用户名为bookadm的用户登录到MyServer服务器上,并使用book数据库。使用下述语句创建了一个MyTable表:
CREATE TABLE MyTable
(
column1 int,
column2 char(20)
)
5.3.2 数据类型
5.3.2.1 系统数据类型
1.整数型
例如,下面的语句创建了一个表Int_table,其中的4个字段分别使用这4种整数类型:
USE test
CREATE TABLE Int_table
(
c1 tinyint,
c2 smallint,
c3 int,
c4 bigint,
)
INSERT Int_table VALUES (50,5000,50000,500000)
SELECT * FROM Int_table
2.小数数据类型
例如,在下面的表Decimal_table中,字段c1就是一个decimal数据类型:
CREATE TABLE Decimal_table
(
c1 decimal(3,2)
)
INSERT Decimal_table VALUES (4.5678)
SELECT * FROM Decimal_table
在为小数数值型数据赋值时,应保证所赋数据整数部分的位于小于或者等于定义的长度,否则会出现溢出错误。例如,给Decimal_table插入一笔记录,在SQL查询分析器中执行下面语句:
INSERT Decimal_table VALUES (45.678)
3.近似数值型
4.字符型数据类型
例如,下面的SQL语句将局部变量MyCharVar声明为char类型,长度为25:
DECLARE @MyCharVar CHAR(25)
SET @MyCharVar = 'This is a string'
下面则是使用两个单引号来表示嵌入单引号:
SET @MyCharVar = 'This is a ''string'''
CHAR函数可以把一个整数转换为ASCII字符。当确定控制字符时(比如回车或换行),这是很有用的。在字符串中用CHAR(13)和CHAR(10)产生一个回车并生成一个新行。例如:
PRINT 'First line.' + CHAR(13) + CHAR(10) + 'Second line.'
5.逻辑数据类型
例如,下面是使用bit数据类型的例子:
CREATE TABLE Bit_table
(
c1 bit,
c2 bit,
c3 bit
)
INSERT Bit_table VALUES(12,1,0)
SELECT * FROM Bit_table
6.货币型
下面是使用货币数据类型的例子:
CREATE TABLE Money_table
(
c1 money,
c2 smallmoney
)
INSERT Money_table VALUES ($12345678,$1234)
SELECT * FROM Money_table
7.二进制数据类型
下面是使用二进制数据类型的例子:
CREATE TABLE Binary_table
(
c1 binary(10),
c2 varbinary(20),
c3 image
)
INSERT Binary_table VALUES (0x123,0xfffff,0x14fffff)
SELECT * FROM Binary_table
8.日期时间类型
下面是一个使用smalldatetime数据类型的例子:
SELECT CAST('2000-05-08 12:35:29.998' AS smalldatetime)
以下是使用日期时间数据类型的例子:
CREATE TABLE Datetime_table
(
c1 datetime,
c2 smalldatetime,
)
INSERT Datetime_table VALUES ('2001-05-15 00:04:39.257','04/15/1996 14:30:20 PM')
SELECT * FROM Datetime_table
9.Unicode字符型
使用Unicode字符时,应该在前面加一个标识符N,但是存储时并不存储该标识符。例如:
DECLARE @MyUnicodeVar NCHAR(25)
SET @MyUnicodeVar = N'This is a Unicode string.'
PRINT @MyUnicodeVar
10.其他数据类型
下面的示例使用NEWID对声明为uniqueidentifier数据类型的变量赋值,并将其打印出来:
DECLARE @MyID uniqueidentifier
SET @MyID = NEWID()
PRINT 'Value of @MyID is: '+ CONVERT(varchar(255), @MyID)
5.3.2.2 用户定义数据类型
2.使用存储过程
下面的示例为国内及国际电话和传真号码另外创建两个用户定义的数据类型telephone和fax:
EXEC sp_addtype telephone, 'varchar(24)', 'NOT NULL'
EXEC sp_addtype fax, 'varchar(24)', 'NULL'
5.3.3 运算符
2.赋值运算符
例如,下面的SQL语句先声明一个变量,然后将一个取模运算的结果赋给该变量,最后是打印该变量的值:
DECLARE @MyCounter INT
SET @MyCounter = 17%3
PRINT CONVERT(varchar(255), @MyCounter)
也可以使用赋值运算符在列标题和为列定义值的表达式之间建立关系。例如,下面的SQL语句是将bookdb数据库中的book表的book_id均以“书籍”显示:
USE bookdb
SELECT book_id = '书籍',book_name,price FROM book
3.按位运算符
例如,下面的SQL语句对两个变量进行按位运算:
DECLARE @a INT,@b INT
SET @a = 5
SET @b = 10
SELECT @a&@b,@a|@b,@a^@b
4.比较运算符
下面的SQL语句查询book表中价格大于35.0的书籍信息:
USE bookdb
SELECT * FROM book WHERE price > 35.0
5.逻辑运算符
例如,下面的SQL语句在book表中查询书名包含“网络管理”,而且价格在20到50之间的书籍的信息:
SELECT * FROM book
WHERE (book_name LIKE '%网络管理%') AND (price BETWEEN 20 AND 50)
6.字符串连接运算符
例如,下面的SQL语句将两个字符串连接在一起:
SELECT ('abc' + 'def')
7.一元运算符
例如,下面的SQL语句,首先声明一个变量,并对变量赋值,然后对变量取负:
DECLARE @Num1 int
SET @Num1 = 5
SELECT -@Num1
8.运算符优先级
例如,在下面的示例中,在SET语句中使用的表达式中,在加号运算符之前先对减号运算符进行求值:
DECLARE @MyNumber int
SET @MyNumber = 6 - 5 + 7
SELECT @MyNumber
例如:
DECLARE @MyNumber int
SET @MyNumber = 3 * (5 + (7 - 3) )
SELECT @MyNumber
5.1.4 变量
1.局部变量
在SQL Server中,一次可以定义多个变量。例如:
DECLARE @maxprice float,@pub char(12)
例如,下面首先定义了两个变量,并分别使用SET和SELECT为其赋值,然后使用这两个变量查询价格小于50,且出版社为“明耀工作室”的书籍信息:
DECLARE @maxprice float,@pub char(12)
SET @maxprice =50
SELECT @pub='明耀工作室'
SELECT * FROM book WHERE price < @maxprice AND publisher = @pub
5.3.5 批处理
下面的SQL语句创建一个视图。因为CREATE VIEW必须是批处理中的唯一语句,所以需要GO命令将CREATE VIEW语句与其周围的USE和SELECT语句隔离:
USE bookdb
GO

CREATE VIEW auth_titles AS SELECT * FROM authors
GO

SELECT * FROM auth_titles
GO
5.3.6 注释
下面就是使用注释的例子:
USE bookdb
GO
--这是双连字符注释
SELECT * FROM book --从表book中查询书籍信息
GO
/*这是正斜杠-星号对
注释*/
SELECT * FROM authors /*查询作者信息*/
GO
5.3.7 控制流语句
5.3.7.1 BEGIN...END语句
BEGIN...END语句可以嵌套使用。例如:
BEGIN
DECLARE @MyVar float
SET @MyVar = 456.256
BEGIN
  PRINT &#39;变量@MyVar的值为:&#39;
  PRINT CAST(@MyVar AS varchar(12))
END
END
5.3.7.2 IF...ELSE语句
IF...ELSE语句地执行方式是:如果布尔表达式的值为True,则执行IF后面的语句块;否则执行ELSE后面的语句块。
例如:
USE bookdb
IF (SELECT price FROM book WHERE book_name LIKE &#39;%网络管理%&#39;)>50
BEGIN  
  PRINT &#39;这本书太贵了!&#39;
  PRINT &#39;我承受不起!&#39;
END
ELSE
BEGIN
  PRINT &#39;这本书还可以!&#39;
  PRINT &#39;我要买一本!&#39;
END
5.3.7.3 CASE语句
1.简单CASE格式
例如:
USE pubs
GO
SELECT au_fname, au_lname,
  CASE state
   WHEN &#39;CA&#39; THEN &#39;California&#39;
   WHEN &#39;KS&#39; THEN &#39;Kansas&#39;
   WHEN &#39;TN&#39; THEN &#39;Tennessee&#39;
   WHEN &#39;OR&#39; THEN &#39;Oregon&#39;
   WHEN &#39;MI&#39; THEN &#39;Michigan&#39;
   WHEN &#39;IN&#39; THEN &#39;Indiana&#39;
   WHEN &#39;MD&#39; THEN &#39;Maryland&#39;
   WHEN &#39;UT&#39; THEN &#39;Utah&#39;
  END AS StateName
FROM pubs.dbo.authors WHERE au_fname LIKE &#39;M%&#39;
2.搜索CASE格式
例如:
USE bookdb
GO
SELECT book_name,
  CASE
   WHEN price>=50 THEN &#39;太贵了!&#39;
   WHEN price>=40 THEN &#39;还可以,考虑考虑!&#39;
   ELSE &#39;挺便宜的,买一本&#39;
  END AS 价格
FROM book
GO
5.3.7.4 WHILE语句
例如,下面的SQL语句是计算从1加到100的值:
DECLARE @MyResult int,@MyVar int
SET @MyVar = 0
SET @MyResult = 0
WHILE @MyVar<=100
BEGIN
  SET @MyResult = @MyResult+@MyVar
  SET @MyVar=@MyVar+1
END
PRINT CAST(@MyResult AS char(25))
5.3.7.5 GOTO语句
例如,使用下面的语句重新计算从1加到100的值:
DECLARE @MyResult int,@MyVar int
SET @MyVar = 0
SET @MyResult = 0
my_loop:      --定义标号
  SET @MyResult = @MyResult+@MyVar
  SET @MyVar=@MyVar+1
IF @MyVar<=100
GOTO my_loop    --如果小于100,跳转到my_loop标号处
PRINT CAST(@MyResult AS char(25))
5.3.7.6 RETURN语句
例如,首先执行下面的SQL语句创建一个存储过程:
USE bookdb
GO
CREATE PROC MyPro @bookname char(50)  --创建存储过程MyPro
AS
IF (SELECT price FROM book WHERE book_name LIKE @bookname)>=50
  RETURN 1
ELSE
  RETURN 2
然后执行下面的SQL语句:
DECLARE @Return_value int
EXEC @Return_value=MyPro &#39;%网络管理%&#39;
IF @Return_value=1
  PRINT &#39;这本书太贵了!&#39;
ELSE
  PRINT &#39;这本书还可以,值得考虑购买!&#39;
GO
5.3.7.7 WAITFOR语句
例如,下面的SQL语句指定在1点58时执行一个语句:
BEGIN
WAITFOR TIME &#39;1:58:00&#39;
PRINT &#39;现在是1:58:00&#39;
END
5.3.8 函 数
5.3.8.1 内置函数
例如,下面是一个使用内置函数的例子:
PRINT &#39;现在日期和时间是:&#39; + CAST(GETDATE() AS char(50))
5.3.8.2 用户定义函数
例如:下面的SQL语句在test数据库中定义了一个CubicVolume用户定义函数,然后使用该函数计算一个长方体的体积:
USE test
GO
CREATE FUNCTION CubicVolume
--输入参数
  (@CubeLength decimal(4,1), @CubeWidth decimal(4,1),
  @CubeHeight decimal(4,1) )
RETURNS decimal(12,3) -- 返回立方体的体积
AS
BEGIN
  RETURN ( @CubeLength * @CubeWidth * @CubeHeight )
END
GO
PRINT CAST(dbo.CubicVolume(20,5, 10) AS char(255))
GO
例如:
USE bookdb
GO
CREATE FUNCTION SearchBook ( @BookPrice float )
RETURNS @BookInfo TABLE
  (
  book_name  char(50),
  author_name  char(8),
  book_price  float,
  publisher  char(50)
  )
AS
BEGIN
  INSERT @BookInfo
   SELECT book.book_name,authors.author_name,book.price,book.publisher
   FROM book,authors
   WHERE book.author_id = authors.author_id AND book.price > @BookPrice
RETURN
END
GO
下面的SQL语句即使使用该函数查询价格大于35的书籍信息:
SELECT * FROM SearchBook(35)
曾几何时,有人对我说:装B遭雷劈。我说:去你妈的。于是,这个人又对我说:如果再说脏话,上帝会惩罚你的。我说:我操上帝。结论:彪悍的人生不需要上帝。

TOP

发新话题