Transact-SQL语言基础

1 Transact-SQL 语言概述

1.1 什么是Transact-SQL

       T-SQL是Microsoft公司在关系型数据库管理系统SQL Server中的SQL-3标准的实现,是微软对SQL的扩展,具有SQL的主要特点,同时增加了变量、运算符、函数、流程控制和注释等语言元素,使得其功能更加强大。T-SQL对SQL Server 十分重要,SQL Server中使用图形界面能够完成的所有功能,都可以利用T-SQL来实现。使用T-SQL操作时,与SQL Server通信的所有应用程序都通过向服务器发送T-SQL语句来进行,而与应用程序的界面无关。

       根据其完成的具体功能,可以将T-SQL语句分为四大类,分别为数据定义语句,数据操作语句,数据控制语句和一些附加的语言元素。

1.2 T-SQL 语法的约定

操作语句:

              SELECT, INSERT, DELETE, UPDATE;

定义语句:

              CREATE TABLE, DROP TABLE , ALTER TABLE ,

              CREATE VIEW, DROP VIEW

              CREATE INDEX, DROP INDEX,

              CREATE PROCEDURE, ALTER PROCEDURE, DROP PROCEDURE

              CREATE TRIGGER, ALTER TRIGGER, DROP TRIGGER

控制语句:

              GRANT, DENY, REVOKE

语言元素:

              BEGIN TRANSACTION/COMMIT, ROLLBACK, SET TRANSACTION,

              DECLARE OPEN, FETCH, CLOSE, EXECUTE

2 如何给标识符起名

       为了提供完善的数据库管理机制,SQL Server 设计了严格的对象命名规则。在创建和引用数据库的实例、表、索引、约束等,必须要遵循一定的命名规则,否则可能会产生一些难以预测和检查的情况。

       SQL Server 的标识符可以分为:规则标识符、界定标识符。规则标识符指的是严格遵循一定的规则,所以在T-SQL语言中,凡是规则运算符都不必使用界定标识符。界定标识符指的是那些用引号等标识符来界定的一些符号。

       标识符的规则,标识符的首字母必须是Unicode 2.0规范下的字符以及下‘_’、‘#’等。

       至于对象和实例也有自己的相应规则,如对象命名规则和实例命名规则。拿象命名规则来说,SQL Server 中的对象一般使用1——28个字符组成的,不区分大小写。而在SQL Server中默认的实例名是采用计算机名+实例名两部分组成的。

3 常量

       SQL Server 中的常量类型包括:数字常量、字符串常量、日期常量和时间常量、符号常量。常量也会被称作文字值和标量,是用于表示一个特定的值得一个符号,常量的格式取决于其表示的数据的类型。一个常量通常有一个数据类型和长度,这二者取决于常量格式。根据数据类型的不同,常量可以分为相应的常量类型。

       数字常量包括:有符号整数、无符号整数、定点数、浮点数,要求全部都为数字。

       字符串常量,字符串常量使用单引号括起来表示,字符串中的字符与其他语言类似。

       日期和时间常量,日期和时间常量使用特定的格式来表示,并用单引号括起来。

       符号常量包括:分割符、标识符等等。

4 变量

       SQL Server 中的变量包括:全局变量、局部变量、批处理和脚本变量。

       全局变量在SQL Server中是用于作用于任何应用程序的变量,任何应用程序均可访问。例如@@VERSION 和 @@SERVERNAME,是SQL Server 的全局变量

       SELECT @@VERSION AS 'SQL Server 版本',@@SERVERNAME AS '服务器名称'

 

       局部变量在SQL Server中是用于作用某一个应用程序内部的变量,具有特定的数据类型,在批处理和脚本中具有独特用途。其创建方式如下所示:

       DECLARE @MyCounter int;

 

    批处理和脚本变量指的是用于批处理或者脚本中的变量。例如下脚本示例中的变量@MyCount:

       USE sample_db

    GO

    DECLARE @MyCount int;

    CREATE TABLE person

    (

         id       INT NOT NULL PRIMARY KEY,

         name     VARCHAR(40) NOT NULL DEFAULT '',

         age      INT NOT NULL DEFAULT 0,

         info     VARCHAR(100) NULL

    );

    INSERT INTO person (id,name,age) VALUES (1,'Green',21);

    INSERT INTO person (age,name,id,info) VALUES (22,'Suse',2,'dancer');

    SET @MyCount =(SELECT COUNT(*) FROM person)

    GO

