加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

SQLserver运维必备:T-SQL语句简介

发布时间:2020-12-12 13:46:24 所属栏目:MsSql教程 来源:网络整理
导读:? ?小生博客:http://xsboke.blog.51cto.com ? ?小生 Q Q:1770058260 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? -------谢谢您的参考,如有疑问,欢迎交流 一、 T-SQL 语言组成 T-SQL 主要有三种语言组成: ? 1. ?????? DML :数据操纵语言( data manipulation lan

? ?小生博客:http://xsboke.blog.51cto.com

? ?小生 Q Q:1770058260



? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? -------谢谢您的参考,如有疑问,欢迎交流



一、T-SQL语言组成

T-SQL主要有三种语言组成:

? 1.??????DML:数据操纵语言(data manipulation language


    • 查询、插入、删除和修改数据

    • SELECTINSERTUPDATEDELETE

? 2.??????DDL:数据定义语言(data definition language


    • 建立数据库、数据库对象和定义其列

    • CREATE(新建数据库或者表)、ALTER(增加数据表中的列)、DROP(删除数据库或表)

? 3.??????DCL:数据控制语言(data control language


    • 控制数据库组件的存取许可、存取权限等

    • GRANT(授予权限)、REVOKE(回收权限)、DENY(拒绝)

二、SELECT语法结构

1. 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子句:指定查询内容

    • INTO子句:把查询结果存放到一个新表中

    • FROM子句:指定查询源

    • WHERE子句:查询条件

    • GROUP BY子句:指定查询结果的分组条件

    • HAVING子句:指定分组后在执行的条件,与GROUP BY子句一起使用,和where功能一样,但是分组后的条件不能使用where只能使用having

    • ORDER BY子句:指定查询结果的排序方式,默认是升序asc,降序是desc

2. 表达式,一般用于设置条件时。

? 1)条件表达式

常量:表示单个指定数据值的字母、数字或符号

②列名:表中列的名称

③一元运算符:仅有一个操作数的运算符:“+”表示正数,“-”表示负数

④二元运算符:将两个操作数组合执行操作的运算符:算术运算符、位运算符、逻辑运算符、比较运算符

? ??

wKiom1jt0DOhtcf1AAEYHV7DJS4504.jpg

? ??

wKiom1jt0HuweHATAAAZOp40KAs375.png

? 2)逻辑表达式

???用逻辑运算符将条件连接起来,运算结果是一个逻辑值:TRUE(真)或FALSE(假)

? ??

wKiom1jt0LqyZLrbAAEEXL6GYkk878.jpg

? ? 关键字“in”可以用来限制范围,

? ? 例:限制付款时可以使用的信用卡种类

? ? 付款方式=‘信用卡’ and 信用卡 in 牡丹卡金穗卡龙卡阳光卡

?

3. as的用法(as就是给某个输出结果的列名设置别名,然后输出时列名用别名显示)

? 优点是可以事查询结果更人性化显示,比如把英文的列名输出成为中文的列名。

? 例:查询表student中所有学员的平均分

? 1)? 不加as

? ?Select ?AVG(成绩)

? ?From student

? ?

wKiom1jt0QvRtDMfAABvvfaUHUs418.jpg

? 2)? as

? ?Select ?AVG(成绩) as 平均成绩

? ?From student

? ?

wKioL1jt0R6xj20kAAAog_Yzofw273.png

4. Like的用法(用于不完全匹配的条件)

? 例:查询出表student中姓张的学员

?

wKiom1jt0TPhwJaHAAAoZ8pMHZY845.png

5. In的用法(限制范围)

? 例:查询出student表中成绩为899091的学生。

??

wKiom1jt0UijUOnaAAAsplBhVUk269.png

6. Top的用法(限制查询返回值的行数)

? 例:查询student表中的前五行的学员

??

wKiom1jt0V_hP-2CAAA0AeGZskY974.png

7. 函数count的用法(统计行)

? 例:查询出表中每种职位的总人数

??

wKiom1jt0YfS_WZmAAAngNI8A38878.png

?

三、多表查询

1. 表的连接类型

