SQL练习题

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

例题
1、写出一条Sql语句:取出表 A中第31到第40记录(Mysql )select * from A limit 30, 10
MS-SQLServer
解 1 : select top 10 * from A where id not in (select top 30 id from A)
解 2 : select top 10 * from A where id > (select max(id) from (select top 30 id from A )as A)
解 3 : select * from (select *, Row_Number() OVER (ORDER BY id asc) rowid FROM A) as A where rowid
betwee n 31 and 40
Oracle
select *
from (select A.*,
row_nu mber() over (order by id asc) rank
FROM A)
where rank >=31 AND ran k<=40;
2、用一条SQL语句
查询出每门课都大于 80分的学生姓名
n ame keche ng fen shu
张三语文81
张三数学75
李四语文76
李四数学90
王五语文
81
王五数学
100
王五英语90
A: select distinet name from table where name not in (select distinet name from tabl e where fenshu<=80)
select name from table group by name having min(fenshu)>80
3、学生表如下:
自动编号学号姓名课程编号课程名称分数
1 2005001 张三0001 数学69
2 2005002 李四0001 数学89
3 2005001 张三0001 数学69
删除除了自动编号不同,其他都相同的学生冗余信息
A: delete table name where 自动编号not in (select mi n(自动编号)from
table name group by学号,姓名,课程编号,课程名称,分数)
4、请用SQL语句实现:
从TestDB数据表中查询出所有月份的发生额都比101科目相应月份的发生额高的科目。


注意:TestDB中有很多科目,都有1 - 12月份的发生额。

AccID :科目代码,Occmonth :发生额月份,DebitOccur :发生额。

