`

mssql培训计划之SQL(DML部分)语句操作篇

阅读更多
===========================================================

前言:

SQL语句分:数据定义语言(Data Definition Language,简称“DDL”)、数据操纵语言(Data Manipulation Language,简称“DML”)、数据控制语言(Data Control Language,简称“DCL”)三部分功能。

本篇主要讲解DML部分,查询是DML部分中最主要的部分,所以重点讲解。查询按表达方式可分为两类:关系代数和关系演算。关系代数是用对关系的运算来表达查询的,而关系演算是用谓词来表达查询的,关系演算根据谓词变元的不同又分为元组关系演算和域关系演算两种。数学理论证明关系代数和关系演算在表达能力上是等价的,只要RDBMS(关系型数据库管理系统)支持,两者是可以相互转换的,这种转换能力可以用来评估一个RDBMS的查询强大与否。Sqlserver这个RDBMS主要采用关系代数来表达查询,今天我们所学习中的查询(select)操作的元素在数据库理论里都有对应的概念。

在sqlserver中DML包括:select,update,insert,delete;DDL包括:create,drop,alter;DCL包括grant,revoke,deny,execute,while等等。


例表:
假定对score(成绩)、student(学籍卡)、course(课程)、classcourse(科目属性设置表)这四张表操作

一.Select语句
1.语法:
select * from table_name where …group by … having…order by …
语法的执行顺序说明:先执行from字句,然后依次是where、group by、having、order by字句,最后才对结果select
2.普通单表查询
select * from score --取所有的学生成绩
select top 100 * from score --取前100条的学生成绩
3.不重复查询
select distinct xm,mz from student –取姓名和民族同时不重复的学生
4.带条件查询(where后面不可跟聚合函数,比较运算符的右边不可出现集合值)
select * from score where kclx='任选课' and xqmc='2003-2004学年第二学期' –取2003-2004第二学期选择任选课的学生成绩
5.关联查询(为了避免笛卡儿乘积的产生,对于n个表的连接,至少要有n-1个条件;对于重复的字段,则需要在字段前加上表的别名,如a.xm)
select a.xm,a.xb,c.kcmc,b.qmresult from student a,score b,course c where a.id=b.id and b.kcdm=c.kcdm and cast(b.qmresult as float)<60 and b.qmresult <>'' –取参加考试成绩小于60分的学生姓名、性别、课程名称和成绩。这个语句根据ANSI-92标准也可以这样写:
select a.xm,a.xb,c.kcmc,b.qmresult from student a join score b on a.id=b.id join course c on b.kcdm=c.kcdm where cast(b.qmresult as float)<60 and b.qmresult <>''
6.临时表
select * into #temp from score –将学生的成绩存放在一张临时表里
select * into #tmp from score where 1=2 –生成一张与成绩表结构一样的表#tmp
临时表使用完毕,使用drop table #tmp
表变量
declare @temp table(sid int)
insert @temp select 1
select * from @temp
7.分组(group by)、筛选(having)
select mz,count(*)
from student where xb='女'
group by mz
having(count(*))<100
说明:语句先执行where条件,然后在条件里分组(group by)排列,最后在分组里进一步筛选(having);select选择列表里除聚合函数以外的列都必须出现在group by后面,group by后面不能跟字段别名,不支持任何使用了聚合函数的集合列;having可以包含聚合函数,可以引用选择列表中出现的任意列
8.聚合函数(avg)、分组(group by)、筛选(having)、排序(order by)
select id,kclx,avg(cast(qmresult as float)) as avgresult
from score
where xqmc='2003-2004第二学期' and len(qmresult) in (2,3)
group by id,kclx
having avg(cast(qmresult as float))<60
order by avg(cast(qmresult as float)) desc–取2003-2004学年第一学期参加考试每种课程类型的平均分小于60的学生按分数排序的情况
说明:聚合函数(也称统计函数)共有5个,分别是:avg --求平均值,count --统计数目,max --求最大值,min --求最小值,sum --求和,更具体的用法查看sqlserver联机帮助;排序有两种:asc(升序),desc(降序)
10.并集运算
select xm,mz into #temp from student
union all
select xm,mz from student –将学籍卡里的的学生信息与新生入学登记表里的学生信息合并到临时表#temp里。
说明:union all会取多表并集的重复行;union可以去掉重复行;多表之间的union必须列数相同一一对应,对应的列之间必须可以隐性的转换成相同的数据类型(即兼容)
11.嵌套查询(分为层次嵌套和相关嵌套两种,当嵌套多于2个又称多级嵌套)
⑴.层次嵌套(in,not in,比较运算符)
select * from student
where id in
(select id from score where xqmc='2003-2004第一学期' and qmresult>(select avg(cast(qmresult as float)) from score))
任何的层次查询都可以化解成关联查询,如这题也可以写成:
select distinct a.*
from student a,score b
where a.id=b.id and b.xqmc='2003-2004第一学期' and b.qmresult>(select avg(cast(qmresult as float)) from score)
--求2003-2004第一学期参加期末成绩超过全校历年平均分的学生资料
⑵.相关嵌套(exists,not exists)
select distinct a.xqmc,a.bh,a.kcdm,1,1
from score a
where restudy=0 and
not exists (select 1 from classcourse where xqmc=a.xqmc and bh=a.bh and kcdm=a.kcdm)--原始成绩单里有而科目属性设置里没有的课程
⑶.说明:
in、not in执行的机制是先执行紧跟其后的子查询,然后再执行父查询,判断父查询的关键字是否存在于子查询所得到的集合里;exists、not exists的执行机制是每取得子查询的一条记录马上就与父查询记录进行比较,一直遍历整个子查询到结束,相关查询之间的连接不是列之间的关系,而是表之间的关系,所以在select列表中,通常不需要明确的指定列名,使用*或数字(如1)代替就可以了;使用not in或not exists可以很方便的实现非成员关系型和非存在关系型的查询难题,降低查询复杂度;如果能确定子查询返回的是单值,那么可以使用比较运算符;另外嵌套查询只能放在小括号里;子查询还可以嵌套其他子查询,这就是多级查询,这种层层嵌套的构造正是SQL(Structured Query Language)中“结构化”的含义所在

二.Update语句
1.语法:
update table_name set …from … where…
2.单表更新:
update student set xh='女' where id='000dc023-0812-4aa9-abb8-75b8bcfbc9e9' --改学生性别
3.多表集联更新
update score set qmresult ='0' from student a,score b where a.id=b.id and a.xm='王博宇' --将王博宇的所有期末成绩都改为0

三.Insert语句
1.语法:
insert table_name(,…n) values(,…n)
insert table_one(,…n) select ,…n from table_two …
insert table_name(,…n) exec(@sql) –动态语句
2.单表插入
insert student(id,xm,xb,bh,xh,csrq,mz,rxnf)
select newid(),'颜晓琳','女','A0202','020002','2005-02-18','汉族','2005'
说明:对表中的某部分字段操作,字段要一一列出来,值要跟字段一一对应,且数据类型相同。

四.Delete语句
1.语法:
delete table_name where …
delete table_name from table_one,table_two where …
truncate table table_name(整表删除且不写日志)
2.单表删除
delete student where xh='031002023121' –删除某个学生信息
3.集联删除
delete student from student a,score b
where a.id=b.id and b.mark<>1 –删除成绩单里无成绩或成绩无效的学生信息

五.Drop语句(DDL)
drop table table_name –删表
drop database db_name –删数据库

六.条件语句(if…else,case)(DCL)
1.If条件语句
语法:
if logical expression
expressions1
[else
expressions2]
例句:
if (select count(1) from student where xb not in('男','女'))>0
begin
print '这些学生的性别没有正确填写:'
select xh,xm,bh from student where xb not in('男','女')
end
else
print '所有的学生性别都正确填写了'
说明:
如果逻辑判断表达式返回的结果为真,那么执行sql语句组1,否则执行sql语句组2;else和sql语句组2不是必须的,如果没有else条件,那么当逻辑判断表达式返回的结果是假的,就什么操作也不做。
2.Case条件语句
语法:
case
{when logical_expression then relust_expression}
[…n]
else relust_expression
end
例句:
select (case when mz='汉族' then '汉族学生' else '其他民族学生' end) '民族',xh,xm,bh
from student order by mz
说明:case语句用于实现多种条件选择,可以避免编写多重的if…else嵌套语句。

七.循环语句(while)(DCL)
语法:
while logical expression
begin
expression
[break]
[continue]
end
例句:
while exists (select qmresult from score where (cast(qmresult as float))<60 and qmresult<>' ')
begin
update score set qmresult=(cast(qmresult as float))*1.5
select min(qmresult) from score
if (select min(cast(qmresult as float)) from score where ceiling(qmresult)<>0)>60
break
else
continue
end
print '所有不及格学生的期末成绩按1.5系数都已改为及格以上'
说明:
当逻辑判断表达式为真时,服务器将重复执行sql语句组。Break的作用是在某些条件发生时,立即无条件跳出循环,并开始执行紧跟在end后面的语句;continue的作用是在某些条件发生时,跳出本次循环,并开始执行下一次循环。

八.其他
1.--表示行注释,/*,*/组合表示块注释
2.取服务器时间:select getdate()
3.查看sqlserver版本:select @@version
4.系统存储过程以sp_开头,系统扩展存储过程以xp_开头
5.局部临时表以#开头,全局临时表以##开头
6.局部变量以@开头,全局变量以@@开头,宣称变量用declare,给变量赋值用select或set
7.标识符的名称规则:以字母或下划线_、@、#开头,后带字母或数字或_、@、#、$,不能使用系统保留关键字,内部不允许有空格或特殊符号;对不遵守上述规定的标识符必须使用界定符号[]限定
8.对象的命名规则:[[server].[database].[user].]object_name(依次为:机器名,数据库名,拥有者名,对象名)
9.语句里所使用的任何符号都必须是半角的
10.任何复杂的sql语句都是由基本的sql语句组合在一起
11.对于视图(view)的使用方法和表(table)是一样的

九.补充
1.本讲带领入门sql语法并且听讲人全部理解也只能达到会对常见需求操作的水平
2.对select更高级更复杂的应用没有深入展开,只能听讲人以后自己进一步钻研,任何大型数据库的强大都体现在查询功能里
3.没有讲解触发器(trigger)、自定义函数(function)、存储过程(procedure)、事务(transaction)等其他数据库对象的应用
4.其他系统提供的函数、运算符、系统存储过程、系统表等等要懂得自己查联机帮助

kyle 发表于:2005.02.23 23:16 ::分类: ( dbms ) ::阅读:(3724次) :: 评论 (29)
分享到:
评论

相关推荐

    MySQL数据操作-DML语句的使用

    DML(Data Manipulation Language)数据操作语言,是指对数据库进行增删改的操作指令,主要有INSERT、UPDATE、DELETE三种,代表插入、更新与删除,这是学习MySQL必要掌握的基本知识。 方语法中 [] 中内容可以省略。  ...

    MySQL常用基本SQL语句小结

    SQL分类: DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE) DML—数据操纵语言(SELECT,DELETE,UPDATE,INSERT) DCL—数据控制语言(GRANT,REVOKE,COMMIT,ROLLBACK

    SQL语句在MySql Oralce 中的实例运用

    SQL的DDL DML 语句在MySql Oracle 数据库的整合,轻松掌握sql 语句在不同数据库之间的差异,其中还有一些经典的sql 语句实例 如 分页查询 横竖表的转换。

    mysql的DML和DQL和相关sql语句总结.emmx

    使用mindmaster打开

    my2sql:解析MySQL binlog ,可以生成原始SQL、回滚SQL、去除主键的INSERT SQL等,也可以生成DML统计信息以及大事务分析信息

    my2sqlgo版MySQL binlog解析...分析主库执行SQL语句除了支持常规数据类型,对大部分工具不支持的数据类型做了支持,比如json、blob、text、emoji等数据类型sql生成产品性能对比binlog2sql当前是业界使用最广泛MySQL回

    详解mysql DML语句的使用

    本篇文章将主要聚焦于DML语句,为大家讲解表数据相关操作。 这里说明下DDL与DML语句的分类,可能有的同学还不太清楚。 DDL(Data Definition Language):数据定义语言,用于创建、删除、修改、库或表结构,对数据库或...

    SQL语句(自我总结).docx

    SQL语句的基本语句总结: DDL操作数据库:数据定义语言,操作数据库和表示,关键字:create、drop、alter等;DDL操作表 ;DML操作记录:数据操作语言,对数据进行增删改,关键字:insert, delete, update等;DQL:数据...

    MySQL 最基本的SQL语法/语句

    DDL—数据定义语言(Create,Alter,Drop,DECLARE) DML—数据操纵语言(Select,Delete,Update,Insert) DCL—数据控制语言(GRANT,REVOKE,COMMIT,ROLLBACK) 首先,简要介绍基础语句: 1、说明:创建数据库 Create ...

    SQL语句语法.xmind

    Mysql数据库的DLL、DML语句语法,包括:对数据库的新增、修改、删除预防,对表结果的新增、修改、删除,对视图、索引、约束的操作。数据表的新增、修改、删除数据,查询语句的使用。

    简单mysql的sql语句模板

    包括DDL,DML,DQL,DCL,例如创建数据库,修改表等

    经典全面的SQL语句大全

    经典SQL语句大全 下列语句部分是Mssql语句,不可以在access中使用。  SQL分类:  DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE)  DML—数据操纵语言(SELECT,DELETE,UPDATE,INSERT)  DCL—数据控制...

    MySQL hint用法解析

    在MySQL中还有一种提示,叫做hint,hint是对数据库的提示,我们都知道, 在执行一条SQL语句的时候,MySQL都会生成一个执行计划,而hint就是用来告诉优化器按照我们告诉它的方式生成执行计划。Hint可以基于表连接的...

    MySQL Binlog Digger 4.28 + Mysql Binlog分析 + 数据库

    当发生误删、误增、误改时,它可以帮助我们从binlog中快速定位到误操作的重做语句(redo sql),同时推理出回滚语句(undo sql)。此外,它还可以结合[mysqld]的init-connect参数做mysql 8.0的数据库审计。 ​一. 对dml...

    【mysql5.7安装包及教程】.zip

    用SQL操作数据库时大部分的工作由DBMS自动完成。 SQL的分类有: 1、DDL(Data Definition Language) 数据定义语言,用来操作数据库、表、列等; 常用语句:CREATE、 ALTER、DROP 2、DML(Data Manipulation Language)...

    mysql基本语法,增删改查大全总结,以及常用的sql语句总结

    mysql语法大全总结,内含DDL,DML,DQL,DCL等语句,可作为工作学习的小字典,随时查看学习,查询所有数据库、查询当前数据库、创建数据库、删除数据库、切换数据库、查询当前数据库的所有表、查看指定表结构、查询指定...

    SQL培训第一期

    1.2.2 数据操作语言(DML) 用于操作关系型数据库对象内部的数据,insert、update、delete。 1.2.3 数据定义语言(DDL) 用来建立及定义数据表、字段以及索引等数据库结构,create、alter、drop 。 1.2.4 数据控制...

    MYSQL语句学习

    MYSQL语句学习,基础的ddl,dml,sql,dcl语句的使用,简洁有注释。

    2017最新老男孩MySQL高级专业DBA实战课程全套【清晰不加密】,看完教程月入40万没毛病

    19-DML语句之insert知识讲解.avi 20-DQL之select知识实战讲解.avi 21-DQL之select多表连表查询实战.avi 22-利用explain查看sql语句的执行计划.avi 23-DML之修改表中的记录实战.avi 24-小试牛刀初步增量恢复MySQL数据...

    mysql2h2-converter:一个用 Java 编写的 MySQL 到 H2 SQL 转换库

    mysql2h2-转换器用 Java 编写的 MySQL 到 H2 SQL 转换库。...使用 datasource-proxy 转换示例其他想法: 查看 jOOQ 看看它是否可以用于对 DML 语句和 Liquibase 建模 DDL 部分执照此代码是在 MIT 许可下提供的。

    (My)SQL DDL语句

    2:DML语句:数据操纵语言,用于添加、删除、更新、查找。其只对表内部数据进行操作,而不涉及表的定义和结构的修改。常用关键字主要包括insert、delete、uptdate和select。 3:DCL语句:数据控制语句,用于控制不同数据...

Global site tag (gtag.js) - Google Analytics