SQL常用语句大全.docx

上传人:b****5 文档编号:7597820 上传时间:2023-01-25 格式:DOCX 页数:22 大小:21.81KB
下载 相关 举报
SQL常用语句大全.docx_第1页
第1页 / 共22页
SQL常用语句大全.docx_第2页
第2页 / 共22页
SQL常用语句大全.docx_第3页
第3页 / 共22页
SQL常用语句大全.docx_第4页
第4页 / 共22页
SQL常用语句大全.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

SQL常用语句大全.docx

《SQL常用语句大全.docx》由会员分享,可在线阅读,更多相关《SQL常用语句大全.docx(22页珍藏版)》请在冰豆网上搜索。

SQL常用语句大全.docx

SQL常用语句大全

/**

所有关键字必须要大写.因为代码在执行之前会帮我们自动优化

而优化第一步就是讲所有的关键字转换成大写.

**/

IFEXISTS(SELECT*FROMsys.databasesWHEREname='sql')

BEGIN

PRINT'sql数据库已删除!

'

DROPDATABASEsql;

END

ELSE

BEGIN

--先创建文件夹

EXECxp_cmdshell'mkdirE:

\\Database';

--创建数据库

CREATEDATABASEsql

--设置为主文件组中

ONPRIMARY

--逻辑名称,相当于别名.后期可以通过逻辑名称访问该数据库信息

NAME='sql_DAT',

--文件物理存储地址

FILENAME='E:

\\Database\\sql.MDF',

--默认大小,单位为KB,MB,GB

SIZE=5MB,

--最大上限

MAXSIZE=UNLIMITED,

--文件增长率

FILEGROWTH=10%

),

--次数据文件

NAME='sql_DAT2',

FILENAME='E:

\\Database\\sql.NDF',

SIZE=5MB,

MAXSIZE=UNLIMITED,

FILEGROWTH=10%

LOGON

--日志文件

NAME='sql_LOG',

FILENAME='E:

\\Database\\sql.LDF',

SIZE=1MB,

MAXSIZE=UNLIMITED,

FILEGROWTH=10%

),

--日志文件

NAME='sql_LOG2',

FILENAME='E:

\\Database\\sql2.LDF',

SIZE=1MB,

MAXSIZE=UNLIMITED,

FILEGROWTH=10%

--提示

PRINT'sql数据库已创建!

';

END

GO

--选择数据库

USEsql;

--修改数据库名称

EXECsp_renamedb'sql','new_sql';

--删除数据库

DROPDATABASEsql;

--老师表

IFEXISTS(SELECT*FROMsys.tablesWHEREname='teacher')

BEGIN

PRINT'teacher表已删除!

';

DROPTABLEteacher;

END

ELSE

BEGIN

CREATETABLEteacher

--编号主键约束自动增长序列IDENTITY(起始值,递增量)

idINTPRIMARYKEYIDENTITY(1000,1)NOTNULL,

--姓名唯一约束

nameVARCHAR(100)UNIQUENOTNULL,

--性别检查约束,默认约束

sexNCHAR

(1)CHECK(sex='男'ORsex='女')DEFAULT('男'),

--分数

scoreNUMERIC(7,2)

PRINT'teacher表已创建!

';

END

GO

--删除表

DROPTABLEteacher;

--学生表

IFEXISTS(SELECT*FROMsys.tablesWHEREname='student')

BEGIN

PRINT'student表已删除!

';

DROPTABLEstudent;

END

ELSE

BEGIN

CREATETABLEstudent

idINTPRIMARYKEYIDENTITY(1000,1)NOTNULL,

nameVARCHAR(100)UNIQUENOTNULL,

sexCHAR

(2)CHECK(sexIN('男','女'))DEFAULT('男'),

scoreNUMERIC(7,2),

t_idINTFOREIGNKEYREFERENCESteacher(id)

PRINT'student表已创建!

';

END

GO

--第三方表

CREATETABLEt_s

idINTPRIMARYKEYIDENTITY(1000,1)NOTNULL,

t_idINTFOREIGNKEYREFERENCESteacher(id),

