第5章-T-SQL语句基础
一、SQL简介
SQL语句来维护数据库便于解决重复或者批量维护数据的难题
(1)、SQL和T-SQL
SQL是Structured Query Language的缩写,即结构化查询语言
1、非过程化语言
ØSQL是一个非过程化的语言,因为它一次处理一个记录,对数据提供自动导航
ØSQL允许用户在高层的数据结构工作,而不对单个记录进行操作,可操作记录集。所有SQL语句接受集合作为输入,返回集合作为输出
ØSQL的集合特性允许一条SQL语句的结果作为另一条SQL语句的输入
2、统一的语言
【SQL为以下任务提供的命令包括】
查询数据
在表中插入、删除和修改记录
建立、修改和删除数据对象
控制对数据和数据对象的存取
保证数据库一致性和完整性
3、所有关系数据库的公共语言
Ø由于所有主要的数据库管理系统都支持SQL语言,用户可将使用SQL的技能从一个RDBMS转到另一个。用SQL编写的程序都是可以移植的
ØT-SQL(Transact-SQL)是标准SQL的加强版,除了标准的SQL命令之外,还对SQL命令做了许多扩充,提供类似于程序语言的基本功能,如变量说明、流程控制、功能函数
(2)、T-SQL的组成
ØDML(Data Manipulation Language,数据操纵语言):用来查询、插入、删除、修改数据库中的数据。如‘select insert update delete’
ØDDL(Data Definition Language,数据定义语言):用来建立数据库、数据对象和定义其列、大部分是以Create开头的命令。如‘create alter drop’
ØDCL(Data Control Language,数据控制语言):用来控制数据库组件的存取行可、存取权限等。如‘Grant revoke’
二、使用T-SQL查询数据
(1)、select语法结构
【定义】:T-SQL的查询基本格式是由Select子句、from子句和where子句组成的
【格式】:select <列名> from <表名> where <查询限定条件>
〖select语句的语法结构〗:
select select_list
[ into new_table_name ]
from table_name
[ where search_conditions ]
[ group by group_by_expression ] [having search_conditions ]
[ order by order_expression (asc|desc) ]
Øselect子句:指定查询内容。select_list用于指定查询字段列表,样式为“表.字段1,表.字段2,表.字段I,……表.字段N”。如果查询单个表,表前缀可以省略,样式为“字段1,字段2,字段i,……字段N”。
Øinto子句:用于把查询结果存放到一个新表中。new_table_name指定新表的名称。
Øfrom子句:指定查询源。table_name指定需要查询的表名称。
Øwhere子句:查询条件。search_conditions 为由字段组成的条件表达式或逻辑表达式。
Øgroup by子句:指定查询结果的分组条件。group_by_expression指明分组条件,通常是一个列名,但不能是列的别名。
Øhaving子句:指定分组搜索条件。通常与group by子句一起使用。
Øorder by子句:指定查询结果的排序方式。 order_expression 指定排序的规则,其中asc 表示升序,也是默认排序顺序;desc表示降序。
(2)、表达式
Ø表达式是符号和运算符的一种组合,并且可以对它求值得到单个数据值。
Ø简单表达式可以是一个常数、变量、列或标量函数,可以用运算符把两个或多个简单表达式连接成一个复杂表达式。
1、条件表达式
【常量】:
表示单个指定数据值的符号(a~z、A~Z、0~9)(!、@、#)……字母和日期时间数据类型的常量需要用单引号括起来;二进制字符串和数字常量则不需要。
【列名】:
表中列的名称,表达式中仅允许使用列的名称。
【一元运算符】:
仅有一个操作数的运算符:“+ 表示正数”、“-负数”、“~补数”。
【二元运算符】:
将两个操作数组合执行操作的运算符。二元运算符可以是算术运算符、赋值运算符(=)、位运算符、比较运算符、逻辑运算符……
运算符 |
含义 |
= |
等于 |
> |
大于 |
< |
小于 |
>= |
大于或等于 |
<= |
小于或等于 |
<> |
不等于 |
!= |
不等于,等同于<> |
表:比较运算符
续表
运算符 |
含义 |
Between |
指定值包含范围(含边界),使用And分隔开始值和结束值 |
Is[Not]Null |
根据使用的关键字,指定是否搜索空值或非空值 |
Like |
模糊查询,与指定字符串进行模式匹配 |
IN |
是否在数据范围里面 |
【举例说明】:
pric > 20,表示满足大于20的pric值
pric <> 20,表示洪足不等于20的pric值
pric between 10 and 20,表示满足大于等于10并且小于等20的pric值
name like ‘李%’,表示满足name姓名字段里姓李的所有姓
通配符 |
解释 |
示列 |
‘_’ |
任何单个字符 |
Name like ‘_gan’:将查找以gan结尾的所有四个字母的名字(dgan、sgan等) |
‰ |
任意长度的字符串 |
Name like ‘%gan%’:将查找所有包含gan的名字(dgan、sgan、shgan等) |
[] |
括号中所指定范围的一个字符 |
Name like ‘[c-p]arsen’:将查找以arsen结尾且以介于C与P之间的任意单个字符开始的名字(Carsen、 Marsen等) |
[^] |
不在括号中所指定范围内的任意一个字符 |
Name like ‘car[^afg]’:将查找以car开始且其后的字母不为a、f、g的所有名字(carn、carj等) |
表:通配符
《注意》:
通配符经常与like关键字一起配合使用完成模糊查询,可以使用like和通配符来完成对表的一些特殊约束。
例如:输入格式为11位手机号,前两位数字为“13”
telnumber like ‘13[0-9] [0-9] [0-9] [0-9] [0-9] [0-9] [0-9] [0-9][0-9] ’
2、逻辑表达式
T-SQL支持的逻辑运算符有And、Or和Not
Not:和其他操作符一起使用,取反的操作
And:组合两个条件,并在两个条件都为True时取值为True
Or:组合两个条件,并在两个条件之一为True时取值为True
〖例如:以下付款方式是信用卡,约束卡只能是龙卡、兔卡、阳光卡〗
付款方式=‘信用卡’and 信用卡 in (‘龙卡’, ‘兔卡’, ‘阳光卡’)
(3)、查询举例
1、查询表中所有列
select * from table_name
【例如:查询student表中的所有信息】
select * from student
2、查询表中特定列
select column_name_1,column_name_2,……from table_name
【例如:查询student表中‘姓名’、‘班级’和‘成绩’列内容】
select 姓名,班级,成绩 from student
3、查询表中特定行/条件查询
select select_list from table_name where search_conditions
【例如:查询student表中7班的学生姓名】
select 姓名 from student where 班级=7
【例如:查询student表中成绩90-100的学生所有信息】
select * from student where 成绩 between 90 and 100
【例如:查询student表中成绩低于90或者高于95的学生所有信息】
select * from student where 成绩 <90 or 成绩 >95
【例如:查询student表中成绩为89、90或91的学生所有信息】
select * from student where 成绩 in (89,90,91)
【例如:查询student表中姓刘的学生所有信息】
select * from student where 姓名 like ‘刘%’
【例如:查询student表中2班的名叫刘婷的学生信息】
select * from student where 姓名=’刘婷’ and 班级=2
【例如:查询student表中备注不为空的学生所有信息】
select * from student where 备注 isnot null
4、查询返回限制的行数
select top n select_list from table_name
【例如:查询student表中前5行的数据】
select top 5 * from student
5、改变查询结果集列名称
select column_name As column_alias from table_name
【例如:查询student表中姓名和身份证号两列数据,姓名以‘name’显示,身份证号以‘idcard’显示】
select 姓名 as name,身份证号 as idcard from student
【例如:查询student表中所有学生的总成绩,列名称显示为‘总成绩’】
select sum(成绩) as 总成绩 from student
6、查询结果排序
select select_list from table_name order by column_name [Asc|Desc]
【例如:查询student表中所有学生信息,按照成绩从高到低显示查询结果】
select * from student order by 成绩 desc
7、分组查询
select select_lsit from table_name group by column_name [Asc|Desc]
Øselect_list指定的列要么是group by子句中指定的列,要么包含聚合函数
Ø聚合函数用于一线执行计算,并返回单个值,如求总和、平均值、最大或最小值等
《定义》:
Ø分组查询,就是将表中数据按照一定条件分类组合,再根据需要得到统计信息,通过group by子句可以实现
Ø如果需要对分组结果进筛选,只显示满足限定条件的组,需要使用having子句
【T-SQL中常见的聚合函数】
sum:表示所有数值的总和,Sum只能用于数字型的列,不能够汇总字符,日期等其他数据类型。
【例:查询student表中所有学生的总成绩】
select sum(成绩) 总成绩 from student
Avg:表示所有数值的平均值,Avg函数也只能用于数字类型的列
【例:查询student表中所有学生的平均成绩】
select avg(成绩) 平均成绩 from student
Max和Min:Max返回表达式中的最大值;Min返回表达式中的最小值,它们都可以用于数字型、字符型及日期、时间类型的列
【例:查询student表中的所有学生中的最高分和最低分】
select max(成绩) 最高分,min(成绩) 最低分 from student
Count:count返回表达式中非空值的计数,count可以用于数字和字符型的列
【例:查询student表中所有行数】
select count(*) 总行数 from student
《注意》:
Øwhere子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件不能包含聚合函数,使用where条件显示特定的行。
Øhaving子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚合函数,使用having条件显示特定的组,也可以使用多个分组标准进行分组。
【例:查询student表中每个班级的总成绩】
select 所在班级,sum(成绩) as 总成绩 fromstudent group by 所在班级
【例:查询student表中总成绩大于200的班级】
select 所在班级, sum(成绩) as 总成绩from student group by 所在班级 having sum(成绩) > 200
8、插入数据
select select_list into new_table_name from table_name
【例:将student表中的所有数据插入到新表student_bak中】
select * into student_bak from student
【例:将student表中2班的学生信息保存到表student_2中】
select * into student_2 from student where 所在班级=2
三、使用T-SQL实现多表查询
如果一个查询要对多个表进行操作,就称为连接查询,连接查询的结果集或结果称为表之间的连接
(1)、表连接类型
1、内连接
Ø内连接是最常用的一种连接方式,它只返回两个数据集合之间匹配关系的行,将位于两个互相交叉的数据集合中重叠部分以内的数据行连接起来
Ø内连接使用比较运算符进行表间某些列数据的比较操作,并列出这些表中与连接相匹配的数据行
2、外连接
Ø左外连接(Left join 或Left outer join)
Ø右外连接(Right join或Right outer join)
Ø全连接/完整外连接(Full join或Full outer join)
3、交叉连接
就是表之间没有任何关联条件,查询将返回左表与右表挨个连接的所有的行,就是左表中的每一行与右表中的所有行再一一组合,相当于两个表相乘
(2)、内连接
【例:在表A和表B中使用内连接查询学生姓名、学校、职业】
方式一:在where子句中指定连接条件
select A.name,A.school,B.job from A,B where A.name=B.name
select A.姓名,A.学校,B.职业 from A,B where A.姓名=B.姓名
方式二:在from子句中使用inner join…on子句来实现
select A.name,A.school,B.job from Ainner join B on A.name=B.name
select A.姓名,A.学校,B.职来 from Ainner join B on A.姓名=B.姓名
(3)、外连接
1、左外连接
【例:在表A和表B中使用左外连接查询学生姓名,学校和职业】
select A.姓名,A.学校,B.职业 from Aleft join B on A.姓名=B.姓名
2、右外连接
【例:在表A和表B中使用右外连接查询学生姓名,学校和职业】
select A.姓名,A.学校,B.职业 from A right join B on A.姓名=B.姓名
3、完整外连接
【在表A和表B中使用完整外连接查询学生姓名,学校和职业】
select A.姓名,A.学校,B.职业 from A full join B on A.姓名=B.姓名
本文转自甘兵 51CTO博客,原文链接:http://blog.51cto.com/ganbing/1210274,如需转载请自行联系原作者