2024年9月sql教程sql基本语句大全(SQL数据库语句大全)
⑴sql教程sql基本语句大全(SQL数据库语句大全
⑵SQL数据库语句大全
⑶SQL数据库语句大全:
⑷选择:select*fromtablewhere范围
⑸插入:insertintotable(field,field)values(value,value)
⑹删除:deletefromtablewhere范围
⑺更新:updatetablesetfield=valuewhere范围
⑻排序:select*fromtableorderbyfield,field
⑼总数:selectcountastotalcountfromtable
⑽求和:selectsum(field)assumvaluefromtable
⑾几个高级查询运算词:
⑿A、UNION运算符
⒀UNION运算符通过组合其他两个结果表(例如TABLE和TABLE)并消去表中任何重复行而派生出一个结果表。当ALL随UNION一起使用时(即UNIONALL),不消除重复行。两种情况下,派生表的每一行不是来自TABLE就是来自TABLE。
⒁B、EXCEPT运算符
⒂EXCEPT运算符通过包括所有在TABLE中但不在TABLE中的行并消除所有重复行而派生出一个结果表。当ALL随EXCEPT一起使用时(EXCEPTALL),不消除重复行。
⒃C、INTERSECT运算符
⒄INTERSECT运算符通过只包括TABLE和TABLE中都有的行并消除所有重复行而派生出一个结果表。当ALL随INTERSECT一起使用时(INTERSECTALL),不消除重复行。
⒅个MySQL常用基本SQL语句
⒆在学习SQL语句之前,首先需要区分几个概念,我们常说的数据库是指数据库软件,例如MySQL、Oracle、SQLServer等,而本文提到的数据库是指数据库软件中的一个个用于存储数据的容器。
⒇在MySQL中,数据库称为database,数据表称为table,一个数据库软件中有多个数据库(databases,每个数据库中又可以有多个数据表(tables,最终,数据是存储在数据表中。
⒈数据库和数据表之间的关系可以用下面这个图来表示,对于一个数据库来说,有多个数据表。
⒉在正式开始写SQL语句之前,需要说明两点。
⒊这里通过MySQLWorkbench来写SQL代码,在Workbench中,执行一条SQL语句的方式有两种。
⒋了解了这之后,接下来介绍一些常见的命令,分两部分:数据库常用命令和数据表常用命令。
⒌创建一个名为Testdb的数据库。
⒍创建数据库并指定编码格式
⒎有些时候,为了防止中文乱码,创建数据库的时候需要指定编码格式。
⒏使用mydb这个数据库,或者进入mydb这个数据库。
⒐删除Testdb这个数据库。
⒑进入某个数据库之后,想查看有哪些数据表,SQL语句为:
⒒mydb是一个新建的数据库,所以自然是没有数据表。
⒓建表SQL语句格式为:
⒔说明:每个字段以逗号分隔,最后一个字段不加逗号。
⒕例如,给定一个学员信息表,如下表所示。
⒖根据以上表格,建表SQL语句如下。
⒗以上语句中,primarykey表示主键,意思是这个字段作为记录的唯一标识,就像每个人的身份证号,都是唯一确定的。
⒘查看表结构的SQL命令为:
⒙执行该命令会显示表stuinfo的基本结构,例如有哪些字段,每个字段是什么类型,谁是主键等。
⒚修改数据表通过drop子句进行,比如,建完表后,想增加一个字段,SQL语句的格式为:
⒛想在指定位置增加一个字段,例如,在某个字段后增加一个字段,SQL语句的格式为:
如果在某个字段之前增加字段,用before即可。
例如,在字段age后增加一个字段major(专业,SQL语句为:
执行这个命令,再通过describe查看表结构,会发现表中多了一个字段major。
如果要删除major这个字段,通过drop子句,SQL语句为:
重命名表通过alter+rename来实现,SQL语句格式为:
这里为了不影响之前创建的表,我们创建一个新表,SQL语句如下。
以上创建一个名为stuInfoTest的表,现在想将它的名称改成stuinfotest,SQL语句为:
删除数据表通过drop进行,SQL语句格式为:
例如,删除数据表stuinfotest,SQL语句为:
此时的表stuinfo是空的,没有数据,我们要向表中插入记录。
插入记录通过insertinto进行,SQL语句格式为:
例如,向表stuinfo插入一条记录,SQL语句为:
注意:上方是一条SQL语句,为了可读性换行,记住一条SQL语句默认以分号结尾。
如果需要一次性插入多条记录,SQL语句格式为:
例如,向表stuinfo再插入两条记录,SQL语句为:
注意:如果设置了主键,插入记录的主键字段是不能重复的,也就是不能插入重复的记录。
作业:大家可以按照上述方法将上面的学员信息表中的所有记录都插入表stuinfo中。
有了数据之后,就可以查询记录了,查询记录通过select子句进行。
例如,想查询表stuinfo中的所有记录,SQL语句为:
执行之后,就可以看到表stuinfo中的所有记录了。
如果想查询符合某个条件的记录,就要用到where子句了,SQL格式为:
例如,想查询stuid为的记录,SQL语句为:
删除记录通过delete子句进行,SQL语句格式为:
例如,想删除stuid为的记录,SQL语句为:
修改记录通过update子句进行,update就是更新的意思,SQL语句格式为:
例如,想将学号(stuid为的记录的姓名(stuname更新为Jack,SQL语句为:
以上,就是MySQL中的基本SQL语句。
零基础如何学习数据分析?查看下方专栏。
/*语法:select查询列表from表名特点:.查询列表可以是:表中的字段、常量值、表达式、函数.查询的结果是虚拟的表格*/--注意查询之前,要打开指定的库,usemyemployees;USEmyemployees;
SELECTlast_nameFROMemployees;
SELECTlast_name,salary,emailFROMemployees;
SELECT*FROMemployees;--顺序和表中的字段一样
SELECT;SELECT’JOIN’;
SELECTVERSION();--..
/*好处:.便于理解.如果要查询的字段有重名的情况,使用别名可以区分开*/
SELECT*AS结果haha;SELECTlast_nameAS姓,first_nameAS名FROMemployees;
SELECT*结果haha;SELECTlast_name姓,first_name名FROMemployees;
--SELECTsalaryASOUTputFROMemployees;会报错--因为out是关键词,所以,如果别名里面有关键词的,请加双引号,或者单引号。SELECTsalaryAS“OUTput“FROMemployees;
SELECTDISTINCTdepartment_idFROMemployees;
/*.+号只有一个功能:运算符。select+;这个做加法.SELECTNULL+;--只要一方为NULL,则结果肯定是NULL。*/
--错误?:SELECTlast_name+first_nameAS姓名FROMemployees;SELECTCONCAT(last_name,first_name)AS姓名FROMemployees;
DESCdepartments;SELECT*FROMdepartments;
SELECTDISTINCTjob_idFROMemployees;
--mission_pct有些值是NULL--因为NULL和谁拼接都是NULL--所以下面的结果可能为NULLSELECTCONCAT(employee_id,’,’,first_name,’,’,last_name,“,“,mission_pct)AS“OUT_PUT“FROMemployees;
SELECTIFNULL(mission_pct,)AS奖金率,mission_pctFROMemployees;
--上面题的做法:SELECTCONCAT(employee_id,’,’,first_name,’,’,last_name,“,“,IFNULL(mission_pct,))AS“OUT_PUT“FROMemployees;
/*语法:select查询列表from表名where筛选条件;查询列表可以是:表中的字段、常量值、表达式、函数
分类:一。按条件表达式筛选条件运算符:》《=!=或者《》》=《=二。按逻辑表达式筛选逻辑运算符:z作用:连接条件表达式&&||!或者andornot三。模糊查询likeBETWEENANDinisnull或者isnotnull*/
SELECT*FROMemployeesWHEREsalary》;
SELECTemployee_id,department_idFROMemployeesWHEREdepartment_id《》;
SELECTlast_name,salary,mission_pctFROMemployeesWHEREsalary》=ANDsalary《=;
SELECT*FROMemployeesWHEREdepartment_id《ordepartment_id》orsalary》;--或者写成SELECT*FROMemployeesWHERENOt(department_id》=ANDdepartment_id《=)orsalary》;
/*like特点:一般和通配符搭配使用,通配符%:任意多个字符,包含个字符_:占一个字符*/
--%代表通配符SELECT*FROMemployeesWHERElast_nameLIKE’%a%’;
SELECTlast_name,salaryFROMemployeesWHERElast_nameLIKE’__n_l%’;
--转义字符SELECTlast_nameFROMemployeesWHERElast_nameLIKE’_%’;--或者告诉系统%’ESCAPE’$’;
/*.使用betweenand可以提高语句简洁度.包好临界值.前小后大,不能颠倒顺序*/
SELECT*FROMemployeesWHEREemployee_id》=ANDemployee_id《=;--或者SELECT*FROMemployeesWHEREemployee_idBETWEENAND;
/*含义:判断某字段的值是否属于in列表中的某一项特点:.in比or简洁.in列表的值类型必须是相同的或者兼容的.in列表的值不能使用通配符*/
SELECTlast_name,job_idFROMemployeesWHEREjob_id=’IT_PROG’orjob_id=’AD_PRES’orjob_id=’AD_VP’;--或者SELECTlast_name,job_idFROMemployeesWHEREjob_idIN(’IT_PROG’,’AD_PRES’,’AD_VP’);
/*=或者《》不能用于判断null值,所以只能用isnull和isnotnull*/
SELECTlast_name,mission_pctFROMemployeesWHEREmission_pctisnull;
SELECTlast_name,mission_pctFROMemployeesWHEREmission_pctisnotnull;
--安全等于作用:判断是否等于,包括null,如果等于返回true。可读性较低--isnull:仅仅判断null值,可读性较高。
--直接写=是不行的SELECTlast_name,mission_pctFROMemployeesWHEREmission_pct《=》null;
SELECT*FROMemployeesWHEREsalary《=》;
--注意这个IFNULLSELECTlast_name,department_id,salary(+IFNULL(mission_pct,))as年薪FROMemployeesWHEREemployee_id=;
SELECTsalary,last_nameFROMemployeesWHEREmission_pctISNULLANDsalary《;
SELECT*FROMemployeesWHEREjob_id《》’IT’ORsalary=;
DESCdepartments;
SELECTDISTINCTlocation_idFROMdepartments;
SELECT*FROMemployeesWHEREmission_pctlike’%%’andlast_namelike’%%’;--mission_pct有字段有null,and之后就是null了
搜集SQL常用的操作语句
结构化查询语言(StructuredQueryLanguage)简称SQL(发音:/?eskju??el/“S-Q-L“),是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。
INSERTINTO语句:
viewplaincopy;
INSERTINTOPersonsVALUES(’Gates’,’Bill’,’Xuanwumen’,’Beijing’);
在指定的列中插入数据
viewplaincopy;
INSERTINTOPersons(LastName,Address)VALUES(’Wilson’,’Champs-Elysees’);
SQLSELECTINTO语句可用于创建表的备份复件
在建表时复制所有数据
viewplaincopy;
createtableuserinfo_newasselect*fromuserinfo;
在建表时复制部分数据
viewplaincopy;
createtableuserinfo_newasselectid,usernamefromuserinfo;
在添加时复制所有数据
viewplaincopy;
insertintouserinfo_newselect*fromuserinfo;
在添加时复制部分数据
viewplaincopy;
insertintouserinfo_new(id,username)selectid,usernamefromuserinfo;
viewplaincopy;
updateuserinfosetuserpwd=’’,email=’’;
viewplaincopy;
updateuserinfosetuserpwd=’’whereusername=’xxx’;
viewplain?copy;
dalete?from?userinfo;
viewplain?copy;
delete?from?userinfo?where?username=’yyy’;
viewplaincopy;
select*fromusers;
viewplaincopy;
selectusername,salaryfromusers;
SELECTDISTINCT语句
从pany“列中仅选取唯一不同的值,需要使用SELECTDISTINCT语句:
viewplaincopy;
SELECTDISTINCTpanyFROMOrders;
SQL数据库语句大全
经典SQL语句大全下列语句部分是Mssql语句,不可以在aess中使用。SQL分类:DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE)DML—数据操纵语言(SELECT,DELETE,UPDATE,INSERT)DCL—数据控制语言(GRANT,REVOKE,MIT,ROLLBACK)首先,简要介绍基础语句:、说明:创建数据库CREATEDATABASEdatabase-name、说明:删除数据库dropdatabasedbname、说明:备份sqlserver---创建备份数据的deviceUSEmasterEXECsp_addumpdevice’disk’,’testBack’,’c:mssqlbackupMyNwind_.dat’---开始备份BACKUPDATABASEpubsTOtestBack、说明:创建新表createtabletabname(coltype,..)根据已有的表创建新表:A:createtabletab_newliketab_old(使用旧表创建新表)B:createtabletab_newasselectcol,col…fromtab_olddefinitiononly、说明:删除新表:droptabletabname、说明:增加一个列:Altertabletabnameaddcolumncoltype注:列增加后将不能删除。DB中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。、说明:添加主键:Altertabletabnameaddprimarykey(col)说明:删除主键:Altertabletabnamedropprimarykey(col)、说明:创建索引:createindexidxnameontabname(col….)删除索引:dropindexidxname注:索引是不可更改的,想更改必须删除重新建。、说明:创建视图:createviewviewnameasselectstatement删除视图:dropviewviewname、说明:几个简单的基本的sql语句选择:select*fromtablewhere范围插入:insertintotable(field,field)values(value,value)删除:deletefromtablewhere范围更新:updatetablesetfield=valuewhere范围查找:select*fromtablewherefieldlike’%value%’---like的语法很精妙,查资料!排序:select*fromtableorderbyfield,field总数:selectcount*astotalcountfromtable求和:selectsum(field)assumvaluefromtable平均:selectavg(field)asavgvaluefromtable最大:selectmax(field)asmaxvaluefromtable最小:selectmin(field)asminvaluefromtable、说明:几个高级查询运算词A:UNION运算符UNION运算符通过组合其他两个结果表(例如TABLE和TABLE并消去表中任何重复行而派生出一个结果表。当ALL随UNION一起使用时(即UNIONALL,不消除重复行。两种情况下,派生表的每一行不是来自TABLE就是来自TABLE。B:EXCEPT运算符EXCEPT运算符通过包括所有在TABLE中但不在TABLE中的行并消除所有重复行而派生出一个结果表。当ALL随EXCEPT一起使用时(EXCEPTALL),不消除重复行。C:INTERSECT运算符INTERSECT运算符通过只包括TABLE和TABLE中都有的行并消除所有重复行而派生出一个结果表。当ALL随INTERSECT一起使用时(INTERSECTALL),不消除重复行。注:使用运算词的几个查询结果行必须是一致的。、说明:使用外连接A、leftouterjoin:左外连接(左连接:结果集几包括连接表的匹配行,也包括左连接表的所有行。SQL:selecta.a,a.b,a.c,b.c,b.d,b.ffromaLEFTOUTJOINbONa.a=b.cB:rightouterjoin:右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。C:fullouterjoin:全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。其次,大家来看一些不错的sql语句、说明:复制表(只复制结构,源表名:a新表名:b)(Aess可用)法一:select*intobfromawhere《》法二:selecttop*intobfroma、说明:拷贝表(拷贝数据,源表名:a目标表名:b)(Aess可用)insertintob(a,b,c)selectd,e,ffromb;、说明:跨数据库之间表的拷贝(具体数据使用绝对路径)(Aess可用)insertintob(a,b,c)selectd,e,ffrombin‘具体数据库’where条件例子:..frombin’“&Server.MapPath(“.“)&“data.mdb“&“’where..、说明:子查询(表名:a表名:b)selecta,b,cfromawhereaIN(selectdfromb)或者:selecta,b,cfromawhereaIN(,,)、说明:显示文章、提交人和最后回复时间selecta.title,a.username,b.adddatefromtablea,(selectmax(adddate)adddatefromtablewheretable.title=a.title)b、说明:外连接查询(表名:a表名:b)selecta.a,a.b,a.c,b.c,b.d,b.ffromaLEFTOUTJOINbONa.a=b.c、说明:在线视图查询(表名:a)select*from(SELECTa,b,cFROMa)Twheret.a》;、说明:between的用法,between限制查询数据范围时包括了边界值,notbetween不包括select*fromtablewheretimebetweentimeandtimeselecta,b,c,fromtablewhereanotbetween数值and数值、说明:in的使用方法select*fromtablewhereain(‘值’,’值’,’值’,’值’)、说明:两张关联表,删除主表中已经在副表中没有的信息deletefromtablewherenotexists(select*fromtablewheretable.field=table.field)、说明:四表联查问题:select*fromaleftinnerjoinbona.a=b.brightinnerjoincona.a=c.cinnerjoindona.a=d.dwhere.....、说明:日程安排提前五分钟提醒SQL:select*from日程安排wheredatediff(’minute’,f开始时间,getdate())》、说明:一条sql语句搞定数据库分页selecttopb.*from(selecttop主键字段,排序字段from表名orderby排序字段desc)a,表名bwhereb.主键字段=a.主键字段orderbya.排序字段、说明:前条记录selecttop*formtablewhere范围、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.)selecta,b,cfromtablenametawherea=(selectmax(a)fromtablenametbwheretb.b=ta.b)、说明:包括所有在TableA中但不在TableB和TableC中的行并消除所有重复行而派生出一个结果表(selectafromtableA)except(selectafromtableB)except(selectafromtableC)、说明:随机取出条数据selecttop*fromtablenameorderbynewid()、说明:随机选择记录selectnewid()、说明:删除重复记录Deletefromtablenamewhereidnotin(selectmax(id)fromtablenamegroupbycol,col,...)、说明:列出数据库里所有的表名selectnamefromsysobjectswheretype=’U’、说明:列出表里的所有的selectnamefromsyscolumnswhereid=object_id(’TableName’)、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select中的case。selecttype,sum(casevenderwhen’A’thenpcselseend),sum(casevenderwhen’C’thenpcselseend),sum(casevenderwhen’B’thenpcselseend)FROMtablenamegroupbytype显示结果:typevenderpcs电脑A电脑A光盘B光盘A手机B手机C、说明:初始化表tableTRUNCATETABLEtable、说明:选择从到的记录selecttop*from(selecttop*fromtableorderbyidasc)table_别名orderbyiddesc随机选择数据库记录的方法(使用Randomize函数,通过SQL语句实现对存储在数据库中的数据来说,随机数特性能给出上面的效果,但它们可能太慢了些。你不能要求ASP“找个随机数”然后打印出来。实际上常见的解决方案是建立如下所示的循环:RandomizeRNumber=Int(Rnd*)+WhileNotobjRec.EOFIfobjRec(“ID“)=RNumberTHEN...这里是执行脚本...endifobjRec.MoveNextWend这很容易理解。首先,你取出到范围之内的一个随机数(假设就是数据库内记录的总数。然后,你遍历每一记录来测试ID的值、检查其是否匹配RNumber。满足条件的话就执行由THEN关键字开始的那一块代码。假如你的RNumber等于,那么要循环一遍数据库花的时间可就长了。虽然这个数字看起来大了些,但相比更为稳固的企业解决方案这还是个小型数据库了,后者通常在一个数据库内就包含了成千上万条记录。这时候不就死定了?采用SQL,你就可以很快地找出准确的记录并且打开一个只包含该记录的recordset,如下所示:RandomizeRNumber=Int(Rnd*)+SQL=“SELECT*FROMCustomersWHEREID=“&RNumbersetobjRec=ObjConn.Execute(SQL)Response.WriteRNumber&“=“&objRec(“ID“)&““&objRec(“c_email“)不必写出RNumber和ID,你只需要检查匹配情况即可。只要你对以上代码的工作满意,你自可按需操作“随机”记录。Recordset没有包含其他内容,因此你很快就能找到你需要的记录这样就大大降低了处理时间。再谈随机数现在你下定决心要榨干Random函数的最后一滴油,那么你可能会一次取出多条随机记录或者想采用一定随机范围内的记录。把上面的标准Random示例扩展一下就可以用SQL应对上面两种情况了。为了取出几条随机选择的记录并存放在同一recordset内,你可以存储三个随机数,然后查询数据库获得匹配这些数字的记录:SQL=“SELECT*FROMCustomersWHEREID=“&RNumber&“ORID=“&RNumber&“ORID=“&RNumber假如你想选出条记录(也许是每次页面装载时的条链接的列表,你可以用BETWEEN或者数学等式选出第一条记录和适当数量的递增记录。这一操作可以通过好几种方式来完成,但是SELECT语句只显示一种可能(这里的ID是自动生成的号码:SQL=“SELECT*FROMCustomersWHEREIDBETWEEN“&RNumber&“AND“&RNumber&“+“注意:以上代码的执行目的不是检查数据库内是否有条并发记录。随机读取若干条记录,测试过Aess语法:SELECTtop*From表名ORDERBYRnd(id)Sqlserver:selecttopn*from表名orderbynewid()mysqlselect*From表名OrderByrand()LimitnAess左连接语法(最近开发要用左连接,Aess帮助什么都没有,网上没有Aess的SQL说明,只有自己测试,现在记下以备后查)语法selecttable.fd,table,fd,table.fdFromtableleftjointableontable.fd,table.fdwhere...使用SQL语句用...代替过长的字符串显示语法:SQL数据库:selectcasewhenlen(field)》thenleft(field,)+’...’elsefieldendasnews_name,news_idfromtablenameAess数据库:SELECTiif(len(field)》,left(field,)+’...’,field)FROMtablename;Conn.Execute说明Execute方法该方法用于执行SQL语句。根据SQL语句执行后是否返回记录集,该方法的使用格式分为以下两种:.执行SQL查询语句时,将返回查询得到的记录集。用法为:Set对象变量名=连接对象.Execute(“SQL查询语言“)Execute方法调用后,会自动创建记录集对象,并将查询结果存储在该记录对象中,通过Set方法,将记录集赋给指定的对象保存,以后对象变量就代表了该记录集对象。.执行SQL的操作性语言时,没有记录集的返回。此时用法为:连接对象.Execute“SQL操作性语句“·RecordAffected为可选项,此出可放置一个变量,SQL语句执行后,所生效的记录数会自动保存到该变量中。通过访问该变量,就可知道SQL语句队多少条记录进行了操作。·Option可选项,该参数的取值通常为adCMDText,它用于告诉ADO,应该将Execute方法之后的第一个字符解释为命令文本。通过指定该参数,可使执行更高效。·BeginTrans、RollbackTrans、mitTrans方法这三个方法是连接对象提供的用于事务处理的方法。BeginTrans用于开始一个事物;RollbackTrans用于回滚事务;mitTrans用于提交所有的事务处理结果,即确认事务的处理。事务处理可以将一组操作视为一个整体,只有全部语句都成功执行后,事务处理才算成功;若其中有一个语句执行失败,则整个处理就算失败,并恢复到处里前的状态。BeginTrans和mitTrans用于标记事务的开始和结束,在这两个之间的语句,就是作为事务处理的语句。判断事务处理是否成功,可通过连接对象的Error集合来实现,若Error集合的成员个数不为,则说明有错误发生,事务处理失败。Error集合中的每一个Error对象,代表一个错误信息。SQL语句大全精要//:DELETE语句DELETE语句:用于创建一个删除查询,可从列在FROM子句之中的一个或多个表中删除记录,且该子句满足WHERE子句中的条件,可以使用DELETE删除多个记录。语法:DELETEFROMtableWHEREcriteria语法:DELETE*FROMtableWHEREcriteria=’查询的字’说明:table参数用于指定从其中删除记录的表的名称。criteria参数为一个表达式,用于指定哪些记录应该被删除的表达式。可以使用Execute方法与一个DROP语句从数据库中放弃整个表。不过,若用这种方法删除表,将会失去表的结构。不同的是当使用DELETE,只有数据会被删除;表的结构以及表的所有属性仍然保留,例如字段属性及索引。UPDATE有关UPDATE,急!!!!!!!!!!!在ORACLE数据库中表A(ID,FIRSTNAME,LASTNAME)表B(ID,LASTNAME)表A中原来ID,FIRSTNAME两个字段的数据是完整的表B中原来ID,LASTNAME两个字段的数据是完整的现在要把表B中的LASTNAME字段的相应的数据填入到A表中LASTNAME相应的位置。两个表中的ID字段是相互关联的。先谢谢了!!!!updateaseta.lastname=(selectb.lastnamefrombwherea.id=b.id)掌握SQL四条最基本的数据操作语句:Insert,Select,Update和Delete。练掌握SQL是数据库用户的宝贵财富。在本文中,我们将引导你掌握四条最基本的数据操作语句—SQL的核心功能—来依次介绍比较操作符、选择断言以及三值逻辑。当你完成这些学习后,显然你已经开始算是精通SQL了。在我们开始之前,先使用CREATETABLE语句来创建一个表(如图所示。DDL语句对数据库对象如表、列和视进行定义。它们并不对表中的行进行处理,这是因为DDL语句并不处理数据库中实际的数据。这些工作由另一类SQL语句—数据操作语言(DML语句进行处理。SQL中有四种基本的DML操作:INSERT,SELECT,UPDATE和DELETE。由于这是大多数SQL用户经常用到的,我们有必要在此对它们进行一一说明。在图中我们给出了一个名为EMPLOYEES的表。其中的每一行对应一个特定的雇员记录。请熟悉这张表,我们在后面的例子中将要用到它。
SQL语句的基本语法一
一SELECT语句的完整语法为SELECTJOINtableONtablefieldparisiontablefield用左连接来建立外部连接在表达式的左边的表会显示其所有的数据例不管有没有定货量返回所有商品SELECTProductNameOrderIDFROMProductsLEFTJOINOrdersONProductsPrductsID=OrdersProductIDlishixinzhi/Article/program/Oracle//
数据库常用sql语句有哪些
数据库常用sql语句
Student(S#,Sname,Sage,Ssex)学生表
Course(C#,ame,T#)课程表
SC(S#,C#,score)成绩表
Teacher(T#,Tname)教师表
查询“”课程比“”课程成绩高的所有学生的学号;
selecta.S#from(selects#,scorefromSCwhereC#=’’)a,(selects#,score
fromSCwhereC#=’’)b
wherea.score》b.scoreanda.s#=b.s#;
查询平均成绩大于分的同学的学号和平均成绩;
selectS#,avg(score)
groupbyS#havingavg(score)》;
查询所有同学的学号、姓名、选课数、总成绩;
selectStudent.S#,Student.Sname,count(SC.C#),sum(score)
fromStudentleftOuterjoinSConStudent.S#=SC.S#
groupbyStudent.S#,Sname
查询姓“李”的老师的个数;
selectcount(distinct(Tname))
fromTeacher
whereTnamelike’李%’;
查询没学过“叶平”老师课的同学的学号、姓名;
selectStudent.S#,Student.Sname
fromStudent
whereS#notin(selectdistinct(SC.S#)fromSC,Course,TeacherwhereSC.C#=Course.C#andTeacher.T#=Course.T#andTeacher.Tname=’叶平’);
查询学过“”并且也学过编号“”课程的同学的学号、姓名;
selectStudent.S#,Student.SnamefromStudent,SCwhereStudent.S#=SC.S#andSC.C#=’’andexists(Select*fromSCasSC_whereSC_.S#=SC.S#andSC_.C#=’’);
查询学过“叶平”老师所教的所有课的同学的学号、姓名;
selectS#,Sname
fromStudent
whereS#in(selectS#fromSC,Course,TeacherwhereSC.C#=Course.C#andTeacher.T#=Course.T#andTeacher.Tname=’叶平’groupbyS#havingcount(SC.C#)=(selectcount(C#)fromCourse,TeacherwhereTeacher.T#=Course.T#andTname=’叶平’));
查询课程编号“”的成绩比课程编号“”课程低的所有同学的学号、姓名;
SelectS#,Snamefrom(selectStudent.S#,Student.Sname,score,(selectscorefromSCSC_whereSC_.S#=Student.S#andSC_.C#=’’)score
fromStudent,SCwhereStudent.S#=SC.S#andC#=’’)S_wherescore《score;
查询所有课程成绩小于分的同学的学号、姓名;
selectS#,Sname
fromStudent
whereS#notin(selectStudent.S#fromStudent,SCwhereS.S#=SC.S#andscore》);
查询没有学全所有课的同学的学号、姓名;
selectStudent.S#,Student.Sname
fromStudent,SC
whereStudent.S#=SC.S#groupbyStudent.S#,Student.Snamehavingcount(C#)《(selectcount(C#)fromCourse);
查询至少有一门课与学号为“”的同学所学相同的同学的学号和姓名;
selectS#,SnamefromStudent,SCwhereStudent.S#=SC.S#andC#inselectC#fromSCwhereS#=’’;
查询至少学过学号为“”同学所有一门课的其他同学学号和姓名;
selectdistinctSC.S#,Sname
fromStudent,SC
whereStudent.S#=SC.S#andC#in(selectC#fromSCwhereS#=’’);
把“SC”表中“叶平”老师教的课的成绩都更改为此课程的平均成绩;
SCsetscore=(selectavg(SC_.score)
whereSC_.C#=SC.C#)fromCourse,TeacherwhereCourse.C#=SC.C#andCourse.T#=Teacher.T#andTeacher.Tname=’叶平’);
查询和“”号的同学学习的课程完全相同的其他同学学号和姓名;
selectS#fromSCwhereC#in(selectC#fromSCwhereS#=’’)
groupbyS#havingcount(*)=(selectcount(*)fromSCwhereS#=’’);
删除学习“叶平”老师课的SC表记录;
fromcourse,Teacher
whereCourse.C#=SC.C#andCourse.T#=Teacher.T#andTname=’叶平’;
向SC表中插入一些记录,这些记录要求符合以下条件:没有上过编号“”课程的同学学号、、
InsertSCselectS#,’’,(Selectavg(score)
fromSCwhereC#=’’)fromStudentwhereS#notin(SelectS#fromSCwhereC#=’’);
按平均成绩从高到低显示所有学生的“数据库”、“企业管理”、“英语”三门的课程成绩,按如下形式显示:学生ID,,数据库,企业管理,英语,有效课程数,有效平均分
SELECTS#as学生ID
,(SELECTscoreFROMSCWHERESC.S#=t.S#ANDC#=’’)AS数据库
,(SELECTscoreFROMSCWHERESC.S#=t.S#ANDC#=’’)AS企业管理
,(SELECTscoreFROMSCWHERESC.S#=t.S#ANDC#=’’)AS英语
,COUNT(*)AS有效课程数,AVG(t.score)AS平均成绩
ORDERBYavg(t.score)
查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分
SELECTL.C#As课程ID,L.scoreAS最高分,R.scoreAS最低分
FROMSCL,SCASR
WHEREL.C#=R.C#and
L.score=(SELECTMAX(IL.score)
FROMSCASIL,StudentASIM
WHEREL.C#=IL.C#andIM.S#=IL.S#
GROUPBYIL.C#)
R.Score=(SELECTMIN(IR.score)
FROMSCASIR
WHERER.C#=IR.C#
GROUPBYIR.C#
按各科平均成绩从低到高和及格率的百分数从高到低顺序
SELECTt.C#AS课程号,max(course.ame)AS课程名,isnull(AVG(score),)AS平均成绩
,*SUM(CASEWHENisnull(score,)》=THENELSEEND)/COUNT(*)AS及格百分数
FROMSCT,Course
wheret.C#=course.C#
GROUPBYt.C#
ORDERBY*SUM(CASEWHENisnull(score,)》=THENELSEEND)/COUNT(*)DESC
查询如下课程平均成绩和及格率的百分数(用“行“显示):企业管理(,马克思(,OO&UML(,数据库(
SELECTSUM(CASEWHENC#=’’THENscoreELSEEND)/SUM(CASEC#WHEN’’THENELSEEND)AS企业管理平均分
,*SUM(CASEWHENC#=’’ANDscore》=THENELSEEND)/SUM(CASEWHENC#=’’THENELSEEND)AS企业管理及格百分数
,SUM(CASEWHENC#=’’THENscoreELSEEND)/SUM(CASEC#WHEN’’THENELSEEND)AS马克思平均分
,*SUM(CASEWHENC#=’’ANDscore》=THENELSEEND)/SUM(CASEWHENC#=’’THENELSEEND)AS马克思及格百分数
,SUM(CASEWHENC#=’’THENscoreELSEEND)/SUM(CASEC#WHEN’’THENELSEEND)ASUML平均分
,*SUM(CASEWHENC#=’’ANDscore》=THENELSEEND)/SUM(CASEWHENC#=’’THENELSEEND)ASUML及格百分数
,SUM(CASEWHENC#=’’THENscoreELSEEND)/SUM(CASEC#WHEN’’THENELSEEND)AS数据库平均分
,*SUM(CASEWHENC#=’’ANDscore》=THENELSEEND)/SUM(CASEWHENC#=’’THENELSEEND)AS数据库及格百分数
查询不同老师所教不同课程平均分从高到低显示
SELECTmax(Z.T#)AS教师ID,MAX(Z.Tname)AS教师姓名,C.C#AS课程ID,MAX(C.ame)AS课程名称,AVG(Score)AS平均成绩
FROMSCAST,CourseASC,TeacherASZ
whereT.C#=C.C#andC.T#=Z.T#
GROUPBYC.C#
ORDERBYAVG(Score)DESC
查询如下课程成绩第名到第名的学生成绩单:企业管理(,马克思(,UML(,数据库(
,企业管理,马克思,UML,数据库,平均成绩
SELECTDISTINCTtop
SC.S#As学生学号,
Student.SnameAS学生姓名,
T.scoreAS企业管理,
T.scoreAS马克思,
T.scoreASUML,
T.scoreAS数据库,
ISNULL(T.score,)+ISNULL(T.score,)+ISNULL(T.score,)+ISNULL(T.score,)as总分
FROMStudent,SCLEFTJOINSCAST
ONSC.S#=T.S#ANDT.C#=’’
LEFTJOINSCAST
ONSC.S#=T.S#ANDT.C#=’’
LEFTJOINSCAST
ONSC.S#=T.S#ANDT.C#=’’
LEFTJOINSCAST
ONSC.S#=T.S#ANDT.C#=’’
WHEREstudent.S#=SC.S#and
ISNULL(T.score,)+ISNULL(T.score,)+ISNULL(T.score,)+ISNULL(T.score,)
TOPWITHTIES
ISNULL(T.score,)+ISNULL(T.score,)+ISNULL(T.score,)+ISNULL(T.score,)
LEFTJOINscAST
ONsc.S#=T.S#ANDT.C#=’k’
LEFTJOINscAST
ONsc.S#=T.S#ANDT.C#=’k’
LEFTJOINscAST
ONsc.S#=T.S#ANDT.C#=’k’
LEFTJOINscAST
ONsc.S#=T.S#ANDT.C#=’k’
ORDERBYISNULL(T.score,)+ISNULL(T.score,)+ISNULL(T.score,)+ISNULL(T.score,)DESC);
统计列印各科成绩,各分数段人数:课程ID,课程名称,
SELECTSC.C#as课程ID,ameas课程名称
,SUM(CASEWHENscoreBETWEENANDTHENELSEEND)AS
,SUM(CASEWHENscoreBETWEENANDTHENELSEEND)AS
,SUM(CASEWHENscoreBETWEENANDTHENELSEEND)AS
,SUM(CASEWHENscore《THENELSEEND)AS
FROMSC,Course
whereSC.C#=Course.C#
GROUPBYSC.C#,ame;
查询学生平均成绩及其名次
SELECT+(SELECTCOUNT(distinct平均成绩)
FROM(SELECTS#,AVG(score)AS平均成绩
WHERE平均成绩》T.平均成绩)as名次,
S#as学生学号,平均成绩
FROM(SELECTS#,AVG(score)平均成绩
ORDERBY平均成绩desc;
查询各科成绩前三名的记录:(不考虑成绩并列情况)
SELECTt.S#as学生ID,t.C#as课程ID,Scoreas分数
WHEREscoreIN(SELECTTOPscore
WHEREt.C#=C#
ORDERBYscoreDESC
ORDERBYt.C#;
查询每门课程被选修的学生数
selectc#,count(S#)fromscgroupbyC#;
查询出只选修了一门课程的全部学生的学号和姓名
selectSC.S#,Student.Sname,count(C#)AS选课数
fromSC,Student
whereSC.S#=Student.S#groupbySC.S#,Student.Snamehavingcount(C#)=;
Selectcount(Ssex)as男生人数fromStudentgroupbySsexhavingSsex=’男’;
Selectcount(Ssex)as女生人数fromStudentgroupbySsexhavingSsex=’女’;
查询姓“张”的学生名单
SELECTSnameFROMStudentWHERESnamelike’张%’;
查询同名同性学生名单,并统计同名人数
selectSname,count(*)fromStudentgroupbySnamehavingcount(*)》;;
年出生的学生名单(注:Student表中Sage列的类型是datetime)
selectSname,CONVERT(char(),DATEPART(year,Sage))asage
fromstudent
whereCONVERT(),DATEPART(year,Sage))=’’;
查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列
SelectC#,Avg(score)fromSCgroupbyC#orderbyAvg(score),C#DESC;
查询平均成绩大于的所有学生的学号、姓名和平均成绩
selectSname,SC.S#,avg(score)
fromStudent,SC
whereStudent.S#=SC.S#groupbySC.S#,Snamehavingavg(score)》;
查询课程名称为“数据库”,且分数低于的学生姓名和分数
SelectSname,isnull(score,)
fromStudent,SC,Course
whereSC.S#=Student.S#andSC.C#=Course.C#andCourse.ame=’数据库’andscore《;
查询所有学生的选课情况;
SELECTSC.S#,SC.C#,Sname,ame
FROMSC,Student,Course
whereSC.S#=Student.S#andSC.C#=Course.C#;
查询任何一门课程成绩在分以上的姓名、课程名称和分数;
SELECTdistinctstudent.S#,student.Sname,SC.C#,SC.score
FROMstudent,Sc
WHERESC.score》=ANDSC.S#=student.S#;
查询不及格的课程,并按课程号从大到小排列
selectc#fromscwherescore《orderbyC#;
查询课程编号为且课程成绩在分以上的学生的学号和姓名;
selectSC.S#,Student.SnamefromSC,StudentwhereSC.S#=Student.S#andScore》andC#=’’;
求选了课程的学生人数
selectcount(*)fromsc;
查询选修“叶平”老师所授课程的学生中,成绩最高的学生姓名及其成绩
selectStudent.Sname,score
fromStudent,SC,CourseC,Teacher
whereStudent.S#=SC.S#andSC.C#=C.C#andC.T#=Teacher.T#andTeacher.Tname=’叶平’andSC.score=(selectmax(score)fromSCwhereC#=C.C#);
查询各个课程及相应的选修人数
selectcount(*)fromscgroupbyC#;
查询不同课程成绩相同的学生的学号、课程号、学生成绩
selectdistinctA.S#,B.scorefromSCA,SCBwhereA.Score=B.ScoreandA.C#《》B.C#;
查询每门功成绩最好的前两名
SELECTt.S#as学生ID,t.C#as课程ID,Scoreas分数
WHEREscoreIN(SELECTTOPscore
WHEREt.C#=C#
ORDERBYscoreDESC
ORDERBYt.C#;
统计每门课程的学生选修人数(超过人的课程才统计。要求输出课程号和选修人数,查询结果按人数降序排列,查询结果按人数降序排列,若人数相同,按课程号升序排列
selectC#as课程号,count(*)as人数
orderbycount(*)desc,c#
检索至少选修两门课程的学生学号
havingcount(*)》=
查询全部学生都选修的课程的’课程号和课程名
selectC#,ame
fromCourse
whereC#in(selectc#fromscgroupbyc#)
查询没学过“叶平”老师讲授的任一门课程的学生姓名
selectSnamefromStudentwhereS#notin(selectS#fromCourse,Teacher,SCwhereCourse.T#=Teacher.T#andSC.C#=course.C#andTname=’叶平’);
查询两门以上不及格课程的同学的学号及其平均成绩
selectS#,avg(isnull(score,))fromSCwhereS#in(selectS#fromSCwherescore《group=““by=““having=““》)groupbyS#;
检索“”课程分数小于,按分数降序排列的同学学号
selectS#fromSCwhereC#=’’andscore《orderbyscoredesc;
删除“”同学的“”课程的成绩
fromScwhereS#=’’andC#=’’;
SQL是结构化查询语言(StructuredQueryLanguage),是用于访问和处理数据库的标准的计算机语言。
SQL语言的功能如下:
A、SQL面向数据库执行查询
B、SQL可从数据库取回数据
C、SQL可在数据库中插入新的记录
D、SQL可更新数据库中的数据
E、SQL可从数据库删除记录
F、SQL可创建新数据库
G、SQL可在数据库中创建新表
H、SQL可在数据库中创建存储过程
I、SQL可在数据库中创建视图
J、SQL可以设置表、存储过程和视图的权限
SQL是一门ANSI的标准计算机语言,用来访问和操作数据库系统。SQL语句用于取回和更新数据库中的数据。SQL可与数据库程序协同工作,比如MSAess、DB、Informix、MSSQLServer、Oracle、MySQL、Sybase以及其他数据库系统。
每一种数据库有自己版本的SQL语言,但是为了与ANSI标准相兼容,SQL必须以相似的方式共同地来支持一些主要的关键词(比如SELECT、UPDATE、DELETE、INSERT、WHERE等等。
除了SQL标准之外,大部分SQL数据库程序都拥有自己的私有扩展。
SQL语言分为数据定义语言、数据控制语言、数据操作语言、数据查询语言,分别实现对数据库数据操作。
数据定义语言(DDL
DDL:DataDefinitionLanguage
用于定义和管理数据对象,包括数据库、数据表、函数、视图、索引、触发器等。例如:CREATE、DROP、ALTER等语句。
createtablestudent
altertablestudentaddageintdefault;
dropdatabasestudent;
数据控制语言(DCL
DCL:DataControlLanguage
用来管理数据库的语言,包含授权用户访问、拒绝用户访问、撤销授予的权限。例如:GRANT、DENY、REVOKE、MIT、ROLLBACK等语句。
createuser‘wang’‘localhost’identifiedby‘a!’;
grantselectondb.studentto‘wang’‘localhost’;
revokeselectondb.studentfrom‘wang’‘localhost’;
数据操作语言(DML
DML:DataManipulationLanguage
用于操作数据库对象中所包含的数据,增、删、改。例如:INSERT、DELETE、UPDATE语句。
数据查询语言(DQL
DQL:DataQueryLanguage
用于查询数据库对象中所包含的数据,能够进行单表查询、连接查询、嵌套查询,以及集合查询等各种复杂程度不同的数据库查询,并将数据返回到客户机中显示。例如:SELECT语句。
字符串常量使用单引号或双引号,数值常量不用加引号。
如果字符串常量中需要换行、有单引号、双引号%_
一个如果没有转义字符就认为是一个转义字符
%一个%如果没有转义字符就认为这是一个通配符
_一个_如果没有转移字符就认为是一个通配符
select‘hanli’gang’
select‘hanligang’
select‘hanligang’
select“han“ligang”
select“韩立刚”
数值常量不用添加引号,
布尔型常量取值true和false
在SQL中使用和表示
selecttrue,false
用户自定义变量使用开始,使用set给变量赋值。
setname=‘孙悟空’;
selectname;
select*fromstudent;
intostudentvalues(,‘孙悟空’,);
intostudentvalues(,name,);
setsid=,nid=
intostudentvalues(sid,name,);
selectsid+nid;
setsid=sid+;
selectsid;
setsname=(selectsnamefromstudentwheresid=);
selectsname;
系统变量分为全局系统变量和会话系统变量。
全局系统变量:针对所有默认设置
会话系统变量:针对当前用户生效,用户登录MySQL会使用全局系统变量,如果会话中更改了变量值,使用更改后的值,不过只针对当前用户生效。
showvariables显示会话系统变量
showglobalvariables显示全局系统变量
showsessionvariables显示会话系统变量
showglobalvariableslike‘sql_select_limit’;使用通配符显示匹配的变量设置
showsessionvariableslike‘sql_select_limit’;系统变量使用标识
selectglobal.sql_select_limit查看某个全局系统变量设置
selectsession.sql_select_limit查看某个会话系统变量设置
setsession.sql_select_limit=设置会话系统变量
全局系统变量需要在/etc/my.f配置文件中修改。
我整理的一些比较常用的SQL语句语法需要的朋友可以过来参考下
一数据控制语句(DML)部分
INSERT(往数据表里插入记录的语句)
INSERTINTO表名(字段名字段名……)VALUES(值值……);
INSERTINTO表名(字段名字段名……)SELECT字段名字段名……FROM另外的表名;
字符串类型的字段值必须用单引号括起来例如:GOODDAY
如果字段值里包含单引号需要进行字符串转换我们把它替换成两个单引号
字符串类型的字段值超过定义的长度会出错最好在插入前进行长度校验
日期字段的字段值可以用当前数据库的系统时间SYSDATE精确到秒
或者用字符串转换成日期型函数TO_DATE(‘YYYYMMDD)
TO_DATE()还有很多种日期格式可以参看ORACLEDOC
年月日小时:分钟:秒的格式YYYYMMDDHH:MI:SS
INSERT时最大可操作的字符串长度小于等于个单字节如果要插入更长的字符串请考虑字段用CLOB类型
方法借用ORACLE里自带的DBMS_LOB程序包
INSERT时如果要用到从开始自动增长的序列号应该先建立一个序列号
CREATESEQUENCE序列号的名称(最好是表名+序列号标记)INCREMENTBYSTARTWITH
MAXVALUECYCLENOCACHE;
其中最大的值按字段的长度来定如果定义的自动增长的序列号NUMBER()最大值为
INSERT语句插入这个字段值为:序列号的名称NEXTVAL
DELETE(删除数据表里记录的语句)
DELETEFROM表名WHERE条件;
注意删除记录并不能释放ORACLE里被占用的数据块表空间它只把那些被删除的数据块标成unused
如果确实要删除一个大表里的全部记录可以用TRUNCATE命令它可以释放占用的数据块表空间
TRUNCATETABLE表名;
UPDATE(修改数据表里记录的语句)
UPDATE表名SET字段名=值字段名=值……WHERE条件;
如果修改的值N没有赋值或定义时将把原来的记录内容清为NULL最好在修改前进行非空校验;
值N超过定义的长度会出错最好在插入前进行长度校验
A以上SQL语句对表都加上了行级锁
确认完成后必须加上事物处理结束的命令MIT才能正式生效
否则改变不一定写入数据库里
如果想撤回这些操作可以用命令ROLLBACK复原
B在运行INSERTDELETE和UPDATE语句前最好估算一下可能操作的记录范围
应该把它限定在较小(一万条记录)范围内否则ORACLE处理这个事物用到很大的回退段
程序响应慢甚至失去响应如果记录数上十万以上这些操作可以把这些SQL语句分段分次完成
其间加上MIT确认事物处理
二数据定义(DDL)部分
CREATE(创建表索引视图同义词过程函数数据库链接等)
ORACLE常用的字段类型有
CHAR固定长度的字符串
VARCHAR可变长度的字符串
NUMBER(MN)数字型M是位数总长度N是小数的长度
创建表时要把较小的不为空的字段放在前面可能为空的字段放在后面
创建表时可以用中文的字段名但最好还是用英文的字段名
创建表时可以给字段加上默认值例如DEFAULTSYSDATE
这样每次插入和修改时不用程序操作这个字段都能得到动作的时间
创建表时可以给字段加上约束条件
例如不允许重复UNIQUE关键字PRIMARYKEY
ALTER(改变表索引视图等)
ALTERTABLE表名TO表名;
在表的后面增加一个字段
ALTERTABLE表名ADD字段名字段名描述;
修改表里字段的定义描述
ALTERTABLE表名MODIFY字段名字段名描述;
给表里的字段加上约束条件
ALTERTABLE表名ADDCONSTRAINT约束名PRIMARYKEY(字段名);
ALTERTABLE表名ADDCONSTRAINT约束名UNIQUE(字段名);
把表放在或取出数据库的内存区
ALTERTABLE表名CACHE;
ALTERTABLE表名NOCACHE;
DROP(删除表索引视图同义词过程函数数据库链接等)
删除表和它所有的约束条件
DROPTABLE表名CASCADECONSTRAINTS;
TRUNCATE(清空表里的所有记录保留表的结构)
TRUNCATE表名;
三查询语句(SELECT)部分
SELECT字段名字段名……FROM表名WHERE条件;
例如:COUNT(*)MIN(字段名)MAX(字段名)AVG(字段名)DISTINCT(字段名)
TO_CHAR(DATE字段名YYYYMMDDHH:MI:SS)
NVL(EXPREXPR)函数
IFEXPR=NULL
RETURNEXPR
RETURNEXPR
DECODE(AA﹐V﹐R﹐V﹐R)函数
IFAA=VTHENRETURNR
IFAA=VTHENRETURNR
RETURNNULL
LPAD(charnchar)函数
字符char按制定的位数n显示不足的位数用char字符串替换左边的空位
字段名之间可以进行算术运算
例如:(字段名*字段名)/
例如:SELECT……FROM
(SELECT……FROM表名WHERE条件)WHERE条件;
两个查询语句的结果可以做集合操作
例如:并集UNION(去掉重复记录)并集UNIONALL(不去掉重复记录)差集MINUS交集INTERSECT
SELECT字段名字段名……FROM表名GROUPBY字段名
两个以上表之间的连接查询
SELECT字段名字段名……FROM表名WHERE
表名字段名=表名字段名;
SELECT字段名字段名……FROM表名WHERE
表名字段名=表名字段名(+);
有(+)号的字段位置自动补空值
查询结果集的排序操作默认的排序是升序ASC降序是DESC
SELECT字段名字段名……FROM表名
ORDERBY字段名字段名DESC;
字符串模糊比较的方法
INSTR(字段名‘字符串)》
字段名LIKE‘字符串%
每个表都有一个隐含的字段ROWID它标记着记录的唯一性
四ORACLE里常用的数据对象(SCHEMA)
CREATEINDEX索引名ON表名(字段);
ALTERINDEX索引名REBUILD;
一个表的索引最好不要超过三个(特殊的大表除外)最好用单字段索引结合SQL语句的分析执行情况
也可以建立多字段的组合索引和基于函数的索引
ORACLE字符串可以索引的最大长度为单字节
ORACLE字符串可以索引的最大长度为单字节
ORACLEDOC上说字符串最大可以建索引的长度约是:数据块的大小(db_block_size)*%
CREATEVIEW视图名ASSELECT…FROM…;
ALTERVIEW视图名PILE;
视图仅是一个SQL查询语句它可以把表之间复杂的关系简洁化
同义词(SYNONMY)
CREATESYNONYM同义词名FOR表名;
CREATESYNONYM同义词名FOR表名数据库链接名;
数据库链接(DATABASELINK)
CREATEDATABASELINK数据库链接名CONNECTTO用户名IDENTIFIEDBY密码USING‘数据库连接字符串;
数据库连接字符串可以用EASYCONFIG或者直接修改TNSNAMESORA里定义
数据库参数global_name=true时要求数据库链接名称跟远端数据库名称一样
数据库全局名称可以用以下命令查出
SELECT*FROMGLOBAL_NAME;
查询远端数据库里的表
SELECT……FROM表名数据库链接名;
五权限管理(DCL)语句
常用的系统权限集合有以下三个:
CONNECT(基本的连接)RESOURCE(程序开发)DBA(数据库管理)
常用的数据对象权限有以下五个:
ALLON数据对象名SELECTON数据对象名UPDATEON数据对象名
DELETEON数据对象名INSERTON数据对象名ALTERON数据对象名
GRANTCONNECTRESOURCETO用户名;
GRANTSELECTON表名TO用户名;
GRANTSELECTINSERTDELETEON表名TO用户名用户名;
REVOKE回收权限
REVOKECONNECTRESOURCEFROM用户名;
REVOKESELECTON表名FROM用户名;lishixinzhi/Article/program/MySQL//
数据库常用sql语句有哪些
数据库常用sql语句有哪些
SQL语句有哪些?SQL语句无论是种类还是数量都是繁多的,很多语句也是经常要用到的,下文我为大家分享的就是SQL的常用语句,仅供参考!
Student(S#,Sname,Sage,Ssex)学生表
Course(C#,ame,T#)课程表
SC(S#,C#,score)成绩表
Teacher(T#,Tname)教师表
查询“”课程比“”课程成绩高的所有学生的学号;
selecta.S#from(selects#,scorefromSCwhereC#=’’)a,(selects#,score
fromSCwhereC#=’’)b
wherea.score》b.scoreanda.s#=b.s#;
查询平均成绩大于分的同学的学号和平均成绩;
selectS#,avg(score)
groupbyS#havingavg(score)》;
查询所有同学的学号、姓名、选课数、总成绩;
selectStudent.S#,Student.Sname,count(SC.C#),sum(score)
fromStudentleftOuterjoinSConStudent.S#=SC.S#
groupbyStudent.S#,Sname
查询姓“李”的老师的个数;
selectcount(distinct(Tname))
fromTeacher
whereTnamelike’李%’;
查询没学过“叶平”老师课的同学的学号、姓名;
selectStudent.S#,Student.Sname
fromStudent
whereS#notin(selectdistinct(SC.S#)fromSC,Course,TeacherwhereSC.C#=Course.C#andTeacher.T#=Course.T#andTeacher.Tname=’叶平’);
查询学过“”并且也学过编号“”课程的同学的学号、姓名;
selectStudent.S#,Student.SnamefromStudent,SCwhereStudent.S#=SC.S#andSC.C#=’’andexists(Select*fromSCasSC_whereSC_.S#=SC.S#andSC_.C#=’’);
查询学过“叶平”老师所教的所有课的同学的学号、姓名;
selectS#,Sname
fromStudent
whereS#in(selectS#fromSC,Course,TeacherwhereSC.C#=Course.C#andTeacher.T#=Course.T#andTeacher.Tname=’叶平’groupbyS#havingcount(SC.C#)=(selectcount(C#)fromCourse,TeacherwhereTeacher.T#=Course.T#andTname=’叶平’));
查询课程编号“”的成绩比课程编号“”课程低的所有同学的学号、姓名;
SelectS#,Snamefrom(selectStudent.S#,Student.Sname,score,(selectscorefromSCSC_whereSC_.S#=Student.S#andSC_.C#=’’)score
fromStudent,SCwhereStudent.S#=SC.S#andC#=’’)S_wherescore《score;
查询所有课程成绩小于分的同学的学号、姓名;
selectS#,Sname
fromStudent
whereS#notin(selectStudent.S#fromStudent,SCwhereS.S#=SC.S#andscore》);
查询没有学全所有课的同学的学号、姓名;
selectStudent.S#,Student.Sname
fromStudent,SC
whereStudent.S#=SC.S#groupbyStudent.S#,Student.Snamehavingcount(C#)《(selectcount(C#)fromCourse);
查询至少有一门课与学号为“”的同学所学相同的同学的学号和姓名;
selectS#,SnamefromStudent,SCwhereStudent.S#=SC.S#andC#inselectC#fromSCwhereS#=’’;
查询至少学过学号为“”同学所有一门课的其他同学学号和姓名;
selectdistinctSC.S#,Sname
fromStudent,SC
whereStudent.S#=SC.S#andC#in(selectC#fromSCwhereS#=’’);
把“SC”表中“叶平”老师教的课的成绩都更改为此课程的平均成绩;
updateSCsetscore=(selectavg(SC_.score)
whereSC_.C#=SC.C#)fromCourse,TeacherwhereCourse.C#=SC.C#andCourse.T#=Teacher.T#andTeacher.Tname=’叶平’);
查询和“”号的同学学习的课程完全相同的其他同学学号和姓名;
selectS#fromSCwhereC#in(selectC#fromSCwhereS#=’’)
groupbyS#havingcount(*)=(selectcount(*)fromSCwhereS#=’’);
删除学习“叶平”老师课的SC表记录;
fromcourse,Teacher
whereCourse.C#=SC.C#andCourse.T#=Teacher.T#andTname=’叶平’;
向SC表中插入一些记录,这些记录要求符合以下条件:没有上过编号“”课程的同学学号、、
InsertSCselectS#,’’,(Selectavg(score)
fromSCwhereC#=’’)fromStudentwhereS#notin(SelectS#fromSCwhereC#=’’);
按平均成绩从高到低显示所有学生的“数据库”、“企业管理”、“英语”三门的课程成绩,按如下形式显示:学生ID,,数据库,企业管理,英语,有效课程数,有效平均分
SELECTS#as学生ID
,(SELECTscoreFROMSCWHERESC.S#=t.S#ANDC#=’’)AS数据库
,(SELECTscoreFROMSCWHERESC.S#=t.S#ANDC#=’’)AS企业管理
,(SELECTscoreFROMSCWHERESC.S#=t.S#ANDC#=’’)AS英语
,COUNT(*)AS有效课程数,AVG(t.score)AS平均成绩
ORDERBYavg(t.score)
查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分
SELECTL.C#As课程ID,L.scoreAS最高分,R.scoreAS最低分
FROMSCL,SCASR
WHEREL.C#=R.C#and
L.score=(SELECTMAX(IL.score)
FROMSCASIL,StudentASIM
WHEREL.C#=IL.C#andIM.S#=IL.S#
GROUPBYIL.C#)
R.Score=(SELECTMIN(IR.score)
FROMSCASIR
WHERER.C#=IR.C#
GROUPBYIR.C#
按各科平均成绩从低到高和及格率的百分数从高到低顺序
SELECTt.C#AS课程号,max(course.ame)AS课程名,isnull(AVG(score),)AS平均成绩
,*SUM(CASEWHENisnull(score,)》=THENELSEEND)/COUNT(*)AS及格百分数
FROMSCT,Course
wheret.C#=course.C#
GROUPBYt.C#
ORDERBY*SUM(CASEWHENisnull(score,)》=THENELSEEND)/COUNT(*)DESC
查询如下课程平均成绩和及格率的百分数(用“行“显示):企业管理(,马克思(,OO&UML(,数据库(
SELECTSUM(CASEWHENC#=’’THENscoreELSEEND)/SUM(CASEC#WHEN’’THENELSEEND)AS企业管理平均分
,*SUM(CASEWHENC#=’’ANDscore》=THENELSEEND)/SUM(CASEWHENC#=’’THENELSEEND)AS企业管理及格百分数
,SUM(CASEWHENC#=’’THENscoreELSEEND)/SUM(CASEC#WHEN’’THENELSEEND)AS马克思平均分
,*SUM(CASEWHENC#=’’ANDscore》=THENELSEEND)/SUM(CASEWHENC#=’’THENELSEEND)AS马克思及格百分数
,SUM(CASEWHENC#=’’THENscoreELSEEND)/SUM(CASEC#WHEN’’THENELSEEND)ASUML平均分
,*SUM(CASEWHENC#=’’ANDscore》=THENELSEEND)/SUM(CASEWHENC#=’’THENELSEEND)ASUML及格百分数
,SUM(CASEWHENC#=’’THENscoreELSEEND)/SUM(CASEC#WHEN’’THENELSEEND)AS数据库平均分
,*SUM(CASEWHENC#=’’ANDscore》=THENELSEEND)/SUM(CASEWHENC#=’’THENELSEEND)AS数据库及格百分数
查询不同老师所教不同课程平均分从高到低显示
SELECTmax(Z.T#)AS教师ID,MAX(Z.Tname)AS教师姓名,C.C#AS课程ID,MAX(C.ame)AS课程名称,AVG(Score)AS平均成绩
FROMSCAST,CourseASC,TeacherASZ
whereT.C#=C.C#andC.T#=Z.T#
GROUPBYC.C#
ORDERBYAVG(Score)DESC
查询如下课程成绩第名到第名的学生成绩单:企业管理(,马克思(,UML(,数据库(
,企业管理,马克思,UML,数据库,平均成绩
SELECTDISTINCTtop
SC.S#As学生学号,
Student.SnameAS学生姓名,
T.scoreAS企业管理,
T.scoreAS马克思,
T.scoreASUML,
T.scoreAS数据库,
ISNULL(T.score,)+ISNULL(T.score,)+ISNULL(T.score,)+ISNULL(T.score,)as总分
FROMStudent,SCLEFTJOINSCAST
ONSC.S#=T.S#ANDT.C#=’’
LEFTJOINSCAST
ONSC.S#=T.S#ANDT.C#=’’
LEFTJOINSCAST
ONSC.S#=T.S#ANDT.C#=’’
LEFTJOINSCAST
ONSC.S#=T.S#ANDT.C#=’’
WHEREstudent.S#=SC.S#and
ISNULL(T.score,)+ISNULL(T.score,)+ISNULL(T.score,)+ISNULL(T.score,)
TOPWITHTIES
ISNULL(T.score,)+ISNULL(T.score,)+ISNULL(T.score,)+ISNULL(T.score,)
LEFTJOINscAST
ONsc.S#=T.S#ANDT.C#=’k’
LEFTJOINscAST
ONsc.S#=T.S#ANDT.C#=’k’
LEFTJOINscAST
ONsc.S#=T.S#ANDT.C#=’k’
LEFTJOINscAST
ONsc.S#=T.S#ANDT.C#=’k’
ORDERBYISNULL(T.score,)+ISNULL(T.score,)+ISNULL(T.score,)+ISNULL(T.score,)DESC);
统计列印各科成绩,各分数段人数:课程ID,课程名称,
SELECTSC.C#as课程ID,ameas课程名称
,SUM(CASEWHENscoreBETWEENANDTHENELSEEND)AS
,SUM(CASEWHENscoreBETWEENANDTHENELSEEND)AS
,SUM(CASEWHENscoreBETWEENANDTHENELSEEND)AS
,SUM(CASEWHENscore《THENELSEEND)AS
FROMSC,Course
whereSC.C#=Course.C#
GROUPBYSC.C#,ame;
查询学生平均成绩及其名次
SELECT+(SELECTCOUNT(distinct平均成绩)
FROM(SELECTS#,AVG(score)AS平均成绩
WHERE平均成绩》T.平均成绩)as名次,
S#as学生学号,平均成绩
FROM(SELECTS#,AVG(score)平均成绩
ORDERBY平均成绩desc;
查询各科成绩前三名的记录:(不考虑成绩并列情况)
SELECTt.S#as学生ID,t.C#as课程ID,Scoreas分数
WHEREscoreIN(SELECTTOPscore
WHEREt.C#=C#
ORDERBYscoreDESC
ORDERBYt.C#;
查询每门课程被选修的学生数
selectc#,count(S#)fromscgroupbyC#;
查询出只选修了一门课程的全部学生的学号和姓名
selectSC.S#,Student.Sname,count(C#)AS选课数
fromSC,Student
whereSC.S#=Student.S#groupbySC.S#,Student.Snamehavingcount(C#)=;
Selectcount(Ssex)as男生人数fromStudentgroupbySsexhavingSsex=’男’;
Selectcount(Ssex)as女生人数fromStudentgroupbySsexhavingSsex=’女’;
查询姓“张”的.学生名单
SELECTSnameFROMStudentWHERESnamelike’张%’;
查询同名同性学生名单,并统计同名人数
selectSname,count(*)fromStudentgroupbySnamehavingcount(*)》;;
年出生的学生名单(注:Student表中Sage列的类型是datetime)
selectSname,CONVERT(char(),DATEPART(year,Sage))asage
fromstudent
whereCONVERT(char(),DATEPART(year,Sage))=’’;
查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列
SelectC#,Avg(score)fromSCgroupbyC#orderbyAvg(score),C#DESC;
查询平均成绩大于的所有学生的学号、姓名和平均成绩
selectSname,SC.S#,avg(score)
fromStudent,SC
whereStudent.S#=SC.S#groupbySC.S#,Snamehaving??avg(score)》;
查询课程名称为“数据库”,且分数低于的学生姓名和分数
SelectSname,isnull(score,)
fromStudent,SC,Course
whereSC.S#=Student.S#andSC.C#=Course.C#andCourse.ame=’数据库’andscore《;
查询所有学生的选课情况;
SELECTSC.S#,SC.C#,Sname,ame
FROMSC,Student,Course
whereSC.S#=Student.S#andSC.C#=Course.C#;
查询任何一门课程成绩在分以上的姓名、课程名称和分数;
SELECTdistinctstudent.S#,student.Sname,SC.C#,SC.score
FROMstudent,Sc
WHERESC.score》=ANDSC.S#=student.S#;
查询不及格的课程,并按课程号从大到小排列
selectc#fromscwherescore《orderbyC#;
查询课程编号为且课程成绩在分以上的学生的学号和姓名;
selectSC.S#,Student.SnamefromSC,StudentwhereSC.S#=Student.S#andScore》andC#=’’;
求选了课程的学生人数
selectcount(*)fromsc;
查询选修“叶平”老师所授课程的学生中,成绩最高的学生姓名及其成绩
selectStudent.Sname,score
fromStudent,SC,CourseC,Teacher
whereStudent.S#=SC.S#andSC.C#=C.C#andC.T#=Teacher.T#andTeacher.Tname=’叶平’andSC.score=(selectmax(score)fromSCwhereC#=C.C#);
查询各个课程及相应的选修人数
selectcount(*)fromscgroupbyC#;
查询不同课程成绩相同的学生的学号、课程号、学生成绩
selectdistinctA.S#,B.scorefromSCA,SCBwhereA.Score=B.ScoreandA.C#《》B.C#;
查询每门功成绩最好的前两名
SELECTt.S#as学生ID,t.C#as课程ID,Scoreas分数
WHEREscoreIN(SELECTTOPscore
WHEREt.C#=C#
ORDERBYscoreDESC
ORDERBYt.C#;
统计每门课程的学生选修人数(超过人的课程才统计。要求输出课程号和选修人数,查询结果按人数降序排列,查询结果按人数降序排列,若人数相同,按课程号升序排列
selectC#as课程号,count(*)as人数
orderbycount(*)desc,c#
检索至少选修两门课程的学生学号
havingcount(*)》=
查询全部学生都选修的课程的课程号和课程名
selectC#,ame
fromCourse
whereC#in(selectc#fromscgroupbyc#)
查询没学过“叶平”老师讲授的任一门课程的学生姓名
selectSnamefromStudentwhereS#notin(selectS#fromCourse,Teacher,SCwhereCourse.T#=Teacher.T#andSC.C#=course.C#andTname=’叶平’);
查询两门以上不及格课程的同学的学号及其平均成绩
selectS#,avg(isnull(score,))fromSCwhereS#in(selectS#fromSCwherescore《groupbyS#havingcount(*)》)groupbyS#;
检索“”课程分数小于,按分数降序排列的同学学号
selectS#fromSCwhereC#=’’andscore《orderbyscoredesc;
删除“”同学的“”课程的成绩
deletefromScwhereS#=’’andC#=’’;;