数据库名:JcyAudit,数据集:Select * from TestDB
答:select a.* from TestDB a ,(select Occmonth,max(DebitOccur) Debit101ccur from TestDB where AccID='101' gro up by Occm on th) b
where a.Occmonth=b.Occmonth and a.DebitOccur>b.Debit101ccur
个叫team的表,
里面只有一个字段name, 一共有4条纪录,分别是a,b,c,d,对应四个球对,现在四个球对进行比赛,用一条sql语句显示所有可能的比赛组合.
你先按你自己的想法做一下,看结果有我的这个简单吗?
select a.n ame, b. name from team a, team b
where a.n ame < b.n ame
6、面试题:怎么把这样一个表儿
year month amount
查成这样一个结果
year m1 m2 m3 m4
1991 1.1 1.2 1.3 1.4
1992 2.1 2.2 2.3 2.4
答案一、
select year,
(select amount from aaa m where month=1 and m.year=aaa.year) as m1,
(select amount from aaa m where month=2 and m.year二aaa.year) as m2,
(select amount from aaa m where month=3 and m.year=aaa.year) as
m3,
(select amount from aaa m where month=4 and m.year=aaa.year) as
m4
from aaa group by year
7、说明:复制表(只复制结构,源表名:a新表名:b)
SQL: select * into b from a where 1<>1 (where1=1,拷贝表结构和数据内容
Oraclecreate table b
As
Select * from a where 1=2
[<> (不等于)(SQL Server Comp act)
比较两个表达式。

当使用此运算符比较非空表达式时,如果左操作数不等于右操作数,则结果为TRUE。

否则,结果为FALSE。

]
8、说明:拷贝表(拷贝数据,源表名:a目标表名:b)
SQL: insert into b(a, b, c) select d,e,f from a;
9、说明:显示文章、提交人和最后回复时间
fr SQL: select a.title,ername,b.adddate from table a,(select max(adddate) adddate
om table where table.title=a.title) b
10.说明:外连接查询(表名1 : a表名2 : b)SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUTER JOIN b ON a.a = b.c
ORACLE : select a.a, a.b, a.c, b.c, b.d, b.f from a ,b
where a.a = b.c(+)
均有key 和value 两个字段,如果 B 的key 在 A 中也有,就把 B 的value 换为A 中对应的value
这道题的SQL 语句怎么写?
up date b set b.value=(select a.value from a where a.key=b.key) where b.id in (select b.id from b,a where b.key=a.key);
高级sql 面试题
14.原表:
courseid course name score 1 Java 70 2 oracle 90 3 xml 40
11.说明: 日程安排提前五分钟提醒
SQL: select
* from 日程安排 where datediff('minute',f 开始时间,getdate())>5
12.说明: 两张关联表, 删除主表中已经在副表中没有的信息
SQL: Delete from
info where not exists (select * from infobz where info.infid=infobz.infid )
13.有两个表A 和B ,
4jsp 30
5servlet 80
为了便于阅读,查询此表后的结果显式如下(及格分数为60):
courseid course name score mark
1Java 70 pass
2oracle 90 pass
3xml 40 fail
4jsp 30 fail
5servlet 80 pass
写出此查询语句
select courseid, course name ,score ,decode ( sig n(score-60),-1,'fail',' pass') as mark fro m course (SQL: select courseid, course name ,score , ( case whe n score<60 the n 'fail' else 'pas s' end) as mark from course )
ORACLE : select courseid, course name ,score ,decode ( sig n(score-60),-1,'fail',' pass') as mark from course (DECODE 函数是ORACLE PL/SQL是功能强大的函数之一,目前还只有ORACLE公司的
SQL提供了此函数)
完全正确
SQL> desc course_v
Name Null? Type
精选文库COURSEID NUMBER
COURSENAME VARCHAR2(10)
SCORE NUMBER
SQL> select * from course_v;
COURSEID COURSENAME SCORE
java 70
oracle 90
xml 40
jsp 30
servlet 80
SQL> select courseid, course name ,score ,decode(sig n(score-60),-1,'fail',' pass') as ma rk from course_v;
COURSEID COURSENAME SCORE MARK
java 70 pass
oracle 90 pass
xml 40 fail create table testtable1 id int IDENTITY, department varchar(12)
jsp 30 fail
servlet 80 pass
15.SQL 面试题(1 )
/*
用一条SQL 语句,怎么显示如下结果
id dp tID department name
1 1 设计 张三
2 1 设计 李四
3 2 市场 王五 4
3
售后 彭六 5 4 黑人
陈七
*/
答案:
testtable2.* , ISNULL (department,'黑人')
FROM testtable1 right join testtable2 on testtable2.dptID = testtable1.ID
select in sert * from testtable1 into
testtable1 in sert values ('设计') values ('市场')
in sert into testtable1
into testtable1 values ('售后') /*
结果
id 1
dep artme nt 设计 市场 售后
*/ create table testtable2

id int dp tID n ame IDENTITY, int, varchar (12) )
in sert into testtable2 in sert into testtable2 in sert into testtable2 in sert into testtable2 in sert into testtable2
values (1,'张三') values (1,'李四') values (2,'王五') values©,'
彭六')
values (4,'陈七')
SELECT
也做出来了可比这方法稍复杂。

/
16.sql 面试题(2)
有表A ,结构如下:
12 02 8 01 11 01 3

中:p_ID 为产品ID ,p_Num 为产品库存量,s_id 为仓库ID 。

请用SQL 语句实现将上表 中的数据合并,合并后的数据为:
p_ID s1_id s2_id s3_id 1 10 12 0
3 11 0 8
其中:s1_id 为仓库1的库存量,s2_id 为仓库 2的库存量,s3_id 为仓库 3的库存量。

如果 该产品在某仓库中无库存量,那么就是 0代替。

结果:
select p_id ,
sum(case when s_id=1 then p_num else 0 end) as s1_id ,sum(case when s_id=2 then p_num else 0 end) as s2_id ,sum(case when s_id=3 then p_num else 0 end) as s3_id from myPro group by p_id
什么是相关子查询?如何使用这些查询? 经验更加丰富的开发人员将能够准确地描述这种类型的查询。

相关子查询是一种包含子查询的特殊类型的查询。

