T-SQL基础语句

SQL(结构化查询语言)

关系数据库的标准语言

SQL ServerOracleDB2

非过程化语言

不需要指定对数据的存放方法

统一的语言

创建、修改以及删除数据对象(数据库、表等)

T-SQL

SQL的加强版, 提供了类似于程序语言的基本功能

变量说明、流程控制、功能函数


DML:数据操纵语言

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

SELECTINSERTUPDATEDELETE

DCL:数据控制语言

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

CREATEALTERDROP

DDL:数据定义语言

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

GRANTREVOKE

比较运算符

运算符

含义

=

等于

>

大于

<

小于

<=

小于等于

>=

大于等于

<>

不等于

!>

不等于

BETWEEN

指定值的包含范围(包含边界)。使用 And 分隔开始值和结束值

IS [Not] NULL

指定是否搜索空值或非空值

LIKE

模糊查询,与指定字符串进行模式匹配

IN

是否在数据范围里面


通配符

运算符

含义

AND

组合两个条件,并在两个条件都为True时取值为True

OR

组合两个条件,并在两个条件之一为 True 时取值为True

NOT

和其他操作符一起使用,取反的操作


1.创建数据库:

Createdatabasebenet--创建一个数据库名为”benet“

on

(

name=benet,--文件的逻辑名

filename='d:\benet.mdf',--数据文件存放的物理位置

size=10MB,--文件的初始大小

maxsize=100MB,--文件的总存储空间大小

filegrowth=10MB--文件的自动增长大小

)

logon

(

name=benet_log,

filename='d:\benet.ldf',--日志文件存放的物理位置

size=10MB,--日志文件的初始大小

maxsize=100MB,--日志文件的总存储大小

filegrowth=10MB--日志文件自动增长大小

)

Go


2.创建表:

usebenet--benet数据库下创建表

createtablestudent--创建一个表为”student“

(

sidintidentity(1,1)primarykeynotnull,

--设置标示符自动增长”identity“设置主键”primarykey' 不为空“not null”

namenvarchar(50)notnull,

sexnvarchar(50) default''notnull,           --默认值为

ageintnotnull,

birthdaysmalldatetime null

)


3.插入记录:

usebenet--benet数据库student表下插入记录

insertintostudent(name,sex,age,birthday)

values ('zhangsan','',22,'1994-01-01'),

('lisi','',24,'1992-02-03'),

('wangwu','',25,' ')



4.修改数据:

usebenet

updatestudent--把原来wangwu的性别"",改为""

setsex=''

wherename='wangwu'


usebenet

updatestudent--把所有性别为"",改为""

setsex=''

wheresex=''


usebenet

updatestudent--把所有人的年龄都+10

setage=age+10


usebenet

updatestudent--zhangsan的年龄+10

setage=age+10

wherename='zhangsan'


5.修改表:

usebenet

altertablestudent--添加列cid

addcidintnull


usebenet

altertablestudent

dropcolumncid--删除列cid


usebenet

altertablestudent--修改birthday的数据类型为datetime

altercolumnbirthdaydatetime



6.修改列名:

usebenet

execsp_rename'student.sex(原始表内的列名)','性别(新列名)','column'  --把列名“sex”改为“性别”


7.删除:

删除数据(注意:语句DELETEDROP TABLE之间有一个非常重要的区别。DELETE删除一个表中的一部分或全部的内容。而DROP TABLE则将表的内容和表的大纲全都一起删除。这样,在执行了DELETE语句之后,表依然存在于数据库中,尽管表中或许已没有行了,但在执行DROP TABLE语句后,表将不复存在)

DeleteTruncate table区别


条件删除

记录事物日志

重置标识符列

外键约束

Delete

使用where子句按条件删除

是,数据可以恢复

可以用于含有外键约束的表

Truncate  table

只能清空整个表

否,数据无法恢复

重置标识符列为0

不能用于含有外键约束的表


usebenet

deletefromstudent--删除表中所有性别为的信息

where性别=''


usebenet

deletefromstudent--删除表中所有年龄为“34”的信息

whereage='34'


usebenet

droptablestudent--删除表



8.select 查询

1查询studen表中的所有数据,*”代表全部


usebenet

select*fromstudent

2查询studen表中的name

usebenet

selectnamefromstudent

3查询studen表中的name列和sex,","隔开


usebenet

selectname,sex

fromstudent

4查询studen表中的李四的年龄


usebenet

selectage

fromstudent

wherename='李四'

5查询studen表中的不为李四的年龄

usebenet

selectage

fromstudent

wherename<>'李四'--(where name!='李四'\where not name='李四')

6)查询studen表中的name大于24

usebenet

selectname,age

fromstudent

whereage>24  

7)查询studen表中的name大于等于30


usebenet

selectname,age

fromstudent

whereage>=30  

8)查询studen表中的name小于24

usebenet

selectname,age

fromstudent

whereage<24  

9)查询studen表中的name小于等于30

usebenet

selectname,age

fromstudent

whereage<=30

10)查询studen表中的age等于18并且age等于30

usebenet

selectname

fromstudent

whereage=18 and age=30--whereage in 18,30))

11)查询studen表中的name大于等于30的并且小于等于50

usebenet

selectname,age

fromstudent

whereage>=30 andage<=50     --(where age between 30 and 50,如果不等于加“not)