s_idINTFOREIGNKEYREFERENCESstudent(id)

GO

DROPTABLEstudent;

DROPTABLEt_s;

--添加新列

ALTERTABLEstudentADDtINTNOTNULL;

--修改列类型

ALTERTABLEstudentALTERCOLUMNtCHAR;

--删除列

ALTERTABLEstudentDROPCOLUMNt;

--添加约束

ALTERTABLEstudentADDCONSTRAINTch_testCHECK(t<10);

--删除约束

ALTERTABLEstudentDROPCONSTRAINTch_test;

--添加数据

INSERTINTOteacher(name,sex,score)VALUES('独孤求败','男',99999);

INSERTINTOteacher(name,score)VALUES('东方不败',99999);

INSERTINTOteacherVALUES('张三疯',DEFAULT,77777);

INSERTINTOteacherVALUES('张老师',DEFAULT,1);

--多行插入

INSERTINTOteacher(name,sex,score)

SELECT'黄裳','女',99999UNION

SELECT'达摩祖师','男',99999

--修改

UPDATEteacherSETname='东方不败',sex='女',score=88888WHEREname='洞房不败';

--删除

DELETEFROMteacherWHEREid=1005;

DELETEteacherWHEREid=1000;

INSERTINTOstudent(name,sex,score,t_id)

SELECT'令狐冲','男',44444,1005UNION

SELECT'风清扬','男',77777,1005UNION

SELECT'任我行','男',22222,1001UNION

SELECT'任盈盈','女',5555,1004UNION

SELECT'张无忌','男',33333,1003UNION

SELECT'郭靖','男',66666,1003UNION

SELECT'杨过','男',55555,1005UNION

SELECT'小龙女','女',8888,1004UNION

SELECT'乔峰','男',55555,1003UNION

SELECT'段誉','男',44444,1001UNION

SELECT'虚竹','男',77777,1004UNION

SELECT'xibing','男',5,null

--查询所有数据*代表所有列

SELECTid,name,sex,scoreFROMteacher;

SELECT*FROMstudent;

--条件查询

SELECT*FROMstudentWHEREsex='男'ANDscore>=10000;

--DISTINCT消除重复值包括所有列

SELECTDISTINCTname,sexFROMstudent;

--BETWEENAND范围取值

SELECT*FROMstudentWHEREnameBETWEEN'小龙女'AND'杨过';

--LIKE模糊查询

SELECT*FROMstudentWHEREnameLIKE'___';

SELECT*FROMstudentWHEREnameLIKE'%任%';

--查询Null空值

SELECT*FROMstudentWHEREt_idISNULL;

SELECT*FROMstudentWHEREt_idISNOTNULL;

--ORDERBY排序ASC(默认)升序,DESC降序

SELECT*FROMstudentORDERBYscoreDESC

SELECT*FROMstudentORDERBYscoreDESC,idASC;

SELECT*FROMstudentWHEREt_idISNOTNULLORDERBYnameDESC;

--TOP列出前几位

SELECTDISTINCTTOP10PERCENT*FROMstudentORDERBYscoreDESC;

--IN集合取值

SELECT*FROMstudentWHEREidIN(1000,1005,1010,1015);

--Alias别名,多表查询一定要使用别名

SELECTs.idAS'编号',s.name'姓名',s.score战斗力FROMstudents

--GROUPBY分组查询,WHERE-->GROUPBY-->ORDERBY

--HAVING代表分组之后条件筛选

SELECTsex,score,COUNT(*)scFROMstudentsWHEREt_idISNOTNULLGROUPBYsex,scoreHAVINGCOUNT(sex)>=2ORDERBYscore;

--聚合函数

SELECTAVG(score)FROMstudentWHEREt_idISNOTNULL;

SELECTSUM(score)FROMstudent;

SELECTMAX(score)FROMstudent;

SELECTMIN(score)FROMstudent;

SELECTMAX(s.score)'最大值',MIN(s.score)'最小值'FROMstudents

SELECTCOUNT(*)FROMstudent;

--左外连接.以左表作为主表.显示主表中所有的记录,同时显示右表中相关联信息.如果没有则显示null