? 1内连接(INNER JOIN

? ? 只返回两个数据集合之间完全匹配关系的行

? 2外连接(左右外连接其实差不多,记住一个即可)

? ? ①左外连接(LEFT JOIN/leftouter join

? ? ?结果集包括左表的所有行

? ? ②右外连接(RIGHT JOIN/rightouter join

? ? ?结果集包括右表的所有行

? ? ③完整外连接(FULL JOIN/fullouter join

? ? ?返回左表和右表中的所有行

? 3交叉连接(cross join,一般不用)

? ? 返回左表与右表挨个连接的所有行

2. 内连接:只返回两个表中完全匹配的行

? 例:在表A和表B中使用内连接查询学生姓名和职业(两个表中存在的姓名是不完全一样的)

? 1)? 方法1:结果显示如下图

????select A.name,a.school,b.job

????from A,B

????where a.name=b.name

??

wKiom1jt0cPzLP9uAABVP9CEvCA954.png

? 2)? 方法2:结果显示如下图

????select A.name,b.job

????from A innerjoin B

????on A.name=b.name

??

wKioL1jt0d_T1IX_AABLovIBMxc716.png

3. 外连接

? 1)? 左外连接

? ? 例:在表A和表B中用左外连接查询学生姓名、学校和职业

? ??

wKiom1jt0fbjrRZCAAHAFUQjOxw177.jpg

? 2)? 右外连接

? ? 例:在表A和表B中用左外连接查询学生姓名、学校和职业

? ??

wKiom1jt0giAFXyoAACPB95Xzv4174.png

? 3)? 完整外连接:不再举例,完整外连接将只显示两张表中完全匹配的内容

4.?事务(如果执行的语句中有一条错误,此语句将不执行,并数据恢复语句执行前)

? 1)? 事务简介

? ? ①??概念

? ? ? 事务是一个不可分割的工作逻辑单元,包括一组命令,这组命令要么都执行,要么都不执行。

? ? ②??属性


    1. 原子性:事务是一个完整的操作。事务的各元素是不可分的。

    2. 一致性:当事务完成时,数据必须处于一致状态。

    3. 隔离性:事务是独立的,它不以任何方式依赖于或影响其他事务。

    4. 持久性:一旦事务被提交,事务的效果会被永久的保留在数据库中。


? 2)? 执行事务的语法

? ? ①开始事务:BEGIN TRANSACTION

? ? ②提交事务:COMMITTRANSACTION

? ? ③回滚(撤销)事务:ROLLBACKTRANSACTION

? 3)? 例:


    • 张三卡中余额只有1000,李四向张三借1000,但是银行限制余额最少为1,这时就需要使用事务,否则结果将导致张三的余额不变,而李四的余额多了1000.


????select *from bank

?

????updatebank set 余额=余额-1000

????where 账户='张三'

????updatebank set 余额=余额+1000

????where 账户='李四'

?

????print ?'查看转帐事务前的余额'

????select *from bank

????/*--开始事务(指定事务从此处开始,后续的T-SQL语句都是一个整体--*/

????begintransaction

????/*--定义变量,用于累计事务执行过程中的错误--*/

????declare@errorsum int --声明变量,用于保存所有T-SQL语句错误号的和

????set@errorsum=0

????/*--转帐:张三的帐户少1000元,李四的帐户多1000--*/

?

????updatebank set 余额=余额-1000

????where 账户='张三'

?

????set@errorsum=@errorsum+@@ERROR??? ?--累计是否有错误

????updatebank set 余额=余额+1000

????where 账户='李四'

????set@errorsum=@errorsum+@@ERROR ????--累计是否有错误

?

????print ?'查看转帐事务过程中的余额'

????select *from bank

?

????/*--根据是否有错误,确定事务是提交还是撤销--*/

????if@errorsum<>0 ????--如果有错误

????begin

????print ?'交易失败,回滚事务'

????rollbacktransaction

????end

????else

????begin

????print ?'交易成功,提交事务,写入磁盘,永久地保存'

????committransaction

????end

????go

????print ?'查看转帐事务后的余额'

????select *from bank

????go

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读