T-SQL语句基础

5-T-SQL语句基础

一、SQL简介

        SQL语句来维护数据库便于解决重复或者批量维护数据的难题

1)、SQLT-SQL

        SQLStructured Query  Language的缩写,即结构化查询语言

1、非过程化语言

ØSQL是一个非过程化的语言,因为它一次处理一个记录,对数据提供自动导航

ØSQL允许用户在高层的数据结构工作,而不对单个记录进行操作,可操作记录集。所有SQL语句接受集合作为输入,返回集合作为输出

ØSQL的集合特性允许一条SQL语句的结果作为另一条SQL语句的输入

2、统一的语言

【SQL为以下任务提供的命令包括】

查询数据

在表中插入、删除和修改记录

建立、修改和删除数据对象

控制对数据和数据对象的存取

保证数据库一致性和完整性

3、所有关系数据库的公共语言

Ø由于所有主要的数据库管理系统都支持SQL语言,用户可将使用SQL的技能从一个RDBMS转到另一个。用SQL编写的程序都是可以移植的

ØT-SQLTransact-SQL)是标准SQL的加强版,除了标准的SQL命令之外,还对SQL命令做了许多扩充,提供类似于程序语言的基本功能,如变量说明、流程控制、功能函数

2)、T-SQL的组成

ØDMLData Manipulation  Language,数据操纵语言):用来查询、插入、删除、修改数据库中的数据。如‘select insert  update  delete

ØDDLData Definition  Language,数据定义语言):用来建立数据库、数据对象和定义其列、大部分是以Create开头的命令。如‘create alter  drop

ØDCLData 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~zA~Z0~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结尾的所有四个字母的名字(dgansgan等)

任意长度的字符串

Name like ‘%gan%’:将查找所有包含gan的名字(dgansganshgan等)

[]

括号中所指定范围的一个字符

Name like ‘[c-p]arsen’:将查找以arsen结尾且以介于CP之间的任意单个字符开始的名字(Carsen

Marsen等)

[^]

不在括号中所指定范围内的任意一个字符

Name like ‘car[^afg]’:将查找以car开始且其后的字母不为afg的所有名字(carncarj等)


表:通配符

《注意》:

通配符经常与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支持的逻辑运算符有AndOrNot

          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,如需转载请自行联系原作者


上一篇:SQL Select查询原理--查询语句执行原则(基础)


下一篇:SQL 基础之DDL语句创建和管理表(十四)