常用的SQL例句全部懂了,你的数据库开发所需知识就够用了
..--查看学生表的全部数据
select*fromstudio
--插入一个新的学生信息
insertintostudio(st_name,st_sex,st_age,st_add,st_tel)values("黄兰淇",0,36,'南充','13943943334')
--查看class全部数据
select*fromclass
--向class表增加两条条数据
insertintoclass(cl_class,cl_coding,cl_o_time,cl_remark)values('新电实训班','GXA-ncs-001','2008-03-11','都是很优秀的朋友')
insertintoclass(cl_class,cl_coding,cl_o_time)values('阿坝师专实训班','GXA-ABSZ-001','2008-03-11')
--更新一条的数据条件的重要性
updateclasssetcl_remark='真的是不错'wherecl_id=5
--删除一条数据条件的重要性
deletefromclasswherecl_id=7
--修改列标题
selectcl_idas'班级主键',cl_classas'班级名称'fromclass
select名字=st_namefromstudio
--使用文字串
select'名字是:',st_namefromstudio
--=============条件稍微复杂点的查增删改==============
--主要涉及到orandnotbetweeninlike><=!>!()<=>=isnullisnotnull
--查询cl_id大于1的所有信息
select*fromclasswherecl_id>1
--使用or
select*fromclasswherecl_id<>10orcl_class='百杰一班'
--使用and
select*fromclasswherecl_id<>10andcl_class='百杰一班'
--使用like和%
select*fromclasswherecl_class like'百杰%'
select*fromclasswherecl_remark like'%上午%'
--使用between
select*fromclasswherecl_id between3and5
--使用between配合上not
select*fromclasswherecl_idnotbetween3and5
--使用isnotnull
select*fromclasswherecl_remarkisnotnull
--使用in
select*fromclasswherecl_classin('千星一班','百杰二班')
--=================使用数学运算符======================
--主要涉及到+=*\
--查询Java相关课程分别要上多少周按照每周5天,每天6节课来计算
select'结果'=co_num/5/6fromcoursewhereco_namein('Java基础','Java项目入门')
--==================使用汇总函数========================
--涉及到COUNT SUM AVG MAX MIN
--查询课时数小于50的课程一共有多少门
selectcount(*)fromcoursewhereco_num<50
--查询所有课程一共多少课时
selectsum(co_num)fromcourse
--计算全部课时费,假设每节课50块钱
selectsum(co_num)*50fromcourse
--查询课时最少的课程
selectmin(co_num)fromcourse
--查询课时最多的课程
selectmax(co_num)fromcourse
--查询平均每门课多少课时
selectavg(co_num)fromcourse
--=================使用数学函数=============================
--包括求绝对值函数ABS函数、求圆周率函数PI()、求正玄值SIN()函数、求指数函数EXP()等。
--查询每门课的正弦值
selectsin(co_num)fromcourse
--查询每门课的绝对值
selectabs(co_num)fromcourse
--查询每门课课时数乘以圆周率,具体有什么用我也不知道,反正这好像绝对是8.5杆子都打不到的
selectpi()*co_numfromcourse
--查询每门课的指数
selectexp(co_num)fromcourse
--随机返回5个随机生成的数(返回的是0~1之间的随机float值)
declare@itinyint
set@i=1
while@i<=5
begin
selectrand(@i)as'随机生成的数',@ias'当前值'
set@i=@i+1
end
--返回数字表达式并四舍五入为指定的长度或精度-ROUND
selectround(345.456,-1)as'参数为-1'
,round(345.456,-2,1)as'参数为-2'
,round(345.456,0)as'参数为0'
,round(345.456,1)as'参数为1'
,round(345.456,2)as'参数为2'
--================使用日期函数======================
--DAY()、MONTH()、YEAR()——返回指定日期的天数、月数、年数;
selectday(cl_s_time)as'日'fromclass--返回天
select'月'=month(cl_s_time)fromclass--返回月
select'年'=year(cl_s_time)fromclass--返回年
--DATEADD(datepart,number,date)——在日期上增加给定日期类型的数量;
selectdateadd(yyyy,4,cl_s_time)as'增加4年后'fromclass--datepart-年份
yy、yyyy
selectdateadd(q,2,cl_s_time)as'增加2季度后'fromclass
--datepart-季度
qq、q
selectdateadd(mm,3,cl_s_time)as'增加3月度后'fromclass
--datepart-月份
mm、m
--datepart-每年的某一日
dy、y
--datepart-日期
dd、d
--datepart-星期
wk、ww
--datepart-小时
hh
--datepart-分钟
mi、n
--datepart-秒
ss、s
--datepart-毫秒
ms
--DATEDIFF(datepart,date1,date2)——获取两个日期之间给定的日期类型的数量差(整个函数结果是date2-date1);
selectdatediff(mm,cl_s_time,cl_o_time)as'共持续月'fromclass
--datepart(datepart,date)——在给定日期基础上返回指定日期类型的值(整数);
--其实这个等同于DAY、MONTH、和YEAR函数
selectdatepart(dd,cl_s_time)as'日期'fromclass
--GETDATE()——返回当前日期和时间。我们在设计数据库的时候,通常也可能把他作为默认值
updateclasssetcl_s_time=getdate()wherecl_id=6
select*fromclass
SelectCONVERT(varchar(100),GETDATE(),0):0516200610:57AM
SelectCONVERT(varchar(100),GETDATE(),1):05/16/06
SelectCONVERT(varchar(100),GETDATE(),2):06.05.16
SelectCONVERT(varchar(100),GETDATE(),3):16/05/06
SelectCONVERT(varchar(100),GETDATE(),4):16.05.06
SelectCONVERT(varchar(100),GETDATE(),5):16-05-06
SelectCONVERT(varchar(100),GETDATE(),6):160506
SelectCONVERT(varchar(100),GETDATE(),7):0516,06
SelectCONVERT(varchar(100),GETDATE(),8):10:57:46
SelectCONVERT(varchar(100),GETDATE(),9):0516200610:57:46:827AM
SelectCONVERT(varchar(100),GETDATE(),10):05-16-06
SelectCONVERT(varchar(100),GETDATE(),11):06/05/16
SelectCONVERT(varchar(100),GETDATE(),12):060516
SelectCONVERT(varchar(100),GETDATE(),13):1605200610:57:46:937
SelectCONVERT(varchar(100),GETDATE(),14):10:57:46:967
SelectCONVERT(varchar(100),GETDATE(),20):2006-05-1610:57:47
SelectCONVERT(varchar(100),GETDATE(),21):2006-05-1610:57:47.157
SelectCONVERT(varchar(100),GETDATE(),22):05/16/0610:57:47AM
SelectCONVERT(varchar(100),GETDATE(),23):2006-05-16
SelectCONVERT(varchar(100),GETDATE(),24):10:57:47
SelectCONVERT(varchar(100),GETDATE(),25):2006-05-1610:57:47.250
SelectCONVERT(varchar(100),GETDATE(),100):0516200610:57AM
SelectCONVERT(varchar(100),GETDATE(),101):05/16/2006
SelectCONVERT(varchar(100),GETDATE(),102):2006.05.16
SelectCONVERT(varchar(100),GETDATE(),103):16/05/2006
SelectCONVERT(varchar(100),GETDATE(),104):16.05.2006
SelectCONVERT(varchar(100),GETDATE(),105):16-05-2006
SelectCONVERT(varchar(100),GETDATE(),106):16052006
SelectCONVERT(varchar(100),GETDATE(),107):0516,2006
SelectCONVERT(varchar(100),GETDATE(),108):10:57:49
SelectCONVERT(varchar(100),GETDATE(),109):0516200610:57:49:437AM
SelectCONVERT(varchar(100),GETDATE(),110):05-16-2006
SelectCONVERT(varchar(100),GETDATE(),111):2006/05/16
SelectCONVERT(varchar(100),GETDATE(),112):20060516
SelectCONVERT(varchar(100),GETDATE(),113):1605200610:57:49:513
SelectCONVERT(varchar(100),GETDATE(),114):10:57:49:547
SelectCONVERT(varchar(100),GETDATE(),120):2006-05-1610:57:49
SelectCONVERT(varchar(100),GETDATE(),121):2006-05-1610:57:49.700
SelectCONVERT(varchar(100),GETDATE(),126):2006-05-16T10:57:49.827
SelectCONVERT(varchar(100),GETDATE(),130):18??????????142710:57:49:907AM
SelectCONVERT(varchar(100),GETDATE(),131):18/04/142710:57:49:920AM
--=============使用字符串函数=====================
--字符串链接运算符
select'结果显示'='班级名称是:'+cl_class+',班级编号是:'+cl_codingfromclass
--使用SUBSTRING函数截取字符串
selectsubstring(cl_class,1,4)fromclass
--从字符串的左边开始返回3个字符
selectleft(cl_class,3)fromclass
--同理,返回右边的
selectright(cl_class,3)fromclass
--返回值的字符数
selectlen(cl_class)fromclass
--替换
selectreplace(cl_class,'实训','强化')fromclass
--==============使用系统函数====================
selecthost_id()
--返回工作站标识号
selecthost_name()
--返回工作站所运行的计算机名称
selectdb_id()
selectdb_name()
selectobject_id('Stu_course_ADD')
--通过名称得到这个服务器对象的服务器ID
selectobject_name(151671588)
--同上相反
--=======学云网-天轰穿-www.ixueyun.co m===使用其他子句====学云网-天轰穿-www.ixueyun.com=========
--首先是orderby功能-排序
select*fromstudio orderbyst_name
--多排序条件
select*fromstudio orderbyst_name DESC,st_age DESC,st_sex DESC
--有条件,主要是看下条件和子句的位置
select*fromstudiowherecl_id=1orderbyst_name
--GROUP BY子句功能-分组统计
selectcl_idas'班级编号',count(*)as'人数'fromstudiogroupbycl_id
--按宿舍统计年龄平均值
selectho_idas'宿舍编号',avg(st_age)as'平均年龄'fromstudiogroupbyho_id
--多分组
selectho_idas'宿舍编号',cl_idas'班级编号',avg(st_age)as'平均年龄'fromstudiogroupbyho_id,cl_id
--有条件,主要是看下条件和子句的位置
selectho_idas'宿舍编号',avg(st_age)as'平均年龄'fromstudiowherecl_id=1groupbyho_id
--使用having子句功能-指定组或者聚合的搜索条件,通常与groupby子句一起使用,完成分组查询后再进步筛选
selectho_idas'宿舍编号',avg(st_age)as'平均年龄'fromstudiogroupbyho_id having avg(st_age)>35
--多条件
selectho_idas'宿舍编号',avg(st_age)as'平均年龄'fromstudiogroupbyho_id having avg(st_age)>35andho_id>2
--===========联合查询=======学云网-天轰穿-www.ixueyun.com======
--使用union子句的查询称为联合查询,功能:将两个以上的查询结果集组合为一个单个结果集,该集中包括所有集中的全部行数据
--下面我们尝试将多个查询联合起来
select*fromstudiowherecl_id=1
union
select*fromstudiowhereho_id=1
union
select*fromstudiowherest_age>=30
--下面我们继续利用上面的例题,增加上All看下效果
select*fromstudiowherecl_id=1
unionall
select*fromstudiowhereho_id=1
unionall
select*fromstudiowherest_age>=30
--再继续利用,给他加上排序
select*fromstudiowherecl_id=1
unionall
select*fromstudiowhereho_id=1
unionall
select*fromstudiowherest_age>=30
orderbyst_id
--===========连接查询==================
--连接查询,功能-将多个表中的数据查询出来放在一起
--内连接:使用比较运算符=><....等进行表间某些数据库的比较操作,并列出这些表中与连接条件相匹配的数据行
--等值连接,当然就是用等号了,毛病,这也要问
select*fromstudio inner joinclasson studio.cl_id=class.cl_id
--指明要查询的列(江湖上又称自然连接),并排序
selectst_idas'编号',st_nameas'学生姓名',cl_classas'班级名称'fromstudio inner joinclasson studio.cl_id=class.cl_id orderbyst_id
--使用表别名
selectst.st_nameas'学生姓名',st.cl_idas'班级编号',cl.cl_classas'班级名称'fromstudioasst inner joinclassascl on st.cl_id=cl.cl_id
--不等连接,这个问题很好笑,既然使用等号的是等值连接,那么不等值你说是不是应该是非等于以外的呢?
--下面我们再连接第三个表,看下是怎么搞滴
selectst.st_nameas'学生姓名',st.cl_idas'班级编号',cl.cl_classas'班级名称',ho.ho_codingas'所在宿舍编号'
fromstudioasst inner joinclassascl
on st.cl_id=cl.cl_id
inner join hostelasho
on st.ho_id=ho.ho_id
--我们再给他加个条件看下
--wherest.cl_id>2
--再给他个排序
--orderbyst.st_id
--外连接:
--与内连接不同的是,内连接至少要有一个同属于两个表的行符合连接条件时才会返回行,外连接会返回符合任意条件的行
--他的表有主从之分,他用主表中的每行去匹配从表中的,与内连不同的是,他不会丢弃没有匹配的行,而是填充null给从结果集
--左外连接
selectst.st_idas'学生编号',st.st_nameas'学生姓名',cl.cl_idas'班级编号',cl_classas'班级名称'
fromstudioasst left outer joinclassascl
on st.cl_id=cl.cl_id
wherecl.cl_id>2
--多表
selecttka.te_co_idas'课程安排编号'
,cl.cl_idas'班级编号',cl.cl_classas'班级名称'
,co.co_idas'课程ID',co.co_nameas'课程名称',co.co_numas'课时数'
,te.te_nameas'老师姓名'
fromte_kc_apastka left outer joinclassascl
on tka.cl_id=cl.cl_id
left outer join
courseasco
on tka.co_id=co.co_id
left outer join
teacheraste
on tka.te_id=te.te_id
--====================右外连结=======================
selectst.st_idas'学生编号',st.st_nameas'学生姓名',cl.cl_idas'班级编号',cl_classas'班级名称'
fromstudioasst right outer joinclassascl
on st.cl_id=cl.cl_id
wherecl.cl_id>2
--多表
selecttka.te_co_idas'课程安排编号'
,cl.cl_idas'班级编号',cl.cl_classas'班级名称'
,co.co_idas'课程ID',co.co_nameas'课程名称',co.co_numas'课时数'
,te.te_nameas'老师姓名'
fromte_kc_apastka
right outer joinclassascl
on
tka.cl_id=cl.cl_id
right outer join teacher te
on
tka.te_id=te.te_id
right outer join course co
on
tka.co_id=co.co_id
--========完全连接==============
selectst.st_idas'学生编号',st.st_nameas'学生姓名',cl.cl_idas'班级编号',cl_classas'班级名称'
fromstudioasst full outer joinclassascl
on st.cl_id=cl.cl_id
orderbyst.st_id
--多表
selecttka.te_co_idas'课程安排编号'
,cl.cl_idas'班级编号',cl.cl_classas'班级名称'
,co.co_idas'课程ID',co.co_nameas'课程名称',co.co_numas'课时数'
,te.te_nameas'老师姓名'
fromte_kc_apastka
full outer joinclassascl
on
tka.cl_id=cl.cl_id
full outer join teacher te
on
tka.te_id=te.te_id
full outer join course co
on
tka.co_id=co.co_id
--==========交叉连接================
--该方式在不带where子句时,返回的是两个表中所有数据行的笛卡尔积(第一个表中的行乘以第二个表中的行)
--用学生和班级表做交叉查询
selectst_name,cl_classfromstudio cross joinclass
selectst_name,cl_classfromstudio,class
selectst_name,cl_classfromstudio cross joinclass
--=========自连接===
-----------------先临时创建一个表-------------
create table zone(
idintprimary key identity(1,1)notnull,
z_zone varchar(30),
z_idintreferences zone(id))
--大家试下,这里是否可以给个默认值
select*fromzone
insertintozone(z_zone)values('北京')
insertintozone(z_zone,z_id)values('北京',4)
insertintozone(z_zone)values('四川')
insertintozone(z_zone,z_id)values('成都',6)
insertintozone(z_zone,z_id)values('绵阳',6)
insertintozone(z_zone)values('江苏')
insertintozone(z_zone,z_id)values('南京',10)
insertintozone(z_zone,z_id)values('苏州',10)
insertintozone(z_zone,z_id)values('无锡',10)
insertintozone(z_zone,z_id)values('常州',10)
----------------------------------------------
--看下自连接的一般用处
selecta.z_zone,b.z_zonefromzoneasa inner join zoneasb on a.z_id=b.id
--扩展应用下
selectb.z_zone,count(a.z_zone)as'辖区数'fromzoneasa inner join zoneasb on a.z_id=b.idgroupbyb.z_zone
--简单说就是自己连接自己,换言之对同一个表进行连接操作
selecta.st_name,a.st_add,b.st_name,b.st_addfromstudioasa inner join studioasb on a.st_add=b.st_add
--我们发现有人等于自己,那么增加一个条件
selecta.st_name,a.st_add,b.st_name,b.st_addfromstudioasa inner join studioasb on a.st_add=b.st_addanda.st_name!=b.st_name
--====学云网-天轰穿-www.ixueyun.com==子查询============
--在一个SQL语句中镶入另一个SQL语句教镶套查询,而被镶入的这个SQL语句就被江湖人称子查询。是处理多表操作的附加方法
--子查询也称内部查询,而包含子查询的Select语句被诚为外部查询,子查询自身可以包括一个或者多个子查询,也可以镶套任意数量的子查询
--使用in的子查询
select*fromstudiowherecl_idin(selectcl_idfromclasswherecl_id>2)
--使用notin
select*fromstudiowherecl_idnotin(selectcl_idfromclasswherecl_id>2)
--使用比较运算符的子查询--any表示子查询中任意的值all表示子查询中的每个值
--使用any
select*fromclasswherecl_id>any(selectcl_idfromstudiowherest_age>30)
--使用all
select*fromclasswherecl_id>all(selectcl_idfromstudiowherest_age>30)
--============一个分页的SQL语句========
selecttop3*fromstudio
wherest_id>all(selecttop3st_idfromstudio orderbyst_id)
orderbyst_id
--使用exists,该关键字引入一个子查询的时候基本上是对数据进行一次是否存在的测试
--我们查询那些人所在的班级是编号为1的
select*fromstudiowhereexists(selectcl_idfromclasswherestudio.cl_id=class.cl_idandclass.cl_id=1)
--使用notexists
select*fromstudiowherenotexists(select*fromclasswherestudio.cl_id=class.cl_idandclass.cl_id=1)orderbyst_id
--基于查询生成新的表
selectst_nameintoclass_3fromstudiowherecl_id=3
--将数据批量插入一个表中
insertintoclass_3selectst_namefromstudiowherecl_id=4
-----------------------sql编程--------------
declare@maxint;
--申明一个变量@max
set@max=1;
--为变量@max赋值
while@max<10
--如果@max小于10就进入循环
begin
set@max=@max+1;--每次循环就给@max加1
print@max;
--打印当前@max的值
end
print'终于循环完了';