5 运算符和表达式

       SQL Server 中的运算符包括:算数运算符、比较运算符、逻辑运算符、连接运算符、按位运算符。运算符其实就是一些符号,能够表示一些算数运算、字符串连接、赋值等操作。

       在学习SQL Server 中的运算符的时候和其他种类的语言一样需要着重注意其运算符优先级。

       SQL Server 中的表达式也是和其他语言相类似的。Transact-SQL表达式可以分为:字段名表达式、目标表达式、条件表达式等等。

6 Transact-SQL 利器—通配符

 

 

7 Transact-SQL 语言中的注释

       Transact-SQL中的注释可以分为:单行注释和多行注释两种。

       单行注释:单行注释以两个减号“--”开始,作用范围是从注释符号开始到本行的结束。例如:

    --INSERT INTO person (id,name,age) VALUES (1,'Green',21);

    --INSERT INTO person (age,name,id,info) VALUES (22,'Suse',2,'dancer');

    多行注释:多行注释常用于注释某一块连续的代码,注释的标识是斜杠星型(/* 要注释区域*/),使用这种注释方法,可以注释整个注释区域,例如:

       /*

    INSERT INTO person (id,name,age) VALUES (1,'Green',21);

    INSERT INTO person (age,name,id,info) VALUES (22,'Suse',2,'dancer');

    SET @MyCount =(SELECT COUNT(*) FROM person)

    */

 

8  数据定义语句(DDL)

8.1  CREATE(创建)的应用

       使用CREATE语句创建一个数据库示例:

    CREATE DATABASE test_db ON PRIMARY

    (

        NAME = test_db_data1,                       -- 数据库逻辑文件名称

        FILENAME = 'D:\XiaoYuSQL\test_db_data.mdf', -- 主数据文件存储位置

        SIZE = 5120KB,                              -- 主数据文件大小

        MAXSIZE = 20MB,                             -- 主数据文件最大增长空间为20MB

        FILEGROWTH = 1                              -- 文件增长大小设置为1MB

    )

    CREATE不仅仅可以用以创建数据库也可以用于创建表等其他用途。在数据库中创建表示例:

    USE test_db

    GO

    CREATE TABLE authors

    (

         auth_id      int PRIMARY KEY,              -- 设置为主键

         auth_name    VARCHAR(20) NOT NULL unique,   -- 作者名称

         auth_gender  tinyint NOT NULL DEFAULT(1)    -- 作者性别:男(1)女(2)

    );

8.2  DROP(删除)的功能

       DROP语句可以用于删除数据库或者删除表,例如:

    DROP TABLE authors

    DROP DATABASE test_db

8.3  ALTER(修改)的功能

       当数据库的结构无法满足需求或者容量不足时,我们就需要修改数据库,例如修改一个数据库的名称:

       ALTER DATABASE test_db

    MODIFY NAME = test_db_new

 

 

9  数据操作语句(DML)

SET cellphone= '0018611';      -- 设置teacher表中所有的cellphone字段均为'0018611'

SELECT * FROM teacher;         -- 查询teacher表中所有数据

DELETE FROM teacher WHERE id= 1;   -- 条件删除,删除teacher表中id= 1的数据

SELECT * FROM teacher WHERE id= 1; -- 条件查询,查询teacher表中id= 1的数据

SELECT * FROM teacher;

DELETE FROM teacher;               -- 删除teacher表中所有的数据

SELECT * FROM teacher;

 

