SQL!语句使用经典例子
SQL语句使用经典例子2010-9-24 11:51:00来源:Sql一节、数据表的查询(select)select 字段列表[as 别名], * from 数据表名[where 条件语句][group by 分组字段][order by 排序字段列表desc][LIMIT startrow,rownumber]1、Select 字段列表From 数据表例:①、select id,gsmc,add,tel from haf (* 表示数据表中所有字段)②、select 单价,数量,单价*数量as 合计金额from haf (As 设置字段的别名)2、Select … from … Where 筛选条件式筛选条件式:①、字符串数据:select * from 成绩单Where 姓名='李明' ②、万用字符:select * from 成绩单Where 姓名like '李%'select * from 成绩单Where 姓名like '%李%'select * from 成绩单Where 姓名like '%李_'③、特殊的条件式:⑴= / > / < / <> / >= / <=⑵AND(逻辑与) OR(逻辑或) NOT(逻辑非)⑶Where 字段名称in(值一,值二)⑷Where 字段名称Is Null / Where 字段名称Is Not Null3、Select … from … group by 字段SQL函数:SELECT sex,count(id) as women from `user` group by 'sex';函数名描述函数名描述AVG平均值Count计数MAX最大值MIN最小值Sum求和4、Select … from … Order by 字段列表desc(倒,如果直接写为顺序)5、Select … from … LIMIT ".$start_rowno.",".($pagesize+1)第二节 SQL语句实例应用数据库说明:student(学生表):stdid int(11) id号son char(5) 学号sname char(20) 姓名ssex tinyint(1) 性别sage char(3) 年龄sdept char(20) 所在系course(课程表):couid int(11) id号cno char(5) 课程号cname char(20) 课程名cpno char(6) 选修课号ccredit char(50) 学分sc(学生选课表):scid int(11) id号cno char(5) 课程号grade float 成绩sno char(5) 学号单表查询:一、选择表中的若干字段:查询指定列:1、查询全体学生的学号与姓名;select son,sname from student2、查询全体学生的姓名、学号、所在系; select sname,son,sdept from student3、查询全体学生的详细记录;select * from student查询经过计算的值:4、查全体学生的姓名及其出生年份select sname,year(now())-sage as '出生年份' from student5、查询全体学生的姓名、出生年份和所有系,要求用大(小)写字母表示所有系名select sname as '姓名','出生与',year(now())-sage as '出生年份',UPPER(sdept) as '系别' from studentselect sname as '姓名','出生与',year(now())-sage as '出生年份',lower(sdept) as '系别' from student二、选择表中的若干记录:消除取值重复的行:6、查询选修了课程的学生学号select distinct sno from sc查询满足条件的记录:比较大小:7、查询计算机全体学生的名单select sname from student where sdept='cs'8、查询所有年龄在20岁以下的学生姓名及其年龄select sname,sage from student where sage<209、查询考试成绩小于90分的学生的学号select distinct sno from sc where grade<90确定范围:10、查询年龄在18-20岁之间的学生的姓名、系别和年龄。
select sname,sdept,sage from student where sage between 18 and 2011、查询年龄不在19-20岁之间的学生的姓名、系别和年龄。
select sname,sdept,sage from student where sage not between 19 and 20确定集合:12、查询信息系(is)、数学系(ma)和计算机科学系(cs)学生的姓名和性别。
select sname,ssex from student where sdept in('is','ma','cs')13、查询不是信息系(is)、数学系(ma)的学生的姓名、系别和年龄。
select sname,ssex from student where sdept not in('is','ma')字符匹配(like '<匹配串>' %代表任意长度(长度可以为0)的字符串; _代表任意单个字符,汉字得用两个"__"):14、查询学号为95001的学生的详细情况select * from student where son like '95001'15、查询所有姓名李的学生的姓名、学号和性别。
select sname,son,ssex from student where sname like '李%'16、查询姓名是两个字学生的姓名、学号和性别。
select sname,son,ssex from student where sname like '____'17、查询所有不姓李的学生姓名。
select sname from student where sname not like '李__'涉及空值的查询:18、某些学生选修课程后没有参加考试,所以有选课记录,但没有考试成绩,查询缺少成绩的学生的学号和相应的课程号。
select sno,cno from sc where grade is null19、查询所有有成绩的学生学号和课程号。
select sno,cno from sc where grade is not null多重条件查询(and or):20、查询计算机系年龄在20岁的学生姓名。
select sname from student where sdept='cs' and sage=2021、查询信息系(is)、数学系(ma)和计算机科学系(cs)学生的姓名和性别。
select sname,ssex from student where sdept='is' or sdept='ma' or sdept='cs'三、对查询结果排序:22、查询选修了3号课程的学生的学号及其成绩,查询结果按分数的降序排列。
select sno,grade from sc where cno='3' order by grade desc23、查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列。
select * from student order by sdept,sage desc四、使用集函数:24、查询学生总人数。
select count(*) as '总人数' from student25、查询选修了课程的学生人数。
select count(distinct sno) as '人数' from sc26、计算1号课程的学生平均成绩select format(avg(grade),2) as '平均成绩' from sc where cno='1'27、查询选修1号课程的学生最高分数。
select max(grade) from sc where cno='1'五、对查询结果分组:28、求各个课程号及相应的选课人数。
select cno as '课程号',count(sno) as '人数' from sc group by cno29、查询选修了3门以上课程的学生学号。
select sno from sc group by sno having count(*)>2注:where 子句与having 短语的区别在于作用对象不同,where 子句作用于基本表或视图,从中选择满足条件的记录,having 短语作用于组,从中选择满足条件的组。
多表查询同时查询两个以上的表,称为连接查询。
等值连接:当连接运算符为=时,为等值连接。
1、查询每个学生及其选修课程的情况(等值连接)。
select student.*,sc.* from student,sc where student.son=sc.sno自然连接:在等值连接中把目标列中重复的属性列去掉。
2、查询每个学生及其选修课程的情况(自然连接)。
sql语句大全举例
Everyone has many dreams in their life, but if one of them keeps disturbing you, the rest is just action.勤学乐施积极进取(页眉可删)sql语句大全举例学数据库、JAVA等等课程的时候,都需要学习一些sql语句。
下面特意为大家整理了一些sql语句,希望在大家学习的时候,能帮助到大家。
1、说明:创建数据库CREATE DATABASE database-name2、说明:删除数据库drop database dbname3、说明:备份sqlserver--- 创建备份数据的 deviceUSE masterEXEC sp_addumpdevice disk, testBack,c:\mssql7backup\MyNwind_1.dat--- 开始备份BACKUP DATABASE pubs TO testBack4、说明:创建新表create table tabname(col1type1 [not null] [primary key],col2 type2 [not null],..)根据已有的表创建新表:A:createtable tab_new like tab_old (使用旧表创建新表)B:create table tab_new asselect col1,col2… from tab_old definition only5、说明:删除新表drop table tabname6、说明:增加一个列Alter table tabname addcolumn col type注:列增加后将不能删除。
DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。
7、说明:添加主键:Alter table tabname add primary key(col)说明:删除主键:Alter table tabname drop primary key(col)8、说明:创建索引:create [unique] index idxname on tabname(col….)删除索引:dropindex idxname注:索引是不可更改的,想更改必须删除重新建。
sql常用语句100例
--update phoneinfo set cityname = '克孜勒苏柯尔克孜' where cityname = '克孜勒苏柯尔克孜州'--update phoneinfo set cityname = '湘西' where pad1 = '湖南 吉首'select * from dbo.PhoneInfo--update dbo.PhoneInfo set provincename=b.provincename,cityname=b.cityname from dbo.PhoneInfo a,PhoneInfo_hl b--where a.phonebound=b.phonebound--select * from dbo.UnknowPhoneBound--select * from dbo.Area--select * from phoneinfo a, phoneinfo_old b, phoneinfo_hl c where a.phonebound = b.phonebound and a.phonebound = c.phonebound and (a.cityname <> b.cityname or a.cityname <> c.cityname)--select * from phoneinfo a, phoneinfo_hl b where a.phonebound = b.phonebound and a.cityname <> b.citynameselect * from phoneinfo a, phoneinfo_old b where a.phonebound = b.phonebound and a.cityname <> b.cityname--select * into phoneinfo_bak from phoneinfo--select * from phoneinfo_bakselect * from phoneinfo a, phoneinfo_old b where a.phonebound = b.phonebound and a.cityname <> b.cityname--select * from dbo.PhoneInfo_Telecom--update PhoneInfo_Telecom set provincename = '内蒙古' where pad1 = '内蒙兴安盟'update PhoneInfo set cityname = '酒泉' where pad1 = '甘肃 酒泉嘉峪关'--update dbo.PhoneInfo_old set provincename=b.provincename,cityname=b.cityname from dbo.PhoneInfo_old a,PhoneInfo_Telecom b--where a.phonebound=b.phoneboundcreate table client_allasselect t2.mobilephone,t2.clientName,t2.sex,t2.birthdayyear,t2.birthdaymonth,t2.birthdaydate,t2.cardtype,t2.FundPurchaseTotalFee,t2.InsurePurchaseTotalFee,t2.FundSource,t2.InsureSource,t2.BankSourcefrom (select mobilephone,clientName,Sex,birthdayyear,birthdaymonth,birthdaydate,cardtype,fund_sum_fee FundPurchaseTotalFee,insure_sum_fee InsurePurchaseTotalFee,case when sourceindustry = '±£ÏÕ'then'±£ÏÕ'end as FundSource,case when sourceindustry = '»ù½ð'then'»ù½ð'end as InsureSource,case when sourceindustry = 'ÒøÐÐ'then'ÒøÐÐ'end as BankSource from (select c.*, f.fund_sum_fee, insure_sum_feefrom client_55 cleft join (select sum(cast(fee as float)) fund_sum_fee,mobilephonefrom fund_client_behavior_55group by mobilephone) f on c.mobilephone =f.mobilephoneleft join (select sum(cast(fee as float)) insure_sum_fee,mobilephonefrom client_purchase_55group by mobilephone) i on i.mobilephone =c.mobilephone) t) t2。
sql命令语句
sql命令语句嘿,朋友!你知道 SQL 命令语句吗?这玩意儿可太重要啦!就好比是一把神奇的钥匙,能打开数据库那神秘宝库的大门。
比如说,当你想要从一个超级大的数据库里找出特定的信息,这时候 SQL 的 SELECT 语句就派上用场啦!“SELECT * FROM table_name”,就像你在茫茫人海中精准地找到你要找的那个人一样神奇!你能想象没有它该怎么办吗?还有啊,INSERT 语句,那简直就是给数据库添加新东西的魔法棒呀!“INSERT INTO table_name (column1, column2, column3) VALUES (value1, value2, value3)”,这不就像是给一个空房间里添置新家具嘛,一下子就让它丰富起来了。
UPDATE 语句呢,就像是给已有的东西做个小改造,让它更符合你的需求。
“UPDATE table_name SET column1 = value1 WHERE condition”,这多像给一件衣服换个扣子或者改个颜色呀!DELETE 语句,哎呀,这可有点厉害咯!它就像是把不需要的东西直接清理掉。
“DELETE FROM table_name WHERE condition”,这就像你清理房间时扔掉那些没用的杂物一样果断。
我之前和一个朋友一起做项目,他对 SQL 命令语句不太熟悉,结果在处理数据的时候那叫一个手忙脚乱啊!我就跟他说:“嘿,你得好好学学 SQL 命令语句呀,不然这工作可没法干啦!”他还不信,后来吃了不少苦头才意识到重要性。
SQL 命令语句真的是太实用啦!它是我们和数据库沟通的桥梁,没有它,我们怎么能在数据的海洋里畅游呢?所以呀,一定要好好掌握它,让它为我们的工作和生活带来便利!这就是我的观点,SQL 命令语句,不可或缺!。
SQL语句大全实例
SQL语句实例表操作例1 对于表的教学管理数据库中的表STUDENTS ,可以定义如下:CREATE TABLE STUDENTS(SNO NUMERIC (6, 0) NOT NULLSNAME CHAR (8) NOT NULLAGE NUMERIC(3,0)SEX CHAR(2)BPLACE CHAR(20)PRIMARY KEY(SNO))例2 对于表的教学管理数据库中的表ENROLLS ,可以定义如下: CREATE TABLE ENROLLS(SNO NUMERIC(6,0) NOT NULLCNO CHAR(4) NOT NULLGRADE INTPRIMARY KEY(SNO,CNO)FOREIGN KEY(SNO) REFERENCES STUDENTS(SNO)FOREIGN KEY(CNO) REFERENCES COURSES(CNO)CHECK ((GRADE IS NULL) OR (GRADE BETWEEN 0 AND 100)))例3 根据表的STUDENTS 表,建立一个只包含学号、姓名、年龄的女学生表。
CREATE TABLE GIRLAS SELECT SNO, SNAME, AGEFROM STUDENTSWHERE SEX=' 女';例4 删除教师表TEACHER 。
DROP TABLE TEACHER例5 在教师表中增加住址列。
ALTER TABLE TEACHERSADD (ADDR CHAR(50))例6 把STUDENTS 表中的BPLACE 列删除,并且把引用BPLACE 列的所有视图和约束也一起删除。
ALTER TABLE STUDENTSDROP BPLACE CASCADE例7 补充定义ENROLLS 表的主关键字。
ALTER TABLE ENROLLSADD PRIMARY KEY (SNO,CNO) ;视图操作(虚表)例9 建立一个只包括教师号、姓名和年龄的视图FACULTY 。
sql 段子
sql 段子在计算机程序设计领域,SQL(Structured Query Language,结构化查询语言)是一种用于管理关系数据库系统的语言。
尽管它看起来非常严肃和专业,但也有些有趣的“SQL段子”流传在开发者之间,让人们在编写和优化SQL查询时能够轻松一笑。
1. 一个SQL查询走进了一家酒吧,然后对酒保说:“你好,请给我一杯啤酒!”酒保回答:“对不起,我们这里只服务那些有名的人。
”SQL查询不以为然地说:“我就是那个‘ALL’表,有很多有名的字段都会来找我!”2. 一个开发者向另一个开发者抱怨说:“我每次编写SQL查询的时候,都觉得自己像是在让表发誓!”另一名开发者问:“为什么?”他回答道:“因为我总是用'FROM'开头、'WHERE'做限制,而最后却总是用'GROUP BY'!”3. 有一天,一只SQL查询和一只NoSQL查询走进了一家甜品店。
SQL查询点了个冰激凌,NoSQL查询则点了个水果沙拉。
当SQL查询看到NoSQL查询用叉子吃沙拉时,大吃一惊地说:“你吃得真快!”NoSQL查询回答:“我没有表。
”4. SQL查询对数据库管理员抱怨说:“我为什么总是和索引打交道?难道我是搜寻引擎吗?”数据库管理员耐心地回答:“不,你只是个索引大师。
”5. 一个开发者在写SQL查询时迷糊了,然后问同事:“我们数据库的数据明明一直都在那儿,为什么它们不出现在查询结果中?”同事回答:“你的查询太'WHERE'd(where’d)去了!”6. 一个开发者对另一个开发者说:“我的SQL查询速度慢得像蜗牛!”另一个开发者说:“那你就给你的查询添加一些'ESCARGOT'索引吧!”7. 一个SQL语句对另一个SQL语句说:“你看起来是个有条理的查询。
”另一个语句回答:“是的,我只是在按照'SELECT'顺序。
”8. 一名开发者在编写一条复杂的SQL查询时感到压力很大,他对自己说:“深呼吸,这只是个'JOIN'(接合)的过程!”只见他转身离开,决定去参加瑜伽课程以减压。
sql 复杂条件语句
sql 复杂条件语句当涉及到复杂的条件语句时,SQL(结构化查询语言)提供了多种运算符和函数,使您能够构建复杂的查询和条件。
以下是一些常用的复杂条件语句示例:1.使用AND和OR运算符:sqlSELECT * FROM table_name WHERE column1 = 'value1'AND column2 = 'value2';SELECT * FROM table_name WHERE column1 = 'value1'OR column2 = 'value2';2.使用IN运算符:sqlSELECT * FROM table_name WHERE column1 IN ('value1', 'value2', 'value3');3.使用BETWEEN运算符:sqlSELECT* FROM table_name WHERE column1 BETWEEN value1 AND value2;4.使用LIKE运算符进行模式匹配:sqlSELECT * FROM table_name WHERE column1 LIKE'pattern%';5.使用EXISTS子查询:sqlSELECT* FROM table_name WHERE EXISTS(SELECT1FROM another_table WHERE condition);6.使用CASE语句进行条件逻辑:sqlSELECT column1, column2,CASEWHEN condition1 THEN result1WHEN condition2 THEN result2ELSE result3END AS new_column_nameFROM table_name;这些示例只是复杂条件语句的一小部分。
高效SQL语句5篇
高效SQL语句5篇第一篇:高效SQL语句1.SELECT子句中避免使用“*”当你想在SELECT子句中列出所有的COLUMN时,使用动态SQL 列引用…*‟是一个方便的方法.不幸的是,这是一个非常低效的方法.实际上,ORACLE在解析的过程中, 会将“*” 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间.2.使用DECODE函数来减少处理时间使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表.例如:Sql代码1.SELECT COUNT(*),SUM(SAL)FROM EMP WHERE DEPT_NO = 0020 ANDENAME LIKE …SMITH%‟;2.SELECT COUNT(*),SUM(SAL)FROM EMP WHERE DEPT_NO = 0030 AND ENAME LIKE …SMITH%‟;SELECT COUNT(*),SUM(SAL)FROM EMP WHERE DEPT_NO = 0020 ANDENAME LIKE …SMITH%‟;SELECT COUNT(*),SUM(SAL)FROM EMP WHERE DEPT_NO = 0030 AND ENAME LIKE …SMITH%‟;你可以用DECODE函数高效地得到相同结果:Sql代码1.SELECT COUNT(DECODE(DEPT_NO,0020,‟X ‟,NULL))D0020_COUNT,2.COUNT(DECODE(DEPT_NO,0030,‟X ‟,NULL))D0030_COUNT,3.SUM(DECODE(DEPT_NO,0020,SAL,NUL L))D0020_SAL,4.SUM(DECODE(DEPT_NO,0030,SAL,NULL))D0030 _SAL5.FROM EMP WHERE ENAME LIKE …SMITH%‟;SELECT COUNT(DECODE(DEPT_NO,0020,‟X ‟,NULL))D0020_COUNT,COUNT(DECODE(DEPT_NO,0030,‟X ‟,NULL))D0030_COUNT,SUM(DECODE(DEPT_NO,0020,SAL,NULL))D0020_SAL,SUM(DECODE(DEPT_NO,0030,SAL,NULL))D0030_SA L FROM EMP WHERE ENAME LIKE …SMITH%‟;类似的,DECODE函数也可以运用于GROUP BY 和ORDER BY子句中.3.删除重复记录最高效的删除重复记录方法(因为使用了ROWID)Sql代码1.DELETE FROM EMP E WHERE E.ROWID >(SELECT MIN(X.ROWID)FROM EMP X WHERE X.EMP_NO = E.EMP_NO);DELETE FROM EMP E WHERE E.ROWID >(SELECT MIN(X.ROWID)FROM EMP X WHERE X.EMP_NO = E.EMP_NO);4.用TRUNCATE替代DELETE当删除表中的记录时,在通常情况下,回滚段(rollback segments)用来存放可以被恢复的信息,如果你没有COMMIT事务,ORACLE会将数据恢复到删除之前的状态(准确地说是恢复到执行删除命令之前的状况),而当运用TRUNCATE时, 回滚段不再存放任何可被恢复的信息.当命令运行后,数据不能被恢复.因此很少的资源被调用,执行时间也会很短.5.计算记录条数和一般的观点相反, count(*)比count(1)稍快,当然如果可以通过索引检索,对索引列的计数仍旧是最快的.例如 COUNT(EMPNO)6.用Where子句替换HAVING子句避免使用HAVING子句,HAVING 只会在检索出所有记录之后才对结果集进行过滤,这个处理需要排序、总计等操作,如果能通过WHERE子句限制记录的数目,那就能减少这方面的开销, 例如: Sql代码1.--低效2.SELECT REGION,AVG(LOG_SIZE)FROM LOCATION GROUP BY REGION HAVING REGION REGION!= …SYDNEY‟AND REGION!= …PERTH‟3.--高效4.SELECT REGION,AVG(LOG_SIZE)FROMLOCATION WHERE REGION REGION!= …SYDNEY‟ ND REGION!= …PERTH‟ GROUP BYREGION--低效SELECT REGION,AVG(LOG_SIZE)FROM LOCATION GROUP BY REGION HAVING REGION REGION!= …SYDNEY‟AND REGION!= …PERTH‟--高效SELECT REGION,AVG(LOG_SIZE)FROMLOCATION WHERE REGION REGION!= …SYDNEY‟ ND REGION!= …PERTH‟ GROUP BY REGION7.用EXISTS替代IN在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接.在这种情况下, 使用EXISTS(或NOT EXISTS)通常将提高查询的效率.Sql代码1.--低效2.SELECT * FROM EMP WHERE EMPNO > 0 AND DEPTNO IN(SELECT DEPTNO FROM DEPT WHERE LOC = …MELB‟)3.--高效:4.SELECT * FROM EMP WHERE EMPNO > 0 AND EXISTS(SELECT …X‟FROM DEPT WHERE DEPT.DEPTNO = EMP.DEPTNO AND LO C = …MELB‟)--低效SELECT * FROM EMP WHERE EMPNO > 0 AND DEPTNO IN(SELECT DEPTNO FROM DEPT WHERE LOC = …MELB‟) --高效:SELECT * FROM EMP WHERE EMPNO > 0 AND EXISTS(SELECT …X‟FROM DEPT WHERE DEPT.DEPTNO = EMP.DEPTNO AND LOC = …MELB‟)8.用NOT EXISTS替代NOT IN在子查询中,NOT IN子句将执行一个内部的排序和合并.无论在哪种情况下,NOT IN都是最低效的(因为它对子查询中的表执行了一个全表遍历).为了避免使用NOT IN,我们可以把它改写成外连接(Outer Joins)或NOT EXISTS.例如:SELECT …FROM EMPWHERE DEPT_NO NOT IN(SELECT DEPT_NO FROM DEPT WHERE DEPT_CAT=‟A‟);Sql代码1.--为了提高效率改写为:(方法一: 高效)SELECT ….FROM EMP A,DEPT B WHERE A.DEPT_NO = B.DEPT(+)AND B.DEPT_NO IS NULL AND B.DEPT_CAT(+)= …A‟2.--(方法二: 最高效)SELECT ….FROM EMP E WHERE NOT EXISTS(SELECT …X‟FROM DEPT D WHERE D.DEPT_NO = E.DEPT_NO AND DEPT_CAT = …A‟);3.--为了提高效率改写为:(方法一: 高效)SELECT ….FROM EMP A,DEPT B WHERE A.DEPT_NO =B.DEPT(+)AND B.DEPT_NO IS NULL AND B.DEPT_CAT(+)= …A‟4.--(方法二: 最高效)SELECT ….FROM EMP E WHERE NOT EXISTS(SELECT …X‟FROM DEPT D WHERE D.DEPT_NO = E.DEPT_NO AND DEPT_CAT = …A‟);9.用EXISTS替换DISTINCT当提交一个包含一对多表信息(比如部门表和雇员表)的查询时,避免在SELECT子句中使用DISTINCT.一般可以考虑用EXIST替换例如: Sql代码1.--低效:2.SELECT DISTINCT DEPT_NO,DEPT_NAMEFROM DEPT D,EMP E WHERE D.DEPT_NO = E.DEPT_NO3.--高效:4.SELECT DEPT_NO,DEPT_NAMEFROM DEPT D WHERE EXISTS(SELECT …X‟FROM EMP E WHERE E.DEPT_NO =D.DEPT_NO);5.--EXISTS 使查询更为迅速,因为RDBMS核心模块将在子查询的条件一旦满足后,立刻返回结果.--低效:SELECT DISTINCT DEPT_NO,DEPT_NAMEFROM DEPT D,EMP E WHERE D.DEPT_NO = E.DEPT_NO--高效:SELECT DEPT_NO,DEPT_NAMEFROM DEPT D WHERE EXISTS(SELECT …X‟FROM EMP E WHERE E.DEPT_NO = D.DEPT_NO);--EXISTS 使查询更为迅速,因为RDBMS核心模块将在子查询的条件一旦满足后,立刻返回结果.10.用索引提高效率索引是表的一个概念部分,用来提高检索数据的效率,实际上ORACLE使用了一个复杂的自平衡B-tree结构,通常通过索引查询数据比全表扫描要快,当ORACLE找出执行查询和Update语句的最佳路径时,ORACLE优化器将使用索引,同样在联结多个表时使用索引也可以提高效率,另一个使用索引的好处是,它提供了主键(primary key)的唯一性验证,除了那些LONG或LONG RAW数据类型, 你可以索引几乎所有的列.通常, 在大型表中使用索引特别有效.当然,你也会发现, 在扫描小表时,使用索引同样能提高效率,虽然使用索引能得到查询效率的提高,但是我们也必须注意到它的代价.索引需要空间来存储,也需要定期维护,每当有记录在表中增减或索引列被修改时,索引本身也会被修改,这意味着每条记录的INSERT , DELETE , UPDATE将为此多付出4 , 5 次的磁盘I/O,因为索引需要额外的存储空间和处理,那些不必要的索引反而会使查询反应时间变慢注:定期的重构索引是有必要的.11.避免在索引列上使用计算WHERE子句中,如果索引列是函数的一部分,优化器将不使用索引而使用全表扫描.举例:Sql代码1.--低效:2.SELECT …FROM DEPT WHERE SAL * 12 > 25000;3.--高效:4.SELECT … FROM DEPT WHERE SAL> 25000/12;--低效:SELECT …FROM DEPT WHERE SAL * 12 > 25000;--高效:SELECT … FROM DEPT WHERE SAL> 25000/12;12.用>=替代>Sql代码1.--如果DEPTNO上有一个索引2.--高效:SELECT *FROM EMPWHERE DEPTNO >=43.--低效:SELECT *FROM EMPWHERE DEPTNO >3--如果DEPTNO上有一个索引 4.--高效:SELECT *FROM EMPWHERE DEPTNO >=45.--低效:SELECT *FROM EMPWHERE DEPTNO >3两者的区别在于, 前者DBMS将直接跳到第一个DEPT等于4的记录而后者将首先定位到DEPTNO=3的记录并且向前扫描到第一个DEPT大于3的记录.第二篇:高效的SQL语句如何写高效率的SQL语句、Where子句中的连接顺序:ORACLE采用自下而上的顺序解析WHERE子句。
50个常用sql语句实例(学生表_课程表_成绩表_教师表)
Student(S#,Sname,Sage,Ssex) 学生表Course(C#,Cname,T#) 课程表SC(S#,C#,score) 成绩表Teacher(T#,Tname) 教师表create table Student(S# varchar(20),Sname varchar(10),Sage int,Ssex varchar(2))前面加一列序号:ifexists(select table_name from information_schema.tableswhere table_name='Temp_Table')drop table Temp_Tablegoselect 排名=identity(int,1,1),* INTO Temp_Table from Studentgoselect * from Temp_Tablegodrop database [ ] --删除空的没有名字的数据库问题:1、查询“”课程比“”课程成绩高的所有学生的学号;select a.S# from (select s#,score from SC where C#='001') a,(select s#,scorefrom SC where C#='002') bwhere a.score>b.score and a.s#=b.s#;2、查询平均成绩大于分的同学的学号和平均成绩;select S#,avg(score)from scgroup by S# having avg(score) >60;3、查询所有同学的学号、姓名、选课数、总成绩;select Student.S#,Student.Sname,count(SC.C#),sum(score)from Student left Outer join SC on Student.S#=SC.S#group by Student.S#,Sname4、查询姓“李”的老师的个数;select count(distinct(Tname))from Teacherwhere Tname like '李%';5、查询没学过“叶平”老师课的同学的学号、姓名;select Student.S#,Student.Snamefrom Studentwhere S# not in (select distinct( SC.S#) from SC,Course,Teacher where SC.C#=Course.C# and Teacher.T#=Course.T# and Teacher.Tname='叶平');6、查询学过“”并且也学过编号“”课程的同学的学号、姓名;select Student.S#,Student.Sname from Student,SC whereStudent.S#=SC.S# and SC.C#='001'and exists( Select * from SC as SC_2 where SC_2.S#=SC.S# and SC_2.C#='002');7、查询学过“叶平”老师所教的所有课的同学的学号、姓名;select S#,Snamefrom Studentwhere S# in (select S# from SC ,Course ,Teacher where SC.C#=Course.C# and Teacher.T#=Course.T# and Teacher.Tname='叶平' group by S# having count(SC.C#)=(select count(C#) from Course,Teacher whereTeacher.T#=Course.T# and Tname='叶平'));8、查询课程编号“”的成绩比课程编号“”课程低的所有同学的学号、姓名;Select S#,Sname from (select Student.S#,Student.Sname,score ,(select score from SC SC_2 where SC_2.S#=Student.S# and SC_2.C#='002') score2 from Student,SC where Student.S#=SC.S# and C#='001') S_2 where score2 <score;9、查询所有课程成绩小于分的同学的学号、姓名;select S#,Snamefrom Studentwhere S# not in (select Student.S# from Student,SC where S.S#=SC.S# and score>60);10、查询没有学全所有课的同学的学号、姓名;select Student.S#,Student.Snamefrom Student,SCwhere Student.S#=SC.S# group by Student.S#,Student.Sname having count(C#) <(select count(C#) from Course);11、查询至少有一门课与学号为“”的同学所学相同的同学的学号和姓名;select S#,Sname from Student,SC where Student.S#=SC.S# and C# in select C# from SC where S#='1001';12、查询至少学过学号为“”同学所有一门课的其他同学学号和姓名;select distinct SC.S#,Snamefrom Student,SCwhere Student.S#=SC.S# and C# in (select C# from SC where S#='001');13、把“SC”表中“叶平”老师教的课的成绩都更改为此课程的平均成绩;update SC set score=(select avg(SC_2.score)from SC SC_2where SC_2.C#=SC.C# ) from Course,Teacher where Course.C#=SC.C# and Course.T#=Teacher.T# and Teacher.Tname='叶平');14、查询和“”号的同学学习的课程完全相同的其他同学学号和姓名;select S# from SC where C# in (select C# from SC where S#='1002') group by S# having count(*)=(select count(*) from SC whereS#='1002');15、删除学习“叶平”老师课的SC表记录;Delect SCfrom course ,Teacherwhere Course.C#=SC.C# and Course.T#= Teacher.T# and Tname='叶平';16、向SC表中插入一些记录,这些记录要求符合以下条件:没有上过编号“”课程的同学学号、、号课的平均成绩;Insert SC select S#,'002',(Select avg(score)from SC where C#='002') from Student where S# not in (Select S# from SC where C#='002');17、按平均成绩从高到低显示所有学生的“数据库”、“企业管理”、“英语”三门的课程成绩,按如下形式显示:学生ID,,数据库,企业管理,英语,有效课程数,有效平均分SELECT S# as 学生ID,(SELECT score FROM SC WHERE SC.S#=t.S# AND C#='004') AS 数据库,(SELECT score FROM SC WHERE SC.S#=t.S# AND C#='001') AS 企业管理,(SELECT score FROM SC WHERE SC.S#=t.S# AND C#='006') AS 英语,COUNT(*) AS 有效课程数, AVG(t.score) AS 平均成绩FROM SC AS tGROUP BY S#ORDER BY avg(t.score)18、查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分SELECT L.C# As 课程ID,L.score AS 最高分,R.score AS 最低分FROM SC L ,SC AS RWHERE L.C# = R.C# andL.score = (SELECT MAX(IL.score)FROM SC AS IL,Student AS IMWHERE L.C# = IL.C# and IM.S#=IL.S#GROUP BY IL.C#)ANDR.Score = (SELECT MIN(IR.score)FROM SC AS IRWHERE R.C# = IR.C#GROUP BY IR.C#);19、按各科平均成绩从低到高和及格率的百分数从高到低顺序SELECT t.C# AS 课程号,max(ame)AS 课程名,isnull(AVG(score),0) AS 平均成绩,100 * SUM(CASE WHEN isnull(score,0)>=60 THEN 1 ELSE 0 END)/COUNT(*) AS 及格百分数FROM SC T,Coursewhere t.C#=course.C#GROUP BY t.C#ORDER BY 100 * SUM(CASE WHEN isnull(score,0)>=60 THEN 1 ELSE 0 END)/COUNT(*) DESC20、查询如下课程平均成绩和及格率的百分数(用"1行"显示): 企业管理(),马克思(),OO&UML (),数据库()SELECT SUM(CASE WHEN C# ='001' THEN score ELSE 0 END)/SUM(CASE C# WHEN '001' THEN 1 ELSE 0 END) AS 企业管理平均分,100 * SUM(CASE WHEN C# = '001' AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = '001' THEN 1 ELSE 0 END) AS 企业管理及格百分数,SUM(CASE WHEN C# = '002' THEN score ELSE 0 END)/SUM(CASE C# WHEN '002' THEN 1 ELSE 0 END) AS 马克思平均分,100 * SUM(CASE WHEN C# = '002' AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = '002' THEN 1 ELSE 0 END) AS 马克思及格百分数,SUM(CASE WHEN C# = '003' THEN score ELSE 0 END)/SUM(CASE C# WHEN '003' THEN 1 ELSE 0 END) AS UML平均分,100 * SUM(CASE WHEN C# = '003' AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = '003' THEN 1 ELSE 0 END) AS UML及格百分数,SUM(CASE WHEN C# = '004' THEN score ELSE 0 END)/SUM(CASE C# WHEN '004' THEN 1 ELSE 0 END) AS 数据库平均分,100 * SUM(CASE WHEN C# = '004' AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = '004' THEN 1 ELSE 0 END) AS 数据库及格百分数FROM SC21、查询不同老师所教不同课程平均分从高到低显示SELECT max(Z.T#) AS 教师ID,MAX(Z.Tname) AS 教师姓名,C.C# AS 课程ID,MAX(ame) AS 课程名称,AVG(Score) AS 平均成绩FROM SC AS T,Course AS C ,Teacher AS Zwhere T.C#=C.C# and C.T#=Z.T#GROUP BY C.C#ORDER BY AVG(Score) DESC22、查询如下课程成绩第名到第名的学生成绩单:企业管理(),马克思(),UML (),数据库()[学生ID],[学生姓名],企业管理,马克思,UML,数据库,平均成绩SELECT DISTINCT top 3SC.S# As 学生学号,Student.Sname AS 学生姓名,T1.score AS 企业管理,T2.score AS 马克思,T3.score AS UML,T4.score AS 数据库,ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0) as 总分FROM Student,SC LEFT JOIN SC AS T1ON SC.S# = T1.S# AND T1.C# = '001'LEFT JOIN SC AS T2ON SC.S# = T2.S# AND T2.C# = '002'LEFT JOIN SC AS T3ON SC.S# = T3.S# AND T3.C# = '003'LEFT JOIN SC AS T4ON SC.S# = T4.S# AND T4.C# = '004'WHERE student.S#=SC.S# andISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0)NOT IN(SELECTDISTINCTTOP 15 WITH TIESISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0)FROM scLEFT JOIN sc AS T1ON sc.S# = T1.S# AND T1.C# = 'k1'LEFT JOIN sc AS T2ON sc.S# = T2.S# AND T2.C# = 'k2'LEFT JOIN sc AS T3ON sc.S# = T3.S# AND T3.C# = 'k3'LEFT JOIN sc AS T4ON sc.S# = T4.S# AND T4.C# = 'k4'ORDER BY ISNULL(T1.score,0) + ISNULL(T2.score,0) +ISNULL(T3.score,0) + ISNULL(T4.score,0) DESC);23、统计列印各科成绩,各分数段人数:课程ID,课程名称,[100-85],[85-70],[70-60],[ <60]SELECT SC.C# as 课程ID, Cname as 课程名称,SUM(CASE WHEN score BETWEEN 85 AND 100 THEN 1 ELSE 0 END) AS [100 - 85],SUM(CASE WHEN score BETWEEN 70 AND 85 THEN 1 ELSE 0 END) AS [85 - 70],SUM(CASE WHEN score BETWEEN 60 AND 70 THEN 1 ELSE 0 END) AS [70 - 60],SUM(CASE WHEN score < 60 THEN 1 ELSE 0 END) AS [60 -] FROM SC,Coursewhere SC.C#=Course.C#GROUP BY SC.C#,Cname;24、查询学生平均成绩及其名次SELECT 1+(SELECT COUNT( distinct 平均成绩)FROM (SELECT S#,AVG(score) AS 平均成绩FROM SCGROUP BY S#) AS T1WHERE 平均成绩> T2.平均成绩) as 名次,S# as 学生学号,平均成绩FROM (SELECT S#,AVG(score) 平均成绩FROM SCGROUP BY S#) AS T2ORDER BY 平均成绩desc;25、查询各科成绩前三名的记录:(不考虑成绩并列情况)SELECT t1.S# as 学生ID,t1.C# as 课程ID,Score as 分数FROM SC t1WHERE score IN (SELECT TOP 3 scoreFROM SCWHERE t1.C#= C#ORDER BY score DESC)ORDER BY t1.C#;26、查询每门课程被选修的学生数select c#,count(S#) from sc group by C#;27、查询出只选修了一门课程的全部学生的学号和姓名select SC.S#,Student.Sname,count(C#) AS 选课数from SC ,Studentwhere SC.S#=Student.S# group by SC.S# ,Student.Sname havingcount(C#)=1;28、查询男生、女生人数Select count(Ssex) as 男生人数from Student group by Ssex having Ssex='男';Select count(Ssex) as 女生人数from Student group by Ssex having Ssex='女';29、查询姓“张”的学生名单SELECT Sname FROM Student WHERE Sname like '张%';30、查询同名同性学生名单,并统计同名人数select Sname,count(*) from Student group by Sname having count(*)>1;;31、年出生的学生名单(注:Student表中Sage列的类型是datetime)select Sname, CONVERT(char (11),DATEPART(year,Sage)) as agefrom studentwhere CONVERT(char(11),DATEPART(year,Sage))='1981';32、查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列Select C#,Avg(score) from SC group by C# order by Avg(score),C# DESC ;33、查询平均成绩大于的所有学生的学号、姓名和平均成绩select Sname,SC.S# ,avg(score)from Student,SCwhere Student.S#=SC.S# group by SC.S#,Sname havingavg(score)>85;34、查询课程名称为“数据库”,且分数低于的学生姓名和分数Select Sname,isnull(score,0)from Student,SC,Coursewhere SC.S#=Student.S# and SC.C#=Course.C# and ame='数据库'and score <60;35、查询所有学生的选课情况;SELECT SC.S#,SC.C#,Sname,CnameFROM SC,Student,Coursewhere SC.S#=Student.S# and SC.C#=Course.C# ;36、查询任何一门课程成绩在分以上的姓名、课程名称和分数;SELECT distinct student.S#,student.Sname,SC.C#,SC.scoreFROM student,ScWHERE SC.score>=70 AND SC.S#=student.S#;37、查询不及格的课程,并按课程号从大到小排列select c# from sc where scor e <60 order by C# ;38、查询课程编号为且课程成绩在分以上的学生的学号和姓名;select SC.S#,Student.Sname from SC,Student where SC.S#=Student.S# and Score>80 and C#='003';39、求选了课程的学生人数select count(*) from sc;40、查询选修“叶平”老师所授课程的学生中,成绩最高的学生姓名及其成绩select Student.Sname,scorefrom Student,SC,Course C,Teacherwhere Student.S#=SC.S# and SC.C#=C.C# and C.T#=Teacher.T# and Teacher.Tname='叶平' and SC.score=(select max(score)from SC whereC#=C.C# );41、查询各个课程及相应的选修人数select count(*) from sc group by C#;42、查询不同课程成绩相同的学生的学号、课程号、学生成绩select distinct A.S#,B.score from SC A ,SC B where A.Score=B.Score and A.C# <>B.C# ;43、查询每门功成绩最好的前两名SELECT t1.S# as 学生ID,t1.C# as 课程ID,Score as 分数FROM SC t1WHERE score IN (SELECT TOP 2 scoreFROM SCWHERE t1.C#= C#ORDER BY score DESC)ORDER BY t1.C#;44、统计每门课程的学生选修人数(超过人的课程才统计)。
SQL语句大全实例
SQL语句实例表操作例1 对于表的教学管理数据库中的表STUDENTS ,可以定义如下:CREATE TABLE STUDENTS(SNO NUMERIC (6, 0) NOT NULLSNAME CHAR (8) NOT NULLAGE NUMERIC(3,0)SEX CHAR(2)BPLACE CHAR(20)PRIMARY KEY(SNO))例2 对于表的教学管理数据库中的表ENROLLS ,可以定义如下: CREATE TABLE ENROLLS(SNO NUMERIC(6,0) NOT NULLCNO CHAR(4) NOT NULLGRADE INTPRIMARY KEY(SNO,CNO)FOREIGN KEY(SNO) REFERENCES STUDENTS(SNO)FOREIGN KEY(CNO) REFERENCES COURSES(CNO)CHECK ((GRADE IS NULL) OR (GRADE BETWEEN 0 AND 100)))例3 根据表的STUDENTS 表,建立一个只包含学号、姓名、年龄的女学生表。
CREATE TABLE GIRLAS SELECT SNO, SNAME, AGEFROM STUDENTSWHERE SEX=' 女';例4 删除教师表TEACHER 。
DROP TABLE TEACHER例5 在教师表中增加住址列。
ALTER TABLE TEACHERSADD (ADDR CHAR(50))例6 把STUDENTS 表中的BPLACE 列删除,并且把引用BPLACE 列的所有视图和约束也一起删除。
ALTER TABLE STUDENTSDROP BPLACE CASCADE例7 补充定义ENROLLS 表的主关键字。
ALTER TABLE ENROLLSADD PRIMARY KEY (SNO,CNO) ;视图操作(虚表)例9 建立一个只包括教师号、姓名和年龄的视图FACULTY 。
sql常用语句用法
sql常用语句用法以下是SQL中一些常用的语句和用法:1.SELECT语句:用于从数据库中查询数据。
- 示例:SELECT * FROM table_name;- 说明:*代表所有列,table_name是要查询的表名。
2.INSERTINTO语句:用于向数据库的表中插入新的记录。
- 示例:INSERT INTO table_name (column1, column2, ...) VALUES (value1, value2, ...);- 说明:column1, column2是表的列名,value1, value2是要插入的值。
3.UPDATE语句:用于更新数据库表中的记录。
- 示例:UPDATE table_name SET column1 = value1, column2 = value2, ... WHERE condition;- 说明:table_name是要更新的表名,column1, column2是要更新的列名,value1, value2是要更新的值,condition是更新条件。
4.DELETEFROM语句:用于从数据库表中删除记录。
- 示例:DELETE FROM table_name WHERE condition;- 说明:table_name是要删除记录的表名,condition是删除记录的条件。
5.CREATETABLE语句:用于创建数据库表。
- 示例:CREATE TABLE table_name (column1 datatype, column2 datatype, ...);- 说明:table_name是要创建的表名,column1, column2是表的列名,datatype是列的数据类型。
6.ALTERTABLE语句:用于修改数据库表的结构。
- 示例:ALTER TABLE table_name ADD column_name datatype;- 说明:table_name是要修改的表名,column_name是要添加的列名,datatype是列的数据类型。