12)查询studen表中的name小于等于30的或者大于等于50

usebenet

selectname,age

fromstudent

whereage<=30 orage>=50   --where age not between 30 and 50

(13)查询studen表中的sex为女并且年龄等于18

usebenet

selectname,age

fromstudent

wheresex=''andage=18    


(14)查询studen表中的所有sex(不重复)使用distinct

usebenet

selectdistinctsex--查询studen表中的所有sex(不重复)

fromstudent


NOT操作的优先级最高,AND其次,OR最低

比较以下两个语句的不同:

15)比如:

usebenet

Select*

Fromstudent

Where  age>22 andage<30)

orcid=1 andsex=''

--先执行age>22 andage<30,然后执行cid=1 andsex=''

,最后执行age<3 orcid=1


16)查询studentcid为空的性名

usebenet

Selectname

Fromstudent

Wherecidisnull     --不为空(where cid is not null


Selectcount(*)

Fromstudent

9.聚合函数

AS子句可以用来改变结果集列的名称

比如:

1)查看setudent表中age的总和

SelectSUM(age)as年龄

Fromstudent

2)查看setudent表中age的平均数

Selectavg(age)as年龄

Fromstudent

3)查看student表中age的的总个数

Selectcount(age)as总个数

Fromstudent

4)查看student表中age的最大值和最小值

Selectmax(age) --  最大值

Fromstudent


Selectmin(age)   --最小值

Fromstudent

10.分组查询:按照一定条件分类组合,通过groupby 子句实现,having子句的作用是筛选满足条件的组

1)统计每个课程的总成绩

Selectcidas课程编号,sum(score)as总成绩

Fromscore

groupbycid

2)统计每个课程的平均成绩

Selectcidas课程编号,avg(score)as平均成绩Fromscore

groupbycid

3)统计每个学生每个课程的平均成绩

Selectsidas学生编号,cidas课程编号,avg(score)as平均成绩

Fromscore

groupbysid,cid

4)只显示补考过的学生成绩

Selectsidas学生编号,cidas课程编号,avg(score)as平均成绩Fromscore

groupbysid,cid

havingcount(score)>1

11.降序升序、Top

1)查询student中的所有数据,并以年龄降序排列


Select*

fromstudent

orderbyagedesc    --esc升序

2)查询student中前5列数据,并以年龄降序排列

Selecttop 5 *  --top子句实现

fromstudent

orderbyagedesc


12.LIKE操作符用于将列的值与某个特定的模式做比较。列的数据类型可以是任何字符或者日期型数据。

通配符    %:any 代表零个或多个任意字符      _:single代表某一个任意字符

1)查询student表中所有姓名以张开头的姓名和年龄

Selectname,age

fromstudent

wherenamelike'%'

2)查询student表中所有姓名不是以张开头的姓名和年龄

Selectname,age

fromstudent

wherename not like'%'

3)查询student表中所有姓名无论第几个字为“德”的姓名和年龄

Selectname,age

fromstudent

wherenamelike'_%'

4)查询student表中所有姓名第二个字为“德”的姓名和年龄

Selectname,age

fromstudent

wherenamelike'%%'

5)查询student表中年龄为23开头的所有姓名

Selectname

fromstudent

whereagelike'[2-3]%'

6)查询姓(firstname)的打头字母不是JKLMNO,并且名(lastname)的打头字母不是E或者Z的所有学生的编号和名字


Selectstid,name

Fromstudent

Wherefirstnamelike'[^J-O]%'

andlastnamelike'[^EZ]%'

13.多表查询

合并union

student表和score表的cid合并

Selectcid

Fromstudent

union

selectcid

fromscore

1)内链接inner join

Selectstudent.name姓名s,student.cid班级s,

class.cid班级c,class.name名子c

fromstudent,class

wherestudent.cid=class.cid

或者标准写法:

Selectstudent.name姓名s,student.cid班级s,

class.cid班级c,class.name名子c

fromstudentinnerjoinclass

onstudent.cid=class.cid

2)外连接

1>左外连接使用left join(左为主表,右为从表,如果左表某一行在右表中没有匹配行,则右表返回null值)

Selectstudent.name姓名s,student.cid班级编号s,

class.cid班级编号c,class.name班级名c

fromstudentleftjoinclass

onstudent.cid=class.cid

2>右外连接使用right join(右为主表,左为从表,如果右表某一行在左表中没有匹配行,则左表返回null值)

Selectstudent.name姓名s,student.cid班级编号s,class.cid班级编号c,class.name班级名c

fromstudentrightjoinclass

onstudent.cid=class.cid

3>完整外连接使用full join(返回左表和右表的所有行,当某一行在另一表中没有匹配行时,另一表返回空值)

Selectstudent.name姓名s,student.cid班级编号s,class.cid班级编号c,class.name班级c

fromstudentfulljoinclass

onstudent.cid=class.cid

4>交叉连接使用cross join(表之间没有任何关联条件,查询将返回左表与右表挨个连接的所有行,就是左表中的每一行与右表的所有行一一组合

Selectstudent.name姓名s,student.cid班级编号s,class.cid班级编号c,class.name班级c

fromstudentcrossjoinclass

或者

Selectstudent.name姓名s,student.cid班级编号s,class.cid班级编号c,class.name班级c

fromstudent,class






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章