T-SQL语言及常用工具介绍
T-SQL语言是微软在sql server中使用的编程语言,它是一个数据定义、控制和操作语言。
T-SQL分为以下三种类型:
1、数据定义语言 DDL:创建、更改、删除等
2、数据控制语言 DCL:权限控制,数据备份等
3、数据操作语言 DML:查询、插入、更新、删除
MS SQL Server提供了两种实用工具,这两种工具都用于执行T-SQL语句
1、查询分析器:图形化工具
2、OSQL实用工具:命令行工具
常用参数说明:
-S:连接的服务器名称
-U:用户名
-P:用户密码
-E:使用windows账户登录
-Q:后接具体的TSQL语句,执行后,退出OSQL工具
-q:后接具体的TSQL语句,执行后,不退出OSQL工具,可继续执行其他命令。但输入其他命令后,回车不执行,需使用"GO"命令执行
exit:退出OSQL工具
-i:从文件(*.sql)中读取命令行,执行后退出
-o:后接完整文件路径,将命令执行后得到的结果输出至文件
注意:参数对大小写敏感。
下面的学习全部围绕sql2000自带的两个范例数据库,Northwind和pubs,来进行说明。
Northwind模拟了一家业务型公司所建立的数据库,其中包括员工信息、客户信息、产品信息、供应商信息等。
pubs模拟了一家出版社所建立的数据库,其中包括出版书籍信息、员工信息、作者信息等。
select语句
select语句属于DML语言,使用最为频繁,作用是查询数据库。
1、需要一张表,包含:所有员工的所有信息。
分析:需要单张表中所有数据
语法:select * from 表名
作用:检索单张表中所有的行列,其中的*号代表所有数据
答案:select * from employees
2、需要一张表,包含:所有员工的员工号、姓名和职务。
分析:只需要单张表中特定的列
语法:select 列名[,列名...] from 表名
答案:select employeeID,lastname,firstname,title from employees
3、需要一张表,包含:交易号,产品代号,交易额
分析:表中并没有交易额的列,但可以通过产品单价列*产品数量列来进行计算
答案:select orderID,productID,unitPrice*Quantity from [order details]
注意:order details外围的方括号是必要的,因为tsql语言以空格为分隔符,但因order details为一个元素,为不引起歧义,必须用方括号进行标记,此方括号称为限定符
4、需要一张表,包含:所有美国员工的姓名以及其居住城市的信息。
分析:这张表有两列,姓名及居住城市(列),条件为"country"字段为"USA",需使用where关键字来声明条件
语法:select 列名[,列名...] where 筛选条件
其中,筛选条件使用比较表达式,其又使用以下几种比较运算符:
=等于、>大于,<小于,>=大于等于,<=小于等于,<>不等于,()优先级控制
注意点:(1)表达式结果为TRUE时,显示结果
(2)字符、日期型数据要用单引号包含之
答案:select firstname,lastname,city from employees where country='USA'
5、需要一张表,包含:客户公司名中包含"Restaurant"的公司名称及联系方式
分析:模糊查找客户公司名称,需使用通配符。所谓通配符,即是代表任意字符
通配符的种类:
%:代表0个或多个字符的任意字符串
_:任意单个字符
[]:任意在指定范围内或集合中的单个字符,如[a-e]表示a到e中任意字符,[abc]表示a/b/c中任意字符
[^]:任意不在指定范围内或集合中的单个字符,如[a-e]表示不在a到e中的任意字符,[abc]表示除a/b/c以外的任意字符
通配符必须与like关键字一起使用。
答案:select companyname,address from customers where companyname like '%Restaurant%'
6、需要一张表,包含:所有姓氏第二个字母为a的员工信息
分析:使用通配符进行筛选
答案:select firstname,lastname from employees where firstname like '_a%'
注意:作为筛选条件的字符串对大小写不敏感。
7、需要一张表,包含:姓氏为carson,carsen,karson或karsen的作者(在pub中查询)
分析:找出这几个字符串的相同点与不同点,相同点为,第一个字母不是c就是k,之后的三个字母都是ars,随后的一个字母不是o就是e,最后一个字母n相同。可用通配符搭配来进行查询
答案:select au_lname,au_fname from authors where au_lname like '[ck]ars[oe]n'
8、需要一张表,包含:产品价格在10美元与20美元之间的产品名称和价格
分析:此表包含两列,产品名称和价格,条件是产品价格在10美元到20美元之间,需使用条件运算符。
条件运算符有三种:
and:与,真-真-真,真-假-真,假-真-真,假-假-假,优先级2
or:或,真-真-真,真-假-假,假-真-假,假-假-假,优先级3
not:非,真-假,假-真,优先级1
答案:select productname,unitprice from products where (unitprice>10) and (unitprice<20)
9、需要一张表,包含:预付款不超过5500元的书名(pubs数据库)
分析:使用条件运算符
答案:select title from titles where not advance<5500
10、需要一张表,包含:商业书籍和心理学书籍的名称
分析:筛选条件为type为"business"和"psychology"的书,是用条件运算符
答案:select title from titles where type='business' or type='psychology'
11、需要一张表,包含:预付款超过5500元的商业书籍或心理学书籍
分析:三个条件,使用条件运算符的搭配
答案:select title from titles where (type='business' or type='psychology') and (advance>5500)
扩展知识:
1、关键字between...and...,中文译为"在...与...之间",正如它的字面意思,其作用表示了一个范围,看一个例子。
select title from titles where advance between 3000 and 5000
以上语句执行后,预付款在3000至5000的书,会全部显示。注意,包括边界值(包括3000和5000)
2、关键字in(...),其作用是任取括号内的值,相当于or关键字,看一个例子。
select title from titles where type in('business','psychology')
相当于:select title from titles where type='business' or type='psychology'
以上两条关键字,完全可以用and和or替代,但使用between...and...和in会使代码更简洁。
12、需要一张表,包含:没有传真号的供应商公司名称和联系方式
分析:没有传真号的,即表示传真号这一列的值为空,用NULL来表示。
注意,NULL与0或者空格不同;NULL不能比较,例如,两个NULL是不相等的;NULL的序号是最小的,在升序排列中排第一。
语法:select 列名[,列名...] from 表名 where 列名 is [not] NULL
答案:select companyname,phone from suppliers where fax is NULL
13、需要一张表,包含:每种商品的名称与价格,价格按升序排列
分析:关键在升序排列,需使用order by关键字进行排序,其后还要选择参数asc或desc,分别表示升序排列和降序排列
语法:select 列名[,列名...] from 表名 order by 列名 参数(asc或desc)
答案:select productname,unitprice from products order by unitprice asc
注意,这里的asc可以省略,因为默认为asc,如要降序排列,必须加desc。
14、需要一张表,包含:出版商名称,出版商类型和价格,要求按出版商名称降序排列,再按出版商类型升序排列,最后按价格升序排列
分析:需要进行三次排序,第一次按出版商名称排序,第二次在已排序的基础上,按出版商类型排序,最后,在前两次排序的基础上,按价格排序。
答案:select pub_id,type,price from titles order by pub_id desc,type,price
15、需要一张表,包含:供应商所属的国家
分析:特别之处在于,每个国家只能出现一次,这必须使用distinct关键字检索唯一值,将重复出现的值删除。
语法:select distinct 列名[,列名] from 表名
答案:select distinct country from suppliers
16、需要一张表,包含:员工ID,员工姓氏与名。列名必须按照以下方式指定:employee:,first,last
分析:让查询结果使用指定的列名
语法:select 列名 as 自定义列名[,列名 as 自定义列名...] from 表名
答案:select employeeid as [employee:],firstname as first,lastname as last from employees