简单SQL语句小结
<p>为了大家更容易理解我举出的SQL语句,本文假定已经建立了一个学生成绩管理数据库,全文均以学生成绩的管理为例来描述。 </p><p> 1.在查询结果中显示列名:</p><p> a.用as关键字:select name as '姓名' from students order by age</p><p> b.直接表示:select name '姓名' from students order by age</p><p> 2.精确查找:</p><p> a.用in限定范围:select * from students where native in ('湖南', '四川') </p><p> b.between...and:select * from students where age between 20 and 30</p><p> c.“=”:select * from students where name = '李山' </p><p> d.like:select * from students where name like '李%' (注意查询条件中有“%”,则说明是部分匹配,而且还有先后信息在里面,即查找以“李”开头的匹配项。所以若查询有“李”的所有对象,应该命令:'%李%';若是第二个字为李,则应为'_李%'或'_李'或'_李_'。)</p><p> e.[]匹配检查符:select * from courses where cno like '%' (表示或的关系,与"in(...)"类似,而且"[]"可以表示范围,如:select * from courses where cno like '%')</p><p> 3.对于时间类型变量的处理</p><p> a.smalldatetime:直接按照字符串处理的方式进行处理,例如:<br/>select * from students where birth > = '1980-1-1' and birth <= '1980-12-31' </p><p> 4.集函数</p><p> a.count()求和,如:select count(*) from students (求学生总人数)</p><p> b.avg(列)求平均,如:select avg(mark) from grades where cno=’B2’</p><p> c.max(列)和min(列),求最大与最小</p><p> 5.分组group</p><p> 常用于统计时,如分组查总数:<br/>select gender,count(sno) <br/>from students<br/>group by gender<br/>(查看男女学生各有多少)</p><p> 注意:从哪种角度分组就从哪列"group by"</p><p> 对于多重分组,只需将分组规则罗列。比如查询各届各专业的男女同学人数 ,那么分组规则有:届别(grade)、专业(mno)和性别(gender),所以有"group by grade, mno, gender"</p><p>select grade, mno, gender, count(*)<br/>from students<br/>group by grade, mno, gender</p><p> 通常group还和having联用,比如查询1门课以上不及格的学生,则按学号(sno)分类有:</p><p>select sno,count(*) from grades <br/>where mark<60<br/>group by sno<br/>having count(*)>1 </p><p> 6.UNION联合</p><p> 合并查询结果,如:</p><p>SELECT * FROM students<br/>WHERE name like ‘张%’<br/>UNION <br/>SELECT * FROM students<br/>WHERE name like ‘李%’</p><p> 7.多表查询</p><p> a.内连接</p><p>select g.sno,s.name,c.coursename <br/>from grades g JOIN students s ON g.sno=s.sno<br/>JOIN courses c ON g.cno=c.cno<br/>(注意可以引用别名)<br/>b.外连接<br/>b1.左连接<br/>select courses.cno,max(coursename),count(sno) <br/>from courses LEFT JOIN grades ON courses.cno=grades.cno <br/>group by courses.cno</p><p> 左连接特点:显示全部左边表中的所有项目,即使其中有些项中的数据未填写完全。</p><p> 左外连接返回那些存在于左表而右表中却没有的行,再加上内连接的行。</p><p> b2.右连接</p><p> 与左连接类似</p><p> b3.全连接</p><p>select sno,name,major <br/>from students FULL JOIN majors ON students.mno=majors.mno</p><p> 两边表中的内容全部显示</p><p> c.自身连接</p><p>select c1.cno,c1.coursename,c1.pno,c2.coursename <br/>from courses c1,courses c2 where c1.pno=c2.cno</p><p> 采用别名解决问题。</p><p> d.交叉连接</p><p>select lastname+firstname from lastname CROSS JOIN firstanme</p><p> 相当于做笛卡儿积</p><p> 8.嵌套查询</p><p> a.用关键字IN,如查询李山的同乡:</p><p>select * from students<br/>where native in (select native from students where name=’ 李山’) </p><p> b.使用关键字EXIST,比如,下面两句是等价的:</p><p>select * from students<br/>where sno in (select sno from grades where cno=’B2’)</p><p>select * from students where exists <br/>(select * from grades where <br/>grades.sno=students.sno AND cno=’B2’)</p><p> 9.关于排序order</p><p> a.对于排序order,有两种方法:asc升序和desc降序</p><p> b.对于排序order,可以按照查询条件中的某项排列,而且这项可用数字表示,如:</p><p>select sno,count(*) ,avg(mark) from grades <br/>group by sno<br/>having avg(mark)>85<br/>order by 3 </p><p> 10.其他</p><p> a.对于有空格的识别名称,应该用"[]"括住。</p><p> b.对于某列中没有数据的特定查询可以用null判断,如select sno,courseno from grades where mark IS NULL</p><p> c.注意区分在嵌套查询中使用的any与all的区别,any相当于逻辑运算“||”而all则相当于逻辑运算“&&”</p><p> d.注意在做否定意义的查询是小心进入陷阱:</p><p> 如,没有选修‘B2’课程的学生 :</p><p>select students.*<br/>from students, grades<br/>where students.sno=grades.sno<br/>AND grades.cno <> ’B2’ </p><p> 上面的查询方式是错误的,正确方式见下方:</p><p>select * from students<br/>where not exists (select * from grades <br/>where grades.sno=students.sno AND cno='B2') </p><p> 11.关于有难度多重嵌套查询的解决思想:</p><p> 如,选修了全部课程的学生:</p><p>select *<br/>from students<br/>where not exists ( select *<br/>from courses<br/>where NOT EXISTS <br/>(select *<br/>from grades<br/>where sno=students.sno<br/>AND cno=courses.cno))</p><p> 最外一重:从学生表中选,排除那些有课没选的。用not exist。由于讨论对象是课程,所以第二重查询从course表中找,排除那些选了课的即可</p> 谢谢 了,正好我初学 <p>很好的东西,收藏学习</p> <p>谢谢。。。</p> 谢谢,学到不少东西 写的不错,很适合初学者。参照例子,简单易学。呵呵,谢谢管理员 ding 也下载来学习了。。谢谢
页:
[1]