SELECTt.id,t.name,s.id,s.nameFROMteachertLEFTOUTERJOINstudentsONt.id=s.t_id;

--右连接

SELECT*FROMteachertRIGHTJOINstudentsONt.id=s.t_id;

--全连接

SELECT*FROMteachertFULLJOINstudentsONt.id=s.t_id;

--交叉连接

SELECT*FROMteachertCROSSJOINstudents;

/**

内连接INNERJOIN只会显示两边相关联信息

SELECT*FROMAINNERJOINBON这种形属于SQL1995新标准语法

SELECT*FROMA,BWHERE属于SQL1992旧标准

我们最好是使用新标准,因为每一个关键字都有它特定的作用.

而WHERE只负责筛选条件,ON才是建立关系.

新标准思路更清晰,旧标准更方便.

**/

SELECT*FROMteachertJOINstudentsONt.id=s.t_id;

SELECT*FROMteachert,studentsWHEREt.id=s.t_id;

/**

子查询

将子查询的结果作为上级查询的条件,使用方便

子查询效率比较低,不推荐使用.因为程序每次遇到SELECT就会全表检索一次

*/

SELECT*FROMteachertWHEREt.idIN(

SELECTt_idFROMstudents);

SELECT*FROMteachert,(SELECT*FROMstudent)sWHEREt.id=s.t_id;

/**

EXISTS代替IN

EXISTS如果对方返回true可以显示对应的结果.否则不行执行

*/

SELECT*FROMteachertWHEREEXISTS

(SELECT*FROMstudentsWHEREt.id=s.t_id)

--联合查询.UNION会消除重复值.UNIONALL会显示所有值

SELECTt.sexFROMteachert

UNIONALL

SELECTs.sexFROMstudents;

CREATETABLEarea

--当前ID编号

idINTPRIMARYKEYNOTNULL,

--当前对象名称

nameVARCHAR(100)UNIQUENOTNULL,

--父对象编号

f_idINT

GO

DROPTABLEarea;

INSERTINTOarea

SELECT1,'中国',NULLUNION

SELECT10,'湖北省',1UNION

SELECT11,'湖南省',1UNION

SELECT12,'山东省',1UNION

SELECT100,'武汉市',10UNION

SELECT101,'孝感市',10UNION

SELECT102,'荆州市',10UNION

SELECT103,'长沙市',11UNION

SELECT104,'常德市',11UNION

SELECT105,'济南市',12UNION

SELECT106,'菏泽市',12

/**

自连接

*/

SELECTg.name'国家',s.name'省',m.name'市'FROMareag,areas,areamWHEREg.id=s.f_idANDs.id=m.f_id;

/**

分页

每页5条,共12条,分3页

TOP只有SQLServer,MySQL,DB2,Oracle中没有TOP关键字

那么问题来了,怎么分页?

**/

SELECTTOP5*FROMstudentWHEREidNOTIN

(SELECTTOP((2-1)*5)idFROMstudent);

--获取伪列

SELECTROW_NUMBER()OVER(ORDERBYidASC),*FROMstudent;

--伪列分页

SELECTt2.id,t2.name,t2.sex,t2.score,t2.t_idFROM

(SELECT*FROM

(SELECTROW_NUMBER()OVER(ORDERBYidASC)r,*FROMstudent)t

WHEREt.r<=10)t2

WHEREt2.r>5;

SELECTt.id,t.name,t.sex,t.score,t.t_idFROM

(SELECTROW_NUMBER()OVER(ORDERBYidASC)r,*FROMstudent)t

WHEREt.r<=10ANDt.r>5;

/**

用户只能定义局部变量,局部变量需要使用@符号作为前缀

全局变量是系统指定好的,用户不能自定义.一般是@@作为前缀

SET用户赋予常亮值,SELECT用于赋予变量查询值

PRINT打印数据,SELECT显示数据

*/

DECLARE@testCHAR(5);

SET@test='ABC';

PRINT@test;

PRINTLEN(@test);

DECLARE@nameVARCHAR(100);