查询里包含的子查询会真正请求外部查询 的值,从而形成一个类似于循环的状况。

A: p_ID p_Num s_id 1 10 01
8 03
19、为管理业务培训信息,建立 3个表:
S(S#,SN,SD,SA)S#,SN,SD,SA 分别代表学号,学员姓名,所属单位,学员年龄
C(C#,CN)C#,CN 分别代表课程编号,课程名称
SC(S#,C#,G) S#,C#,G 分别代表学号,所选的课程编号,学习成绩
(1)使用标准SQL 嵌套语句查询选修课程名称为’税收基础'的学员学号和姓名?
答案:select s# ,sn from s where S# in (select S# from c,sc where c.c#=sc.c# and 切=税收基础‘)
SQL 嵌套语句查询选修课程编号为‘ C 的学员姓名和所属单位? 2.查询表A 中存在ID 重复三次以上的记录,完整的查询语句如下: select * from(select count(ID) as count from table group by ID)T where T.count>3
(2)使用标准
答: select sn,sd
from s,sc where s.s#=sc.s# and sc.c#= ' c2'
(3)使用标准
SQL 嵌套语句查询不选修课程编号为‘ C5勺学员姓名和所属单位? 答: select sn,sd
from s where s# not in (select s# from sc where c#=' c5')
(4)查询选修了课程的学员人数
答: select 学员人数=count(distinet s#) from sc
(5)查询选修课程超过5门的学员学号和所属单位?
答: net
select sn,sd from s where s# in (select s# from sc group by s# hav ing coun t(disti c#)>5)
18、SQL 面试题(4)
1.查询A(ID,Name)表中第31至40条记录,ID 作为主键可能是不是连续增长的列,
完整的
查询语句如下:
select top 10 * from A where ID >(select max(ID) from (select top 30 ID from A order by A ) T) order by A
简答题部分
1.触发器的作用?
答:触发器是一中特殊的存储过程,主要是通过事件来触发而被执行的。

它可以强化约束,来维护数据的完整性和一致性,可以跟踪数据库内的操作从而不允许未经许可的更新和变化。

可以联级运算。

如,某表上的触发器上包含对另一个表的数据操作,而该操作又会导致该表触发器被触发。

2。

什么是存储过程?用什么来调用?
答:存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需创建一次,以后在该程序中就可以调用多次。

如果某次操作需要执行多次SQL,使用存储过程比单纯S QL语句执行要快。

可以用一个命令对象来调用存储过程。

3。

索引的作用?和它的优点缺点是什么?
答:索引就一种特殊的查询表,数据库的搜索引擎可以利用它加速对数据的检索。

它很类似与现实生活中书的目录,不需要查询整本书内容就可以找到想要的数据。

索引可以是唯一的, 创建索引允许指定单个列或者是多个列。

缺点是它减慢了数据录入的速度,同时也增加了数据库的尺寸大小。

3。

什么是内存泄漏?
答:一般我们所说的内存泄漏指的是堆内存的泄漏。

堆内存是程序从堆中为其分配的,大小任意的,使用完后要显示释放内存。

当应用程序用关键字new等创建对象时,就从堆中为它
分配一块内存,使用完后程序调用free或者delete释放该内存,否则就说该内存就不能被使用,我们就说该内存被泄漏了。

4。

维护数据库的完整性和一致性,你喜欢用触发器还是自写业务逻辑?为什么?
答:我是这样做的,尽可能使用约束,如check,主键,外键,非空字段等来约束,这样做效率最高,也最方便。

其次是使用触发器,这种方法可以保证,无论什么业务系统访问数据库都可以保证数据的完整新和一致性。

最后考虑的是自写业务逻辑,但这样做麻烦,编程复杂,效率低下。

5。

什么是事务?什么是锁?
答:事务就是被绑定在一起作为一个逻辑工作单元的SQL语句分组,如果任何一个语句操作
失败那么整个操作就被失败,以后操作就会回滚到操作前状态,或者是上有个节点。

为了确保要么执行,要么不执行,就可以使用事务。

要将有组语句作为事务考虑,就需要通过ACI D测试,即原子性,一致性,隔离性和持久性。

锁:在所以的DBMS中,锁是实现事务的关键,锁可以保证事务的完整性和并发性。

与现实生活中锁一样,它可以使某些数据的拥有者,在某段时间内不能使用某些数据或数据结构。

当然锁还分级别的。

6。

什么叫视图?游标是什么?
答:视图是一种虚拟的表,具有和物理表相同的功能。

可以对视图进行增,改,查,操作,试图通常是有一个表或者多个表的行或列的子集。

对视图的修改不影响基本表。

它使得我们获取数据更容易,相比多表查询。

游标:是对查询出来的结果集作为一个单元来有效的处理。

游标可以定在该单元中的特定行, 从结果集的当前行检索一行或多行。

可以对结果集当前行做修改。

一般不使用游标,但是需要逐条处理数据的时候,游标显得十分重要。

SQL数据库面试题以及答案(50例题)
htip s:///hundan_520520/article/details/54881208
Stude nt(Sid,S name,Sage,Ssex) 学生表
Sid :学号
Sn ame :学生姓名
Sage :学生年龄
Ssex :学生性别
Course(Cid,C name,T#) 课程表
Cid :课程编号
精选文库Cname:课程名称
Tid :教师编号
SC(Sid,Cid,score) 成绩表
Sid :学号
Cid :课程编号
score :成绩
Teacher(Tid,T name) 教师表
Tid :教师编号:
Tname:教师名字
问题:
1、查询“ 001课程比“ 002课程成绩高的所有学生的学

select a.sid from
(select sid,score from sc where cid= '001' )a,
(select sid,score from sc where cid= '002' )b
where a.sid = b.sid and a.score>b.score;
2、查询平均成绩大于 60分的同学的学号和平均成绩
select sid, avg (score) from sc group by sid
精选文库
having avg (score)〉 60;
3、查询所有同学的学号、
select
s.sid,s.s name,co un t_cid sum score as 总成绩
from student s left join
(select sid, count (cid) as count_cid, sum(score) from sc group by sid )sc on s.sid = sc.sid;
4、查询姓李的老师的个数:
select count (tname) from teacher where tname like '李 %';
5、查询没有学过 叶平”老师可的同学的学号、姓名
select s.sid,s.s name
from student as s
where s.sid
not in (
select DISTINCT sid
as 选课数,
as sum_score
精选文库from sc as sc where sc.cid in (
select cid
from course as c
left join teacher as t on c.tid = t.tid
where t.tname = '叶平')
);
6、查询学过叶平”老师所教的所有课的同学的学
select s.sid,s.s name from student as s where s.sid in (
select disti net sc.sid
from sc as sc
where sc.cid in
select cid from course as c left join teacher as t on c.tid = t.tid
where t.tname = '叶平')
group by sc.sid
精选文库HAVING count (cid)=
( select count (cid)
from course as c left join teacher as t on c.tid = t.tid
where t.tname = '叶平')
);
7、查询学过“011并且也学过编号“ 002课程的同学的学姓名:
SELECT s.sid,s.s name
from student as s
left join sc as sc on s.sid = sc.sid
where sc.cid = '001'
and EXISTS(
select from sc as sc 2
where sc.sid = sc 2.sid
and sc_2.cid= '002');
select s.sid,s.s name from student as
s left join sc as sc
on sc.sid = s.sid
where sc.cid = '001'
and s.sid in (
select sid from sc as sc_2
where sc_2.cid= '002'
and sc_2.sid = sc.sid);
8、查询课程编号“ 002的成绩比课程编号“ 001课程低的所有同学的
学号、姓名:
select sid,s name
from ( select student.sid,student.sname,score.
( select score from sc as sc_2
where sc 2.sid = student.sid
and sc_2.cid = '002' ) as score2
from student,sc
where student.sid=sc.sid and cid = '001' ) s_2
where score2<score;
9、查询所有课程成绩小于60的同学的学
号、
select sid,s name from student where sid not in
(select s.sid
from student s,sc
where s.sid=sc.sid and score> 60 );
select sid,s name
from student s
where not EXISTS (
select s.sid from sc
where sc.sid = s.sid and sc.score> 60);
10、查询没有学全所有课的同学的学号、select s.sid,s.s name
from student s ,sc sc
where s.sid = sc.sid
group by s.sid,s.s name
having count (sc.cid)<( select count (cid) from course);
select s.sid,s.s name from student s
join sc sc on s.sid = sc.sid
count (cid) from course);
select stude nt.sid,s name from student,sc where student.sid = sc.sid and cid in
(select cid from sc where sid= '1001');
group by s.sid,s.s name
hav ing
count (sc.cid)< 11、查询至少有一门课与学号为 名:
“1001同学所学相同的同学的学号和

right
(select
select s.sid,s.s name from sc sc left join student as s on sc.sid = s.sid
cid from sc where sid= '1001');
select sc_1.sid,s.s name
on sc_1.sid = s.sid
where
where sc l.cid = sc 2.cid
13、把“SC'表中 叶平”老师教的课的成绩都更改为此课程的平均成绩:
up date sc set score = where sc_2.cid = sc.cid) where cid in
where sc.cid in ( select from sc sc_1 left join
stude nt as s
exists ( select sc_2.cid
from sc as sc 2
and sc_2.sid = '1001' );
12、查询至少学过学号为
“ 001同学所有一门课的其他同学学号和姓名;
(select avg (sc_2.score) from sc sc_2
(select c.cid from course c left join teacher t on t.tid = c.tid
where t.tname =
'叶平');
1002号的同学学习的课程完全相同的其他同学学号和姓名:
select sc_1.sid
from sc where sid= '1002' )a
count (cid) from sc where sid= '1002');
left join stude nt s on a.sid = s.sid
14、查询和“ from ( select cid
left joi n sc sc_1 on a.cid = sc_1.cid
where sc 1.sid<> '1002'
group by sc_1.sid
hav ing
count (sc_1.cid)=
(select
select a.sid,s.s name from
(select sid,GROUP_CONCAT(cid order by cid sep arator ',')as cid_str
from sc where sid= '1002' )b,
(select sid,GROUP_CONCAT(cid order by cid sep arator ',')as cid_str
from sc
group by sid)a
where a.cid_str = b.cid_str and a.sid<> '1002'
15、删除学习 叶平”老师课的SC 表记录:
delete from sc WHERE Cid in ( select c.cid from course c LEFT JOIN teacher t on c.tid=t.tid where t.tname = '叶平'); 16、向SC 表中插入一些记录,这些记录要求符合以下条件:没有上过编 号“003”课程的同学学号、002号课的平均成绩:
insert into sc select sid, '002' (select avg (score) from sc where cid= '0022') from student
where sid not in ( select sid from sc where cid= '002'); 17、按平均成绩从高到低显示所有学生的 的课程成绩,按如下形式显示: 课程数,有效平均分:
学生 数据库”企业管理”英语”三门
ID ,数据库,企业管理,英语,有效
select sid as 学生 id ,
(SELECT score from sc where sc.sid = t.sid and cid= '004'
)as 数据库,
(select score from sc
where sc.sid = t.sid
and cid= '001'
)as 企业管理,
count (cid) as 有效课程数,avg (t.score) as 平均成绩
from sc as t group by sid
order by avg (t.score);
order by l.cid;
(select score from sc where sc.sid = t.sid
and cid= '015' ) as 英语,
18、查询各科成绩最高和最低的分: 最低分 以如下的形式显示:课程ID ,最高分,
select l.cid as 课程 id,l.score
as 最高分,
r.score as 最低分
from sc l,sc r
where l.cid = r.cid
and l.score =
(select max(t.score) from sc t where l.cid = t.cid group by t.cid)
and r.score =( select min (t.score) from sc t
where r.cid = t.cid
group by t.cid)
select cid as 课程id, max(score) as 最高分,
min (score) as 最低分
from sc group by cid;
19、按各科平均成绩从低到高和及格率的百分数从高到低顺序:
SELECTt.cid as 课程号,
ame as 课程名,
COALESCEavg (score), 0) as 平均成绩,
100*sum( case whe n COALESCE(score, 0)>= 60 then 1 else 0 END)/ count (*) as 及格百分数
from sc t left join course c on t.cid = c.cid group by t.cid order by 100*sum( case whe n COALESCE(score, 0)>= 60 then 1 else 0 END)/ count (*);
20、查询如下课程平均成绩和及格率的百分数 01)马克思(002),OO&UML —
,数据库(004):
21、查询不同老师所教不同课程平均分从高到低显示:
avg (score) as 平均成绩 from sc as sc
LEFT JOIN course c on sc.cid = c.cid
teacher t on c.tid = t.tid
查询如下课程成绩第 3名到第6名的学生成绩单:企业管理(001),
马克思(002),UML (003),数据库(004): 23、统计下列各科成绩,各分数段人数:课程 5-70],[70-60],[ 小于 60]:
select sc.cid as 课程 id,cname
as 课程名称,
sum( case whe n score betwee n 85 and 100 then 1 else 0 end) as '[100-85]'
sum( case whe n score betwee n 70 and 85 then else 0 end) as '[85-70]'
sum( case
whe n score betwee n 60 and 70 then else 0 end) as '[70-60]'
sum( case when score< 60 then 1 else 0 end)
as '[60-0]'
(用”1行”显示):企业管理(0
select
t.tid as 教师 id,
t.t name
as 教师姓名,
sc.cid
as 课程id.
group
by sc.cid
order by avg (sc.score) desc ;
left join 22、 ID ,课程名称,[100-85],[8
from sc as sc left join course as c on sc.cid = c.cid group by sc.cid;
24、查询学生平均成绩及其名次:
select 1 +(select count ( distinet 平均成绩)
from ( select sid, avg (score)
from sc group by sid)t1
sid as 学生学号,平均成绩
平均成绩 from sc group by sid) as t2 order by 平均成绩
desc ;
25、查询各科成绩前三名的记录(不考虑成绩并列情况)
select sid,cid,score from sc sc 1 where ( select count ( 3) from sc sc_2 where sc 1.cid = sc 2.cid and sc_2.score>=sc_1.score)<=
as 平均成绩
where 平均成绩>t2.平均成绩)
as 名次,
from ( select sid, avg (score)
精选文库order by sc_1.cid


26
查询每门课程被选修的学生数:

select cid, count (sid)
from sc
group by cid;
27
查询出只选修一门课程的全部学生的学号和姓名:

select sc.sid,s.s name.
count (sc.cid) as 课程数
from sc as sc
LEFT JOIN student as s
on sc.sid = s.sid
group by sc.sid
hav ing count (sc.cid)= 1;
28
查询男生、女生人数:

select count (ssex) as 男生人数
from student
group by ssex
having ssex = '男';
精选文库
having avg (sc.score)〉
85;
from student where sname like '张 %';
30、查询同名同姓的学生名单,并统计同名人数:
select sname, count ( 8)
from student
1981年出生的学生名单(注: student 表中sage 列的类型是dateti me )
查询平均成绩大于85的所有学生的学号、姓名和平均成绩:
from sc as sc left join stude nt as on sc.sid = s.sid
group by sc.sid
select count ( 2) from student
where ssex =
'女';
29、
查询姓 张”的学生名单: select
sid,s name
group by sn ame
hav ing
count ( 8)> 1;
31、 32、 select
s.s name,sc.sid.
avg (sc.score) as 平均成绩
33、查询每门课程的平均成绩,结果按平均成绩升序排序,平均成绩相同 时,按课程号降序排列:
select Cid, avg (score)
from sc
查询课程名称为 数据库,且分数低于60的学生名字和分数:
ame,s.sid,s.s name,sc.score
from course c
left joi n sc on sc.cid = c.cid
LEFT JOIN student s on s.sid = sc.sid
where ame =
'数据库'and sc.score< 60;
35、查询所有学生的选课情况:
select sc.sid,sc.cid,s.s name,ame
from sc
LEFT JOIN course c on sc.cid = c.cid
left join stude nt s on sc.sid = s.sid;
36、查询任何一门课程成绩在 70分以上的姓名、课程名称和分数:
select disti net s.sid,s.s name,sc.cid,sc.score
group by Cid
order
by avg (score),cid desc ;
34、 select
from sc
left join stude nt s on sc.sid = s.sid
left join course c on sc.cid = c.cid
where sc.score> 70;
37、查询不及格的课程,并按课程号从大到小的排列:
select cid
from sc
where score< 60
ORDERBY cid;
38、查询课程编号为“ 003且课程成绩在80分以上的学生的学号和姓名: select sc.sid,s.s name
from sc
left join stude nt s on sc.sid = s.sid
where sc.cid = '003' and sc.score> 80;
39、求选了课程的学生人数:
select count ( 2) from
(select distinet sid from sc)a;
40、查询选修叶平”老师所授课程的学生中,成绩最高的学生姓名及
其成绩:
select s.s name,sc.score
精选文库
and sc.score =( select max(score) from sc sc 1
from sc sc
lef t join stude nt s on sc.sid = s.sid
lef t join course c on sc.cid = c.cid
lef t join teachert
on c.tid =
t.tid where t.tname =
'叶平'
where sc.cid = sc_1.cid); 41、
查询各个课程及相应的选修人数: select cid, count (*) from sc group by cid; 42、
查询不同课程成绩相同的学生和学号、课程号、学生成绩: select DISTINCT a.sid,a.cid,a.score from sc as a ,sc as b where a.score = b.score and a.cid <> b.cid;
精选文库
43、查询每门课程成绩最好的前两名:
44、统计每门课程的学生选修人数(超过10人的课程才统计)。

要求输出课 程号和选修人数,查询结果按人数降序排序,若人数相同,按课程号升序 排序:
select cid as 课程号,count (8) as 选修人数
from sc group by cid
HAVING count (sid)> 10 order by count ( 8) desc ,cid;
45、检索至少选修两门课程的学生学号:
select sid from sc group by sid
having count ( 8)>= 2;
46、查询全部学生选修的课程和课程号和课程名:
select
cid,c name from course
cid in ( select cid from sc group by cid);
查询没学过”叶平”老师讲授的任一门课程的学生姓名:
select
sn ame
where
47、
精选文库
from student where sid not in (
select sid
from sc,course,teacher
where course.tid = teacher.tid
);
48、查询两门以上不及格课程的同学的学号以及其平均成绩:
from sc
and sc.cid = course.cid
and teacher.t name=
'叶平'
select sid,
avg (COALESCE(score, 0))
where sid in (
select sid
from sc
where score< 60
group by sid
having count ( 8)> 2
group by sid;
精选文库
004课程分数小于60 ,按分数降序排列的同学学号:
and cid = '001'
基本SQL 操作
l SELECT * FROM table ORDER BY field DESC; (ASC|DESC)
SELECT DISTINCT field from table where l INSERT INTO table_ name (colu mn 1,colu mn 2,colu mn 3,...) VALUES (value1,value2,value3,...);
l UP DATE table_name SET colu mn 1=value1,colu mn 2=value2,... WHERE some_colu mn=some_value;
l DELETE FROM table_name WHERE some_colu mn=some_value;
LIKE 操作符
49、检索“
select sid,score
from sc
where cid= '004'
and scorev 60
order by score desc;
50、 删除
002同学的“ 001课程的成绩:
delete
from
sc
where
sid = '002'
范围
精选文库SELECT column_ name(s) FROM table_ name WHERE column_ name LIKE pattern;
IN操作符
SELECT column_ name(s) FROM table_ name WHERE column_ name
IN (value1,value2,...);
BETWEEN 操作符
SELECT column_ name(s) FROM table_ name WHERE column_ name BETWEEN
JOIN
左连接,右连接,内连接
left join(左联接):返回包括左表中的所有记录和右表中联结字段相等的记录。

right join(右联接):返回包括右表中的所有记录和左表中联结字段相等的记录。

inner join(等值连接):只返回两个表中联结字段相等的行。

(默认)
UNION操作符
UNION操作符用于合并两个或多个SELECT语句的结果集。

SELECT coun try, name FROM Websites WHERE coun try='CN'
UNION
SELECT country, app_n ame FROM apps WHERE cou ntry='CN'
ORDER BY country;
创建视图
CREATE VIEW view_ name AS SELECT column_ name(s) FROM table_ name WHERE con ditio
SQL函数
Avg() Cou nt() Max() Mi n() Sum()
Group By():
GROUP BY语句用于结合聚合函数,根据一个或多个列对结果集进行分组。

精选文库
SELECT colu mn_n ame, aggregate_fu nction( colu mn_n ame) FROM table_ name WHERE colu mn_n ame op erator value GRO UP BY column_name;
HAVING 子句可以让我们筛选分组后的各组数据。

SELECT colu mn_n ame, aggregate_fu nction( colu mn_n ame) FROM table_ name WHERE colu mn_n ame op erator value GRO UP BY column_name
HAVING aggregate_fu nction( colu mn_n ame) op erator value;
如何查询数据库表结构,主键
desc tabl_ name;
建表
CREATE TABLE 表名称
列名称1数据类型,
Sql 优化
合理写 WHERE 子句,不要写没有 WHERE 的SQL 语句。

可以合并一些sql 语句
3)适当建立索引(不是越多越好)但以下几点会进行全表扫描 a )左模糊查询’%... b )使用了不等操作符!
c ) Or 使用不当,or 两边都必须有索引才行
1) 只返回需要的数据
a) 不要写SELECT *的语句 2)
尽量少做重复的工作
b)
精选文库d) In 、not in e) Where 子句对字段进行表达式操作
f)对于创建的复合索引(从最左边开始组合),查询条件用到的列必须从左边开始不能间隔。