CREATE TABLE stu_info              -- 创建一个学生信息表,并插入一些数据

(

    s_id     INT NOT NULL PRIMARY KEY,

    s_name       VARCHAR(40),

    s_score      INT,

    s_sex        CHAR(2),

    s_age        VARCHAR(90)

)

INSERT INTO stu_info

VALUES   (1,'许三多',98,'男',18),

         (2,'古天乐',78,'女',38),

         (3,'汤小小',88,'男',19),

         (4,'张亮',68,'男',28),

         (5,'王乐鱼',18,'女',17),

         (6,'李天乐',79,'男',21);

 

SELECT * FROM stu_info;            -- 查询所有字段

SELECT s_name ,s_score  FROM stu_info;  -- 仅查询相应字段

SELECT s_name AS '姓名',s_score AS '成绩' FROM stu_info; -- 仅查询相应字段

-- 仅查询前三条相应字段的数据

SELECT TOP 3 s_name AS '姓名',s_score AS '成绩' FROM stu_info;

-- 条件查询,查询性别为男的相应字段的数据  

SELECT s_name AS '姓名',s_score AS '成绩',s_sex AS '性别'  FROM stu_info  

WHERE s_sex= '男';

-- 条件查询,查询性别不为男的相应字段的数据

SELECT s_name AS '姓名',s_score AS '成绩',s_sex AS '性别'  FROM stu_info  

WHERE NOT s_sex= '男';

-- AND多条件查询,查询性别为男且成绩大于80的相应字段的数据   

SELECT s_name AS '姓名',s_score AS '成绩',s_sex AS '性别'  FROM stu_info  

WHERE s_sex= '男' AND s_score >80;

SELECT s_name AS '姓名',s_score AS '成绩',s_sex AS '性别',s_age AS '年龄'  FROM stu_info              -- OR多条件查询,查询性别为男且成绩大于80的相应字段的数据

WHERE s_sex= '男' OR s_score >80 OR s_age > 18;

SELECT s_name AS '姓名',s_score AS '成绩',s_sex AS '性别',s_age AS '年龄'  FROM stu_info              -- LIKE模糊查询,带有通配符的查询

WHERE  s_name LIKE '马%';

SELECT s_name AS '姓名',s_score AS '成绩',s_sex AS '性别',s_age AS '年龄'  FROM stu_info              -- 范围条件查询,查询性成绩大于70且小于85的相应字段的数据

WHERE s_score BETWEEN 70 AND 85;

SELECT s_name AS '姓名',s_score AS '成绩',s_sex AS '性别',s_age AS '年龄'  FROM stu_info ORDER BY s_score DESC     -- 按指定的字段排序  

 

 

9.1  数据的插入——INSERT

INSERT INTO stu_info

VALUES   (7,'许四多',98,'男',18);

 

9.2  数据的更改——UPDATE

UPDATE stu_info

SET s_name= '五四六',s_age= 18 WHERE s_id= 7;

SELECT * FROM stu_info;

 

9.3  数据的删除——DELETE

 

DELETE FROM stu_info WHERE s_id= 7;

SELECT * FROM stu_info;

 

9.4  数据的查询——SELECT

SELECT * FROM stu_info;

 

10  数据控制语句(DCL)

10.1  如何给用户授予权限——GRANT

 GRANT UPDATE,DELETE ON stu_info

TO guest WITH GRANT OPTION

10.2  拒绝权限操作——DENY

DENY UPDATE,DELETE ON stu_info TO guest CASCADE;

 

10.3  收回权限操作——REVOKE

REVOKE UPDATE,DELETE ON stu_info FROM guest;

11  其他基本语句

11.1  数据声明——DECLARE

DECLARE @user_name VARCHAR(20)

DECLARE @pass_word VARCHAR(20)

SET @user_name= '张珊'

SET @pass_word= 'PASSWORDS'

SELECT '用户名:'+@user_name+' 密码:'+@pass_word

 

11.2  数据赋值——SET

