SQL即结构化查询语音。是一个非过程化的语音,因为它一次处理一个记录,对数据提供自动导航。
SQL可用于所有用户的DB活动模型,作为统一的语音,为许多任务提供了命令,包括:
查询数据;
在表中插入、修改和删除记录;
建立、修改和删除数据对象;
控制对数据和数据对象的存取;
保证数据库一致性和完整性。
所有主要的关系数据库管理系统都支持SQL语言。
T-SQL
T-SQL是标准SQL的加强版。
T-SQL的组成:
v DML(数据操纵语音)用来查询、插入、删除和修改数据库中的数据,如select,insert,delete,update.
v DDL(数据定义语言)用来建立数据库、数据库对象和定义其列,如create,alter,drop.
v DCL(数据控制语音)用来控制数据库组件的存取许可,存取权限等,如grant,revoke.
使用T-SQL查询数据
Select语法结构
Select 列名 from 表名 where 查询限定条件
Select子句:指定查询内容。
Into子句:用于把查询结果存放到一个新表中
From子句;指定查询源
Where子句:查询条件
Group by:指定查询结果的分组条件,通常是一个列名,但不能是列的别名
Having子句:指定分组搜索条件,通常与group by一起使用
Order by子句:指定查询结果的排序方式,其中ASC表示升序,是系统默认排序方式,DESC表示降序。
表达式
1. 条件表达式
SQL Server中的表达式可以包含下列一个或多个参数
常量:表示单个指定数据值的符号,一个常量由一个或多个 字母、数字字符(字母a-z,A-Z,数字0-9)或符号(!@#等)组成,字母和日期时间数据类型的常量需要用单引号括号起来,而二进制字符串和数字常量则不需要。
列名:表中列的名称,表达式中仅允许使用列的名称
{一元运算符}:仅有一个操作符的运算符,其中“+”表示
整数,“-”表示负数,“~”表示补数运算符。
{二元运算符}:将两个操作组合执行操作的运算符,二元运算符可以算数运算符、赋值运算符{=}、位运算符、比较运算符、逻辑运算符、字符串串联(或连接)运算符(+)或一元运算符。
比较运算符
运算符 |
含义 |
= |
等于 |
> |
大于 |
< |
小于 |
>= |
大于或等于 |
<= |
小于或等于 |
<> |
不等于 |
!= |
不等于,等同于<> |
between |
指定值的包含范围(包含边界),使用and分割开始值和结束值 |
Is(not)NULL |
根据使用的关键字,指定是否搜索空值或非空值,如果有任何NULL,则包含位运算符或算术运算符的表达式的计算结果为NULL |
like |
模糊查询,与指定字符串进行模式匹配(没有范围) |
in |
是否在数据范围内,用于限制范围使用like运算符的T-SQL语句中需要以下通配符运算符 |
‘_’ |
任何单个字符 |
Name like’_ean’将查找以ean结尾的所有四个字母的名字(如dean,sean) |
% |
任意长度的字符串 |
Name like’%ean%’将查找所有包含ean的名字(sean.sheany等) |
[] |
括号中所指定范围内的一个字符 |
Name like’[C-P]arsen’将查找以arsean结尾且以介于C和P之间的任何单个字符开始的名字(如carsean,marsean) |
[^] |
不在括号中所指定范围内的任意一个字符 |
Name like’^car[afg]'将查找以car开始且其后的字母不为a,f,或g的所有名字 |
通配符经常与like关键字一起配合使用完成模糊查询,例如,要求表中的电话号码列输入的格式为11为手机号,前两位数字为13,可以编写如下约束表达式:
([telnumber]like‘13[0-9][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 |
当一个语句中使用了多个逻辑运算符时,首先求not的值,然后求and的值,最后再求or的值。
例如:采购订单表中的付款方式是信用卡,约束要求只能是牡丹卡、金穗卡、龙卡和太阳卡,可以编写如下的约束表达式:
付款方式=‘信用卡’and 信用卡 in (‘牡丹卡’,’金穗卡’,’龙卡’,’阳光卡’)
查询举例
1. 查询表中所有列
Select * from 表名
2. 查询表中特定列
Select 列名1,列名2,列名3……from 表名
3. 查询表中特定行--条件查找
Select 列名 from表名 where 子句
例如:
1) 查询student表中7班的学生姓名
select 姓名 from student where 所在班级=7
2) 查询student 表中成绩90-100的学生所有信息
Select * from student where 成绩 between 90 and 100
3) 查询student表中成绩低于90或者高于95的学生所有信息
Select * from student where 成绩<90 or 成绩>95
4) 查询student表中成绩为89,90或91的学生所有信息
Select * from student where 成绩in(89,90,91)
5) 查询student表中姓刘的学生所有信息
Select * from student where 姓名 like ‘刘%’
6) 查询student表中2班的名叫刘婷的学生信息
Select * from student where 姓名=‘刘婷’and 所在班级=2
7) 查询student表中备注不为空的学生所有信息
Select * from student where 备注 is not null
4.查询返回限制的行数,使用top关键字
Select top 行数 列名 from 表名
例如:查询student表中前5行的数据
Select top 5 * from student
5.改变查询结果集列名称
As子句查询结果排序可以用来改变结果集列的名称,也可以为组合或者计算出的列指定名称,
Select 原名 as 别名,原名 as 别名 from 表名
Select 原名 别名,原名 别名from 表名
Select 别名=原名,别名=原名 from 表名
例如:查询student 表中姓名和***号两列数据,查询结果“姓名”列名称显示为“name”;“***号”列名称显示为”idcard”
Select 姓名 as name ,***号 as idcard from student
查询student 表中所有学生的总成绩,列名称显示为“总成绩”
Select SUM(成绩) as 总成绩 from student
6.查询结果排序
通过order by 子句可以改变查询结果的显示结果
Select select_list from table_name order by colulm_name [asc|desc]
Select_list 用于指定查询字段列表,样式为“表.字段1,表.字段2,表.字段i,……”,如果查询单个表,表前缀可以省略,样式为“字段1,字段2,字段……”
查询student表中所有学生信息,按照成绩从高到低显示查询结果
Select * from student order by 成绩 desc
7.分组查询
1. 分组查询,就是将表中数据按照一定条件分类组合,再根据需要得到统计信息,通过group by 子句可以实现;
2. 如果需要对分组结果进行筛选,只显示满足限定条件的,需要使用having子句.
Select select_list from table_name group by column_name [asc| desc]
u在带有group by 子句的查询中,在select_list 中指定的列要么是group by子句中指定的列,要么包含聚合函数。
u聚合函数用于对一组值执行计算,并返回单个值,如求总和、平均值、最大或最小值等,聚合函数经常与select语句的group by 子句一起使用,T-SQL中常见的聚合函数有SUM,AVG,MAX,MAIN,COUNT等。
SUM:返回表达式中所有数值的总和,SUM只能于数字类型的列,不能够汇总字符、日期等其他数据类型。
例如:查询student表中所有学生的总成绩
Select SUM(成绩) 总成绩 from student
AVG:返回表达式中所有数值的平均值,只用于数字类型的列
例如:查询表中所有学生的平均成绩
Select AVG (成绩) 平均成绩 from student
MAX:返回表达式中的最大值,可用于数字型、字符型及日期、时间类型的列
MIN:返回表达式中的最小值,同MAX
例如:查询student表中所有学生中的最高分和最低分
Select MAX(成绩) 最高分,MIN(成绩) 最低分 from student
COUNT:返回表达式中非空值的计数,可以用于数字和字符类型的列,使用星号可以不必指定特定的列而计算所有的行数
例如:查询student表中所有行数
Select COUNT(*) 总行数 from student
当group by子句中使用having子句时,查询结果只返回满足having条件的组;
在一个T-SQL语句中可以有where子句和having子句,均用于设置限定条件。
Group by子句与where子句的区别:
1) where子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚合函数,使用 where语句显示特定的行;
2) Having子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚合函数,使用having条件
3) 显示特定的组,也可以使用多个分组标准进行分组。
例如:查询student 表每个班级的总成绩
Select 所在班级,SUN(成绩) as 总成绩 from student group by 所在班级
查询student表中总成绩大于200的班级
Select 所在班级,SUN(成绩) as 总成绩 from student group by 所在班级 having sun(成绩)>200
8.插入数据
使用select into 子句可以把一个表中的数据经过筛选插入到另一个表中
Select select_list into new_table_name from table_name
例如:将student表中的所有数据插入到新表student_bak中
Select * into student_bak form student
将student表中2班的学生信息保存到表student_2中
Select * into student_2 from student where 所在班级=2
使用T-SQL实现多表查询
1. 表连接类型
1) 内连接
① 它内连接是最常用的一种连接方式,只返回两个数据集合之间匹配关系的行,将位于两个相互交叉的数据集合中重叠部分以内的数据行连接起来
② 内连接使用比较运算符进行表间某些列数据的比较操作并列出这些表中与连接相匹配的数据行
2) 外连接
外连接是对内连接的扩充,除了将两个数据集合中重复部分以内的数据行连接起来之外,还可以根据要求返回左侧或右侧中非匹配的数据或全部数据
外连接分为以下三种:
v 左外连接(left join或left outer join)
左外连接的结果集包括左表的所有行,如果左表的某一行在右表中没有匹配行,则将为右表返回空值,否则返回相应值
v 右外连接(right join或right outer join)
右外连接是左外连接的反向连接,将返回右表的所有行,如果右表的某一行在左表中没有匹配行,则将为左表返回空值,否则返回相应值
v 全连接/完整外连接(full join或full outer join)
全连接/完整外连接将返回左表和右表中的所有行,当某一行在另一个表中没有匹配行时,另一表返回空值,否则返回相应值
3) 交叉连接
交叉连接就是表之间没有任何关联条件,查询将返回左表和右表挨个连接的所有行,就是左表中的每一行与右表中的所有行再一一组合,相当于两个表“相乘”
2. 内连接
案例:在表A和表B中使用内连接查询学生姓名、学校和职业
内连接可以通过下面两种方式实现:
实现方式一:在where子句中指定连接条件
Select A.name 姓名 A,A school 学校 A,B.name 姓名 B,B.job 职业 B from A,B where A.name=B.name
实现方式二:在from子句中使用inner join……on 子句来实现
Select A.name 姓名 A,A.school 学校 A,B.name 姓名 B,B.job 职业 B from A inner join B on A.name=B.name
内连接查询的结果集是从两个表的组合中挑选出符合连接条件的数据,如果无法满足连接条件则将丢弃,在内连接中参与连接的表的地位是平等的
3. 外连接
1) 左外连接
案例:在表A和表B中使用左外连接查询学生姓名、学生和职业
Select A.name 姓名A,A.school 学校 A,B.name 姓名 B,B job 职业B from A left join B on A.name=B.name
2) 右外连接
案例:在表A和表B中使用右外连接查询学生姓名、学校和职业
Select A.name 姓名 A,A.school 学校 A,B.name 姓名 B,B.job 职业 B from A right join B on A.name=B.name
3) 外完整连接
案例:在表A和表B中使用完整外连接查询学生姓名、学校、职业
Select A.name 姓名A,A.school学校 A,B.name 姓名 B,B.job职业 B from A full join B on A.name=B.name
从以上几个例子可以看出,匹配的数据都显示出来了,与连接条件不匹配的数据行都以NULL值替代;
在外连接中参与连接的表有主从之分,以主表的每行数据去匹配从表的数据列