否则无效,
复合索引的结构与电话簿类似
g)全文索引:当于对文件建立了一个以词库为目录的索引(文件大全文索引比模糊匹配效果好)
能在char、varchar 、text类型的列上面创建全文索引
MySQL 5.6 Innodb 引擎也能进行全文索引
搜索语法:MATCH (列名1,列名2,…)AGAINST (搜索字符串[搜索修饰符])
如果列类型是字符串, 但在查询时把一个数值型常量赋值给了一个字符型的列名name,那么虽然在name
列上有索引,但是也没有用到。

4)使用join代替子查询5)使用union代替手动创建临时表
索引优化
创建索引,以下情况不适合建立索引
l表记录太少l经常插入、删除、修改的表l数据重复且分布平均的表字段
复合索引如果一个表中的数据在查询时有多个字段总是同时出现则这些字段就可以作为复合索引
索弓
索引是对数据库表中一列或多列的值进行排序的一种结构。

优点:
大大加快数据的检索速度
创建唯一性索引,保证数据库表中每一行数据的唯一性
可以加速表和表之间的连接
缺点:
I索引需要占物理空间。

I当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,
降低了数据的维护速度。

精选文库索引分类:
I普通索引create in dex zjj_temp_ in dex_1 on zjj_te mp _1(first_ name);
drop in dex zjj_te mp_in dex_1;
l唯一索引,索引列的值必须唯一,但允许有空值create unique in dex zjj_temp_1 on zjj_temp_1(id);
l主键索引,它是一种特殊的唯一索引,不允许有空值。

l组合索引
41。

相关文档
最新文档