
sql练习
-
2023年3月3日发(作者:感谢别人的话)例题
1、写出一条Sql语句:取出表A中第31到第40记录(Mysql)
select*fromAlimit30,10
MS-SQLServer
解1:selecttop10*fromAwhereidnotin(selecttop30idfromA)
解2:selecttop10*fromAwhereid>(selectmax(id)from(selecttop30idfromA)asA)
解3:select*from(select*,Row_Number()OVER(ORDERBYidasc)rowidFROMA)asAwhererowidbetween
31and40
Oracle
select*
from(selectA.*,
row_number()over(orderbyidasc)rank
FROMA)
whererank>=31ANDrank<=40;
2、用一条SQL语句查询出每门课都大于80分的学生姓名
namekechengfenshu
张三语文81
张三数学75
李四语文76
李四数学90
王五语文81
王五数学100
王五英语90
A:selectdistinctnamefromtablewherenamenotin(selectdistinctnamefromtablew
herefenshu<=80)
selectnamefromtablegroupbynamehavingmin(fenshu)>80
3、学生表如下:
自动编号学号姓名课程编号课程名称分数
12005001张三0001数学69
22005002李四0001数学89
32005001张三0001数学69
删除除了自动编号不同,其他都相同的学生冗余信息
A:deletetablenamewhere自动编号notin(selectmin(自动编号)fromtablename
groupby学号,姓名,课程编号,课程名称,分数)
4、请用SQL语句实现:
从TestDB数据表中查询出所有月份的发生额都比101科目相应月份的发生额高的科目。请注
意:TestDB中有很多科目,都有1-12月份的发生额。
AccID:科目代码,Occmonth:发生额月份,DebitOccur:发生额。
数据库名:JcyAudit,数据集:Select*fromTestDB
答:selecta.*
fromTestDBa
,(selectOccmonth,max(DebitOccur)Debit101ccurfromTestDBwhereAccID='101'groupby
Occmonth)b
where=and>
5、一个叫team的表,
里面只有一个字段name,一共有4条纪录,分别是a,b,c,d,对应四个球对,现在四个球对进行
比赛,用一条sql语句显示所有可能的比赛组合.
你先按你自己的想法做一下,看结果有我的这个简单吗
select,
fromteama,teamb
where<
6、面试题:怎么把这样一个表儿
yearmonthamount
19911
19912
19913
19914
19921
19922
19923
19924
查成这样一个结果
yearm1m2m3m4
1991
1992
答案一、
selectyear,
(selectamountfromaaamwheremonth=1and=asm1,
(selectamountfromaaamwheremonth=2and=asm2,
(selectamountfromaaamwheremonth=3and=asm3,
(selectamountfromaaamwheremonth=4and=asm4
fromaaagroupbyyear
7、说明:复制表(只复制结构,源表名:a新表名:b)
SQL:select*intobfromawhere11(where1=1,拷贝表结构和数据内容)
Oracle:createtableb
As
Select*fromawhere1=2
[(不等于)(SQLServerCompact)
比较两个表达式。当使用此运算符比较非空表达式时,如果左操作数不等于右操作数,则结
果为TRUE。否则,结果为FALSE。]
8、说明:拷贝表(拷贝数据,源表名:a目标表名:b)
SQL:insertintob(a,b,c)selectd,e,ffroma;
9、说明:显示文章、提交人和最后回复时间
SQL:select,,fromtablea,(selectmax(adddate)adddatefromtablewhere=b
10.说明:外连接查询(表名1:a表名2:b)
SQL:select,,,,,fromaLEFTOUTERJOINbON=
ORACLE:select,,,,,froma,b
where=(+)
11.说明:日程安排提前五分钟提醒
SQL:select*from日程安排wheredatediff('minute',f开始时间,getdate())>5
12.说明:两张关联表,删除主表中已经在副表中没有的信息
SQL:
Deletefrominfowherenotexists(select*frominfobzwhere=)
13.有两个表A和B,均有key和value两个字段,如果B的key在A
中也有,就把B的value换为A中对应的value
这道题的SQL语句怎么写
updatebset=(selectfromawhere=wherein(selectfromb,awhere=;
高级sql面试题
14.原表:
courseidcoursenamescore
-------------------------------------
1Java70
2oracle90
3xml40
4jsp30
5servlet80
-------------------------------------
为了便于阅读,查询此表后的结果显式如下(及格分数为60):
courseidcoursenamescoremark
---------------------------------------------------
1Java70pass
2oracle90pass
3xml40fail
4jsp30fail
5servlet80pass
---------------------------------------------------
写出此查询语句
selectcourseid,coursename,score,decode(sign(score-60),-1,'fail','pass')asmarkfromcour
se
(SQL:selectcourseid,coursename,score,(casewhenscore<60then'fail'else'pass'end)
asmarkfromcourse)
ORACLE:selectcourseid,coursename,score,decode(sign(score-60),-1,'fail','pass')asmark
fromcourse
(DECODE函数是ORACLEPL/SQL是功能强大的函数之一,目前还只有ORACLE公司的SQL提
供了此函数)
完全正确
SQL>desccourse_v
NameNullType
-----------------------------------------------------------------------------
COURSEIDNUMBER
COURSENAMEVARCHAR2(10)
SCORENUMBER
SQL>select*fromcourse_v;
COURSEIDCOURSENAMESCORE
------------------------------
1java70
2oracle90
3xml40
4jsp30
5servlet80
SQL>selectcourseid,coursename,score,decode(sign(score-60),-1,'fail','pass')asmarkfrom
course_v;
COURSEIDCOURSENAMESCOREMARK
----------------------------------
1java70pass
2oracle90pass
3xml40fail
4jsp30fail
5servlet80pass
面试题(1)
createtabletesttable1
(
idintIDENTITY,
departmentvarchar(12)
)
select*fromtesttable1
insertintotesttable1values('设计')
insertintotesttable1values('市场')
insertintotesttable1values('售后')
/*
结果
iddepartment
1设计
2市场
3售后
*/
createtabletesttable2
(
idintIDENTITY,
dptIDint,
namevarchar(12)
)
insertintotesttable2values(1,'张三')
insertintotesttable2values(1,'李四')
insertintotesttable2values(2,'王五')
insertintotesttable2values(3,'彭六')
insertintotesttable2values(4,'陈七')
/*
用一条SQL语句,怎么显示如下结果
iddptIDdepartmentname
11设计张三
21设计李四
32市场王五
43售后彭六
54黑人陈七
*/
答案:
SELECTtesttable2.*,ISNULL(department,'黑人')
FROMtesttable1rightjointesttable2on=
也做出来了可比这方法稍复杂。/
面试题(2)
有表A,结构如下:
A:p_IDp_Nums_id
11001
11202
2801
31101
3803
其中:p_ID为产品ID,p_Num为产品库存量,s_id为仓库ID。请用SQL语句实现将上表中的
数据合并,合并后的数据为:
p_IDs1_ids2_ids3_id
110120
2800
31108
其中:s1_id为仓库1的库存量,s2_id为仓库2的库存量,s3_id为仓库3的库存量。如果该
产品在某仓库中无库存量,那么就是0代替。
结果:
selectp_id,
sum(casewhens_id=1thenp_numelse0end)ass1_id
,sum(casewhens_id=2thenp_numelse0end)ass2_id
,sum(casewhens_id=3thenp_numelse0end)ass3_id
frommyProgroupbyp_id
什么是相关子查询如何使用这些查询
经验更加丰富的开发人员将能够准确地描述这种类型的查询。
相关子查询是一种包含子查询的特殊类型的查询。查询里包含的子查询会真正请求外部查询
的值,从而形成一个类似于循环的状况。
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嵌套语句查询选修课程名称为’税收基础’的学员学号和姓名
答案:selects#,snfromswhereS#in(selectS#fromc,scwhere#=#andcn=’税收基
础’)
(2)使用标准SQL嵌套语句查询选修课程编号为’C2’的学员姓名和所属单位
答:selectsn,sdfroms,scwhere#=#and#=’c2’
(3)使用标准SQL嵌套语句查询不选修课程编号为’C5’的学员姓名和所属单位
答:selectsn,sdfromswheres#notin(selects#fromscwherec#=’c5’)
(4)查询选修了课程的学员人数
答:select学员人数=count(distincts#)fromsc
(5)查询选修课程超过5门的学员学号和所属单位
答:selectsn,sdfromswheres#in(selects#fromscgroupbys#havingcount(distinctc
#)>5)
18、SQL面试题(4)
1.查询A(ID,Name)表中第31至40条记录,ID作为主键可能是不是连续增长的列,完整的查
询语句如下:
2.
top10*fromAwhereID>(selectmax(ID)from(selecttop30IDfromAord
erbyA)T)orderbyA
4.
5.2.查询表A中存在ID重复三次以上的记录,完整的查询语句如下:
*from(selectcount(ID)ascountfromtablegroupbyID)Twhere>3
简答题部分
1.触发器的作用
答:触发器是一中特殊的存储过程,主要是通过事件来触发而被执行的。它可以强化约束,
来维护数据的完整性和一致性,可以跟踪数据库内的操作从而不允许未经许可的更新和变化。
可以联级运算。如,某表上的触发器上包含对另一个表的数据操作,而该操作又会导致该表
触发器被触发。
2。什么是存储过程用什么来调用
答:存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需创建一次,
以后在该程序中就可以调用多次。如果某次操作需要执行多次SQL,使用存储过程比单纯SQ
L语句执行要快。可以用一个命令对象来调用存储过程。
3。索引的作用和它的优点缺点是什么
答:索引就一种特殊的查询表,数据库的搜索引擎可以利用它加速对数据的检索。它很类似
与现实生活中书的目录,不需要查询整本书内容就可以找到想要的数据。索引可以是唯一的,
创建索引允许指定单个列或者是多个列。缺点是它减慢了数据录入的速度,同时也增加了数
据库的尺寸大小。
3。什么是内存泄漏
答:一般我们所说的内存泄漏指的是堆内存的泄漏。堆内存是程序从堆中为其分配的,大小
任意的,使用完后要显示释放内存。当应用程序用关键字new等创建对象时,就从堆中为它
分配一块内存,使用完后程序调用free或者delete释放该内存,否则就说该内存就不能被使
用,我们就说该内存被泄漏了。
4。维护数据库的完整性和一致性,你喜欢用触发器还是自写业务逻辑为什么
答:我是这样做的,尽可能使用约束,如check,主键,外键,非空字段等来约束,这样做效
率最高,也最方便。其次是使用触发器,这种方法可以保证,无论什么业务系统访问数据库
都可以保证数据的完整新和一致性。最后考虑的是自写业务逻辑,但这样做麻烦,编程复杂,
效率低下。
5。什么是事务什么是锁
答:事务就是被绑定在一起作为一个逻辑工作单元的SQL语句分组,如果任何一个语句操作
失败那么整个操作就被失败,以后操作就会回滚到操作前状态,或者是上有个节点。为了确
保要么执行,要么不执行,就可以使用事务。要将有组语句作为事务考虑,就需要通过ACID
测试,即原子性,一致性,隔离性和持久性。
锁:在所以的DBMS中,锁是实现事务的关键,锁可以保证事务的完整性和并发性。与现实
生活中锁一样,它可以使某些数据的拥有者,在某段时间内不能使用某些数据或数据结构。
当然锁还分级别的。
6。什么叫视图游标是什么
答:视图是一种虚拟的表,具有和物理表相同的功能。可以对视图进行增,改,查,操作,
试图通常是有一个表或者多个表的行或列的子集。对视图的修改不影响基本表。它使得我们
获取数据更容易,相比多表查询。
游标:是对查询出来的结果集作为一个单元来有效的处理。游标可以定在该单元中的特定行,
从结果集的当前行检索一行或多行。可以对结果集当前行做修改。一般不使用游标,但是需
要逐条处理数据的时候,游标显得十分重要。
SQL数据库面试题以及答案(50例题)
学生表
Sid:学号
Sname:学生姓名
Sage:学生年龄
Ssex:学生性别
Course(Cid,Cname,T#)课程表
Cid:课程编号
Cname:课程名称
Tid:教师编号
SC(Sid,Cid,score)成绩表
Sid:学号
Cid:课程编号
score:成绩
Teacher(Tid,Tname)教师表
Tid:教师编号:
Tname:教师名字
问题:
1、查询“001”课程比“002”课程成绩高的所有学生的学号
selectfrom
(selectsid,scorefromscwherecid='001')a,
(selectsid,scorefromscwherecid='002')b
where=and>;
2、查询平均成绩大于60分的同学的学号和平均成绩
selectsid,avg(score)fromsc
groupbysid
havingavg(score)>60;
3、查询所有同学的学号、姓名、选课数、总成绩
select,,count_cidas选课数,
sum_scoreas总成绩
fromstudents
leftjoin
(selectsid,count(cid)ascount_cid,sum(score)assum_score
fromscgroupbysid)sc
on=;
4、查询姓‘李’的老师的个数:
selectcount(tname)
fromteacher
wheretnamelike'李%';
5、查询没有学过“叶平”老师可的同学的学号、姓名:
select,
fromstudentass
wherenotin(
selectDISTINCTsid
fromscassc
wherein(
selectcid
fromcourseasc
leftjointeacheraston=
where='叶平')
);
6、查询学过“叶平”老师所教的所有课的同学的学号、姓名:
select,
fromstudentass
wherein(
selectdistinct
fromscassc
wherein(
selectcid
fromcourseasc
leftjointeacheraston=
where='叶平')
groupby
HAVINGcount(cid)=
(selectcount(cid)
fromcourseascleftjointeacheraston=
where='叶平')
);
7、查询学过“011”并且也学过编号“002”课程的同学的学号、姓名:
SELECT,
fromstudentass
leftjoinscasscon=
where='001'
andEXISTS(
select*fromscassc_2
where=
and='002');
select,
fromstudentass
leftjoinscassc
on=
where='001'
andin(
selectsidfromscassc_2
where='002'
and=;
8、查询课程编号“002”的成绩比课程编号“001”课程低的所有同学的学
号、姓名:
selectsid,sname
from(select,,score,
(selectscorefromscassc_2
where=
and='002')asscore2
fromstudent,sc
where=andcid='001')s_2
wherescore2 1 2 3 4 5 6 7 8 9、查询所有课程成绩小于60的同学的学号、姓名: selectsid,sname fromstudent wheresidnotin (select fromstudents,sc where=andscore>60); selectsid,sname fromstudents wherenotEXISTS( selectfromsc where=and>60); 10、查询没有学全所有课的同学的学号、姓名: select, fromstudents,scsc where= groupby, havingcount<( selectcount(cid) fromcourse); select, fromstudents rightjoinscscon= groupby, havingcount< (selectcount(cid)fromcourse); 11、查询至少有一门课与学号为“1001”同学所学相同的同学的学号和姓名: select,sname fromstudent,sc where= andcidin (selectcidfromscwheresid='1001'); select, fromscscleftjoinstudentass on= wherein(selectcidfromscwheresid='1001'); select, fromscsc_1leftjoinstudentass on= where exists(selectfromscassc_2 where= and='1001'); • 12、查询至少学过学号为“001”同学所有一门课的其他同学学号和姓名; 13、把“SC”表中“叶平”老师教的课的成绩都更改为此课程的平均成绩: updatescsetscore= (selectavgfromscsc_2 where= wherecidin (selectfromcoursec leftjointeacherton= where='叶平'); 14、查询和“1002”号的同学学习的课程完全相同的其他同学学号和姓名: select from(selectcidfromscwheresid='1002')a leftjoinscsc_1on= where'1002' groupby havingcount= (selectcount(cid)fromscwheresid='1002'); select,from (selectsid,GROUP_CONCAT(cidorderbycidseparator',')ascid_str fromscwheresid='1002')b, (selectsid,GROUP_CONCAT(cidorderbycidseparator',')ascid_str fromscgroupbysid)a leftjoinstudents on= where=and'1002'; 15、删除学习“叶平”老师课的SC表记录: deletefromscWHERE cidin( selectfromcoursec LEFTJOINteacherton= where='叶平'); 16、向SC表中插入一些记录,这些记录要求符合以下条件:没有上过编 号“003”课程的同学学号、002号课的平均成绩: insertintoscselectsid,'002', (selectavg(score)fromscwherecid='0022') fromstudent wheresidnotin(selectsidfromscwherecid='002'); 17、按平均成绩从高到低显示所有学生的“数据库”、“企业管理”、“英语”三门 的课程成绩,按如下形式显示:学生ID,数据库,企业管理,英语,有效 课程数,有效平均分: selectsidas学生id, (SELECTscorefromsc where=andcid='004')as数据库, (selectscorefromsc where=andcid='001')as企业管理, (selectscorefromsc where=andcid='015')as英语, count(cid)as有效课程数,avgas平均成绩 fromscast groupbysid orderbyavg; 18、查询各科成绩最高和最低的分:以如下的形式显示:课程ID,最高分, 最低分 selectas课程id,as最高分, as最低分 fromscl,scr where= and= (selectmaxfromsct where=groupby and=(selectminfromsct where=groupby orderby; selectcidas课程id,max(score)as最高分, min(score)as最低分 fromsc groupbycid; 19、按各科平均成绩从低到高和及格率的百分数从高到低顺序: SELECTas课程号, as课程名, COALESCE(avg(score),0)as平均成绩, 100*sum(case whenCOALESCE(score,0)>=60 then1else0END)/count(*)as及格百分数 fromsct leftjoincoursec on= groupby orderby100*sum(case whenCOALESCE(score,0)>=60 then1else0END)/count(*); • 20、查询如下课程平均成绩和及格率的百分数(用”1行”显示):企业管理(0 01),马克思(002),OO&UML(003),数据库(004): 21、查询不同老师所教不同课程平均分从高到低显示: selectas教师id, as教师姓名, as课程id, avg(score)as平均成绩 fromscassc LEFTJOINcoursecon= leftjointeacherton= groupby orderbyavgdesc; 22、查询如下课程成绩第3名到第6名的学生成绩单:企业管理(001),马 克思(002),UML(003),数据库(004): 23、统计下列各科成绩,各分数段人数:课程ID,课程名称,[100-85],[85 -70],[70-60],[小于60]: selectas课程id,cnameas课程名称, sum(casewhenscorebetween85and100then1else0end)as'[100-85]', sum(casewhenscorebetween70and85then1else0end)as'[85-70]', sum(casewhenscorebetween60and70then1else0end)as'[70-60]', sum(casewhenscore<60then1else0end)as'[60-0]' fromscassc leftjoincourseasc on= groupby; 24、查询学生平均成绩及其名次: select1+(selectcount(distinct平均成绩) from(selectsid,avg(score)as平均成绩 fromscgroupbysid)t1 where平均成绩>t2.平均成绩)as名次, sidas学生学号,平均成绩 from(selectsid,avg(score)平均成绩fromscgroupbysid)ast2 orderby平均成绩desc; 25、查询各科成绩前三名的记录(不考虑成绩并列情况): selectsid,cid,score fromscsc_1 where( selectcount(3)fromscsc_2 where= and>=<=2 orderby ); 26、查询每门课程被选修的学生数: selectcid,count(sid) fromsc groupbycid; 27、查询出只选修一门课程的全部学生的学号和姓名: select,, countas课程数 fromscassc LEFTJOINstudentass on= groupby havingcount=1; 28、查询男生、女生人数: selectcount(ssex)as男生人数 fromstudent groupbyssex havingssex='男'; selectcount(2)fromstudent wheressex='女'; 29、查询姓“张”的学生名单: selectsid,sname fromstudent wheresnamelike'张%'; 30、查询同名同姓的学生名单,并统计同名人数: selectsname,count(8) fromstudent groupbysname havingcount(8)>1; 31、1981年出生的学生名单(注:student表中sage列的类型是datetime): 32、查询平均成绩大于85的所有学生的学号、姓名和平均成绩: select,,avgas平均成绩 fromscassc leftjoinstudentass on= groupby havingavg>85; 33、查询每门课程的平均成绩,结果按平均成绩升序排序,平均成绩相同 时,按课程号降序排列: selectcid,avg(score) fromsc groupbycid orderbyavg(score),ciddesc; 34、查询课程名称为“数据库”,且分数低于60的学生名字和分数: select,,, fromcoursec leftjoinscon= LEFTJOINstudentson= where='数据库'and<60; 35、查询所有学生的选课情况: select,,, fromsc LEFTJOINcoursecon= leftjoinstudentson=; 36、查询任何一门课程成绩在70分以上的姓名、课程名称和分数: selectdistinct,,, fromsc leftjoinstudentson= leftjoincoursecon= where>70; 37、查询不及格的课程,并按课程号从大到小的排列: selectcid fromsc wherescore<60 ORDERBYcid; 38、查询课程编号为“003”且课程成绩在80分以上的学生的学号和姓名: select, fromsc leftjoinstudentson= where='003'and>80; 39、求选了课程的学生人数: selectcount(2)from (selectdistinctsidfromsc)a; 40、查询选修“叶平”老师所授课程的学生中,成绩最高的学生姓名及 其成绩: select, fromscsc leftjoinstudentson= leftjoincoursecon= leftjointeacherton= where='叶平' and=( selectmax(score) fromscsc_1 where=; 41、查询各个课程及相应的选修人数: selectcid,count(*)fromscgroupbycid; 42、查询不同课程成绩相同的学生和学号、课程号、学生成绩: selectDISTINCT,, fromscasa,scasb where= and; 43、查询每门课程成绩最好的前两名: 44、统计每门课程的学生选修人数(超过10人的课程才统计)。要求输出课 程号和选修人数,查询结果按人数降序排序,若人数相同,按课程号升序 排序: selectcidas课程号,count(8)as选修人数 fromsc groupbycid HAVINGcount(sid)>10 orderbycount(8)desc,cid; 45、检索至少选修两门课程的学生学号: selectsid fromsc groupbysid havingcount(8)>=2; 46、查询全部学生选修的课程和课程号和课程名: selectcid,cname fromcourse wherecidin(selectcidfromscgroupbycid); 47、查询没学过”叶平”老师讲授的任一门课程的学生姓名: selectsname fromstudent wheresidnotin( selectsid fromsc,course,teacher where=and= and='叶平' ); 48、查询两门以上不及格课程的同学的学号以及其平均成绩: selectsid,avg(COALESCE(score,0)) fromsc wheresidin( selectsid fromsc wherescore<60 groupbysid havingcount(8)>2 ) groupbysid; 49、检索“004”课程分数小于60,按分数降序排列的同学学号: selectsid,score fromsc wherecid='004' andscore<60 orderbyscoredesc; 50、删除“002”同学的“001”课程的成绩: deletefromsc wheresid='002' andcid='001'; 基本SQL操作 lSELECT*FROMtableORDERBYfieldDESC;(ASC|DESC) SELECTDISTINCTfieldfromtablewhere范围 lINSERTINTOtable_name(column1,column2,column3,...) VALUES(value1,value2,value3,...); lUPDATEtable_nameSETcolumn1=value1,column2=value2,... WHEREsome_column=some_value; lDELETEFROMtable_nameWHEREsome_column=some_value; LIKE操作符 SELECTcolumn_name(s)FROMtable_nameWHEREcolumn_nameLIKEpattern; IN操作符 SELECTcolumn_name(s)FROMtable_nameWHEREcolumn_name IN(value1,value2,...); BETWEEN操作符 SELECTcolumn_name(s)FROMtable_nameWHEREcolumn_nameBETWEEN JOIN 左连接,右连接,内连接 leftjoin(左联接):返回包括左表中的所有记录和右表中联结字段相等的记录。 rightjoin(右联接):返回包括右表中的所有记录和左表中联结字段相等的记录。 innerjoin(等值连接):只返回两个表中联结字段相等的行。(默认) UNION操作符 UNION操作符用于合并两个或多个SELECT语句的结果集。 SELECTcountry,nameFROMWebsitesWHEREcountry='CN' UNION SELECTcountry,app_nameFROMappsWHEREcountry='CN' ORDERBYcountry; 创建视图 CREATEVIEWview_nameASSELECTcolumn_name(s)FROMtable_nameWHEREcondition SQL函数 Avg()Count()Max()Min()Sum() GroupBy(): GROUPBY语句用于结合聚合函数,根据一个或多个列对结果集进行分组。 SELECTcolumn_name,aggregate_function(column_name) FROMtable_nameWHEREcolumn_nameoperatorvalue GROUPBYcolumn_name; HAVING子句可以让我们筛选分组后的各组数据。 SELECTcolumn_name,aggregate_function(column_name) FROMtable_nameWHEREcolumn_nameoperatorvalue GROUPBYcolumn_name HAVINGaggregate_function(column_name)operatorvalue; 如何查询数据库表结构,主键 desctabl_name; 建表 CREATETABLE表名称 ( 列名称1数据类型, .... ) Sql优化 1)只返回需要的数据 a)不要写SELECT*的语句 b)合理写WHERE子句,不要写没有WHERE的SQL语句。 2)尽量少做重复的工作 可以合并一些sql语句 3)适当建立索引(不是越多越好)但以下几点会进行全表扫描 a)左模糊查询’%...’ b)使用了不等操作符!= c)Or使用不当,or两边都必须有索引才行 d)In、notin e)Where子句对字段进行表达式操作 f)对于创建的复合索引(从最左边开始组合),查询条件用到的列必须从左边开始不能间隔。否则无效, 复合索引的结构与电话簿类似 g)全文索引:当于对文件建立了一个以词库为目录的索引(文件大全文索引比模糊匹配效果好) 能在char、varchar、text类型的列上面创建全文索引 MySQLInnodb引擎也能进行全文索引 搜索语法:MATCH(列名1,列名2,…)AGAINST(搜索字符串[搜索修饰符]) 如果列类型是字符串,但在查询时把一个数值型常量赋值给了一个字符型的列名name,那么虽然在name 列上有索引,但是也没有用到。 4)使用join代替子查询 5)使用union代替手动创建临时表 索引优化 一、创建索引,以下情况不适合建立索引 l表记录太少 l经常插入、删除、修改的表 l数据重复且分布平均的表字段 二、复合索引 如果一个表中的数据在查询时有多个字段总是同时出现则这些字段就可以作为复合索引 索引 索引是对数据库表中一列或多列的值进行排序的一种结构。 优点: l大大加快数据的检索速度 l创建唯一性索引,保证数据库表中每一行数据的唯一性 l可以加速表和表之间的连接 缺点: l索引需要占物理空间。 l当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护, 降低了数据的维护速度。 索引分类: l普通索引 createindexzjj_temp_index_1onzjj_temp_1(first_name); dropindexzjj_temp_index_1; l唯一索引,索引列的值必须唯一,但允许有空值 createuniqueindexzjj_temp_1onzjj_temp_1(id); l主键索引,它是一种特殊的唯一索引,不允许有空值。 l组合索引