SELECT@name=(SELECTnameFROMstudentWHEREid=1000);

PRINT'姓名为:

'+@name;

SELECT'姓名为:

'+@name;

--类型转换

DECLARE@iINT;

SET@i=1111;

PRINT'值为:

'+STR(@i);

PRINT'值为:

'+CONVERT(VARCHAR,@i);

--显示系统当前时间

SELECTGETDATE();

--常用系统常量

PRINT@@ERROR;

PRINT@@IDENTITY;

PRINT@@ROWCOUNT;

--IFELSE分支语句

DECLARE@iINT;

SET@i=2;

IF(@i=1)

BEGIN

PRINT'i=1';

END

ELSEIF(@i=2)

BEGIN

PRINT'i=2';

END

ELSE

BEGIN

PRINT'i=其他';

END

GO

--循环语句

DECLARE@iINT;

SET@i=1;

WHILE(@i<=10)

BEGIN

PRINT@i;

--条件递增

SET@i=@i+1;

END

GO

--CASE

SELECTid,name,sex,score=CASE

WHENscoreBETWEEN0AND10000THEN'0-10000'

WHENscoreBETWEEn10001AND20000THEN'10001-20000'

WHENscoreBETWEEN20001AND30000THEN'20001-30000'

ELSE'高于30000'

END

FROMstudent;

--判断学生的平均战斗力,不过不及45000则每个人都添加100.一直加到满足为止

SELECTAVG(score)FROMstudent;

DECLARE@avgNUMERIC(7,2);

--赋予平均值

SELECT@avg=(SELECTAVG(score)FROMstudent);

PRINT'所有学生平均战斗力为:

'+CONVERT(VARCHAR,@avg);

WHILE(@avg<45000)

BEGIN

--循环加

UPDATEstudentSETscore=score+100;

PRINT'所有人战斗力上升100!

'

--再次获取平均值

SET@avg=@avg+100;

END

--显示最后的结果

SELECT*,score=CASE

WHENscoreBETWEEN0AND5000THEN'孩子,你需要努力!

'

WHENscoreBETWEEN5001AND10000THEN'有进步!

'

WHENscoreBETWEEN10001AND30000THEN'带节奏!

'

WHENscoreBETWEEN30001AND80000THEN'Carry!

'

ELSE'何方神圣!

'

END

FROMstudent;

/**

事务

*/

--开启事务

BEGINTRANSACTION;

DELETEFROMstudent;

--真实修改数据

--COMMITTRANSACTION;

--回滚事务

ROLLBACKTRANSACTION;

--事务转账

DECLARE@aINT,@bINT,@moneyNUMERIC(7,2),@errorINT;

SET@a=1010;

SET@b=1008;

--转账金额

SET@money=100;

--初始化错误编号

SET@error=0;

--开启事务

BEGINTRANSACTION

--查看该用户余额是否足够

IF((SELECTscoreFROMstudentWHEREid=@a)>=@money)

BEGIN

PRINT'-----------转账前-----------';

SELECT*FROMstudent;

PRINT'-----------开始转账-----------';

UPDATEstudentSETscore=score-@moneyWHEREid=@a;

--累计错误编码

SET@error=@error+@@ERROR;

UPDATEstudentSETscore=score+@moneyWHEREid=@b;

SET@error=@error+@@ERROR;

--判断中途是否错误

IF(@error!

=0)

BEGIN

--中途错误

PRINT'-----------转账失败-----------';

--回滚事务

ROLLBACKTRANSACTION;

END

ELSE

BEGIN

PRINT'-----------转账成功-----------';

SELECT*FROMstudent;

END

END

ELSE

BEGIN

--余额不足

PRINT'余额不足,转账失败!

';

ROLLBACKTRANSACTION;

END

GO

/**

索引提高检索速度.但是使用不当反而会降低速度

一个表中只能有一个聚集索引,而主键就是聚集索引.唯一约束是非聚集唯一索引

所以聚集索引我们可以不用管

当某些列频繁操作的时候,或者数据量比较大的时候可以建立索引.

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 小学教育 > 其它课程

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1