T-SQL基础技术
T-SQL语言中最重要的部分是它的查询功能,查询语言用来对已经存在于数据库中的数据按 照特定的行、列、条件表达式或者一定次序进行检索。
T-SQL对数据库的查询使用SELECT语句,SELECT语句具有灵活的使用方式和强大的功能, SELECT语句的基本语法格式如下:
基本语法格式
SELECT select_list /* 指定要选择的列 */ FROM table_source /* FROM子句,指定表或视图 */ [ WHERE search_condition ] /* WHERE子句,指定查询条件 */ [ GROUP BY group_by_expression ] /*GROUP BY子句,指定分组表达式 */ [ HAVING search_condition ] /* HAVING子句,指定分组统计条件 */ [ ORDER BY order_expression [ ASC | DESC ]] /*ORDER子句,指定排序表达式和顺序*/
代码准备:(可以按照我的实例自行建立数据库)
1、投影查询
a、投影指定的列
b、投影全部列
c、修改查询结果的列标题
d、去掉重复行
此部分比较简单,直接上代码
-- 打开数据库 use sixstardb go -- 1、【投影查询数据】 -- 查询输出指定字段:学号,姓名,专业,总分 select sno,sname,cname,cscore from student -- 查询输出所有字段 select *from student -- 查询输出:则修改标题名称 select sno as '学号',sname as '姓名',cscore as '总分' from student -- 查询输出:去掉重复 select *from student select distinct cname from student --------------------------------------------------------------------------------------------------
2、选择查询
语法格式:
选择查询通过WHERE子句实现,WHERE子句给出查询条件,该子句必须紧跟FROM子句之后。WHERE <search_condition>
其中search_condition为查询条件,<search_condition>语法格式为:
{ [ NOT ] <precdicate> | (<search_condition> ) } [ { AND | OR } [ NOT ] { <predicate> | (<search_condition>) } ] } [ ,…n ]
其中predicate为判定运算,语法格式为:
{ expression { = | < | <= | > | >= | <> | != | !< | !> } expression /*比较运算*/ | string_expression [ NOT ] LIKE string_expression [ ESCAPE 'escape_character' /*字符串模式匹配*/ | expression [ NOT ] BETWEEN expression AND expression /*指定范围*/ | expression IS [ NOT ] NULL /*是否空值判断*/ | CONTAINS ( { column | * },'<contains_search_condition>') /*包含式查询*/ | FREETEXT ({ column | * },'freetext_string') /*自由式查询*/ | expression [ NOT ] IN ( subquery | expression [,…n] ) /*IN子句*/ | expression { = | < | <= | > | >= | <> | != | !< | !> } { ALL | SOME | ANY } ( subquery ) /*比较子查询*/ | EXIST ( subquery ) /*EXIST子查询*/ }
表1 查询条件
a.表达式比较
比较运算符用于比较两个表达式值,比较运算的语法格式如下: expression { = | < | <= | > | >= | <> | != | !< | !> } expression 其中expression是除text、ntext和image之外类型的表达式。
b.范围比较
BETWEEN、NOT BETWEEN、IN是用于范围比较的三个关键字,用于查找字段值在(或不在)指定范围的行。
c.模式匹配
字 符 串 模 式 匹 配 使 用 LIKE 谓 词 ,LIKE 谓 词 表 达 式 的 语 法 格 式 如 下 : string_expression [ NOT ] LIKE string_expression [ ESCAPE ‘escape_character’]
其含义是查找指定列值与匹配串相匹配的行,匹配串(即string_expression)可以是一个完整的字符串, 也可以含有通配符。
通配符有以下两种:
%:代表0或多个字符。
_:代表一个字符。
d.空值使用
空值是未知的值,判定一个表达式的值是否为空值时,使用IS NULL关键字,语法格式如下:
expression IS [ NOT ] NULL
代码示例:
-- 2、【选择查询】 -- a--表达式比较 查询输出性别为"女"且"模特专业" select *from student where ssex='女' and cname='软件工程' update student set cscore=88 where sname='大春' select *from student -- b--范围查询 查询输出总分为(710,700,750) select *from student where cscore in(88,100,99) select *from student where cscore=88 or cscore=100 or cscore=99 -- 同上面一样 -- 查询输出700-712 select *from student select *from student where cscore between 85 and 100 -- c--模式匹配 查询输出姓名中有"小"开头 select *from student select *from student where sname like '大%' select *from student where sname like '%虎' select *from student where sname like '%明%' select *from student where sname like '_明_' select *from student where cscore like '%9' -- d--判断空值 insert into student values(8,'04','狗蛋','女','原子弹制备',56,null) select *from student where crank is null delete from student -- 删除一组数据 where sname='狗蛋' --------------------------------------------------------------------------------------------------
结果可以自行测试,内容过多,我就不往这放了
3、连接查询
a.连接谓词
在SELECT语句的WHERE子句中使用比较运算符给出连接条件对表进行连接,将这种表示形式称为连接谓词表示形式。其一般语法格式为:
[<表名1.>] <列名1> <比较运算符> [<表名2.>] <列名2> 比较运算符有:<、<=、=、>、>=、!=、<>、!<、!> 连接谓词还有以下形式:
[<表名1.>] <列名1> BETWEEN [<表名2.>] <列名2>AND[<表名2.>] <列名3>
由于连接多个表存在公共列,为了区分是哪个表中的列,引入表名前缀指定连接列。例如,student.stno表示student表的stno列, score.stno表示score表的stno列
经常用到的连接如下:
●等值连接:表之间通过比较运算符“=”连接起来,称为等值连接。
●非等值连接:表之间使用非等号进行连接,则称为非等值连接。
●自然连接:如果在目标列中去除相同的字段名,称为自然连接。
●自连接:将同一个表进行连接,称为自连接。
b.以JOIN关键字指定的连接
T-SQL扩展了以JOIN关键字指定连接的表示方式,使表的连接运算能力有了增强。JOIN连接在FROM子句的< joined_table >中指定。
语法格式
<joined_table> ::= { <table_source> <join_type> <table_source> ON <search_condition> | <table_source> CROSS JOIN <table_source> | <joined_table> }
说明:
<join_type>为连接类型, ON用于指定连接条件, <join_type>的格式如下:[INNER|{LEFT|RIGHT|FULL}[OUTER][<join_hint>]JOIN
INNER表示内连接,OUTER表示外连接,CROSS表示交叉连接,此为JOIN关键字指定的连接的3种类型。
(1)内连接
内连接按照ON所指定的连接条件合并两个表,返回满足条件的行。内连接是系统默认的,可省略INNER关键字。
(2)外连接
在内连接的结果表,只有满足连接条件的行才能作为结果输出。外连接的结果表不但包含满足连接条件的行,还包括相应表中的所有行。外连接有以下3种:
●左外连接(LEFT OUTER JOIN):结果表中除了包括满足连接条件的行外,还包括左表的所有行;
●右外连接(RIGHT OUTER JOIN):结果表中除了包括满足连接条件的行外,还包括右表的所有行;
●完全外连接(FULL OUTER JOIN):结果表中除了包括满足连接条件的行外,还包括两个表的所有行。
代码如下:
-- 3、【连接查询】 -- a--连接谓词 select *from student select *from course select student.sno,student.sname,student.ssex,student.cname,course.cno,course.cname,course.cstudyscore from student,course where student.cno=course.cno -- 内连接 select *from student inner join course on student.cno=course.cno -- 全显示 select s.sno,s.sname,c.cno,c.cname -- 查询显示 from student s join course c on s.cno=c.cno where c.cno='03' and s.cscore>=90 -------------------------------- -- 以下操作容易打乱上述数据库,所以我新建了个数据库用于执行下面的操作 create database testdb use testdb go -- b--JOIN关键字 select *from a select *from b -- 左连接 select a.*,b.* from a left join b on a.id=b.id -- 右连接 select *from a select *from b select a.*,b.* from a right join b on a.id=b.id -- 完全连接 select *from a select *from b select a.*,b.* from a full join b on a.id=b.id --------------------------------------------------------------------------------------------------
4、统计计算
--4、【统计计算】 use sixstardb go -- 统计最大数 最小数 平均数 select *from student select max(cscore) as '最高分',min(cscore) as '最低分',avg(cscore) as '总分平均分' from student -- 统计行数 select *from student select count(*) as '学生总数' from student --------------------------------------------------------------------------------------------------
5、排序查询
-- 5、【排序查询】 -- order by语句-->排序操作 默认为升序,DESC降序 use testdb go select *from orders -- 根据字母顺序显示公司名称 select company,ordernumber from orders order by company -- 根据数字降序显示 (升序去掉desc即可) select company,ordernumber from orders order by ordernumber desc -- having子句 select *from orderhaving -- 查询金额少于2000, select order_custmer,sum(order_price) as '总数' from orderhaving group by order_custmer having sum(order_price)<20000 ------------------------------------------------- use sixstardb go select *from course --select *from grade select *from student select *from student select s.sno,s.sname,c.cname from student s,/*grade g,*/course c where /*s.stno=g.stno and */s.cno=c.cno and c.cname='软件工程' ----------------------------------------------------------
6、子查询
/* 什么是子查询?子查询就是嵌套在主查询中的查询 */ use testdb go select *from customers select *from customers where id in( select id -- 子查询id from customers -- 子查询来自cunstomers where salary>=7000) -- 子查询条件 整体查询后返回id值