SET @user_name= '张珊'

 

11.3  数据输出——PRINT

DECLARE @name VARCHAR(10)= '小明'

DECLARE @age INT= 21

PRINT '姓名    年龄'

PRINT @name+'    '+CONVERT(VARCHAR(20),@age);

 

12  流程控制语句

12.1  BEGIN…END语句

DECLARE @count INT;

SELECT @count= 0;

 

WHILE @count< 10

BEGIN

    PRINT 'count= '+CONVERT(VARCHAR(8),@count)

    SELECT @count= @count+1

END

PRINT 'loop over count= '+CONVERT(VARCHAR(8),@count)

 

12.2  IF…ELSE语句

DECLARE @age INT;

SELECT @age= 40

IF  @age< 30

    PRINT 'This is a young man!'

ELSE

    PRINT 'This is a old man!'

 

12.3  CASE语句

USE test_db

SELECT s_id,s_name,

CASE s_name

    WHEN'许三多' THEN '班长'

    WHEN'张亮' THEN '学习委员'

    WHEN'李天乐' THEN '体育委员'

END

AS '职位'

FROM stu_info

 

12.4  WHILE语句

DECLARE @num INT;

SET @num= 10;

WHILE @num > -1

BEGIN

    IF  @num > 5

         BEGIN

             PRINT'@num=  '+CONVERT(VARCHAR(4),@num)+'大于5,循环继续执行'

             SET @num= @num -1

             CONTINUE

         END

    ELSE

         BEGIN

             PRINT'@num= '+CONVERT(VARCHAR(4),@num)

             BREAK

         END

END

PRINT'循环终止后,当前局部变量@num= '+CONVERT(VARCHAR(4),@num)

 

12.5  GOTO语句

USE test_db

BEGIN

    SELECT s_name FROM stu_info

    GOTO jump

    SELECT s_score FROM stu_info

jump:

    PRINT'第二条语句被跳过'

END

 

12.6  WAITFOR语句

DECLARE @name VARCHAR(50);

SET @name= 'admin'

BEGIN

    WAITFOR DELAY'00:00:10'

    PRINT @name

END

 

12.7  RETURN语句

 

13 批处理语句

       批处理是从应用程序发送到SQL Server并得以执行的一条或多条T-SQL语句。使用批处理时,有下面一些注意事项。

       一个批处理中只要存在一处语法错误,整个批处理都无法通过编译。

       批处理中可以包含多个存储过程,但除第一个过程外,其他存储过程前面都必须使用EXECTUE关键字。

       某些特殊的SQL指令不能和别的SQL语句共存在一个批处理中,如CREATE TABLE和CREATE VIEW语句。这些语句只能独自存在于一个单独的存储过程中。

       所有的批处理使用GO作为结束的标志,当编译器读到GO的时候就把GO前面的所有语句当成一个批处理,然后打包成一个数据包发给服务器。

       GO本身不是T-SQL的组成部分,只是一个用于表示批处理结束的前端指令。

       CREATE DEFAULT、CREATE FUNCTION、CREATE PROCEDURE、CREATE RULE、CREATE SCHEMA、CREATE TRIGGER和CREATE VIEW语句不能在批处理中与其他语句组合使用。

       批处理必须以 CREATE 语句开头,所有跟在该批处理后的其他语句将被解释为第一个 CREATE 语句定义的一部分。

       不能在删除一个对象之后,在同一批处理中再次引用这个对象。

       如果 EXECUTE 语句是批处理中的第一句,则不需要 EXECUTE 关键字。如果 EXECUTE 语句不是批处理中的第一条语句,则需要 EXECUTE 关键字。

       不能在定义一个CHECK约束之后,在同一个批处理中使用。

       不能在修改表的一个字段之后,立即在同一个批处理中引用这个字段。

       使用SET语句设置的某些选项值不能应用于同一个批处理中的查询。

更多推荐

《SQL Server 2012 学习日记 》——Transact-SQL语言基础