ehxz 发表于 2006-7-2 09:55:13

简单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 &gt; = '1980-1-1' and birth &lt;= '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&lt;60<br/>group by sno<br/>having count(*)&gt;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)&gt;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则相当于逻辑运算“&amp;&amp;”</p><p>  d.注意在做否定意义的查询是小心进入陷阱:</p><p>  如,没有选修‘B2’课程的学生 :</p><p>select students.*<br/>from students, grades<br/>where students.sno=grades.sno<br/>AND grades.cno &lt;&gt; ’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>

zag369 发表于 2006-7-26 20:58:51

谢谢 了,正好我初学

ran 发表于 2006-8-23 15:15:24

<p>很好的东西,收藏学习</p>

qing23 发表于 2006-11-6 14:20:01

<p>谢谢。。。</p>

1234567x 发表于 2006-12-13 17:20:22

谢谢,学到不少东西

流星 发表于 2006-12-15 12:44:03

写的不错,很适合初学者。参照例子,简单易学。呵呵,谢谢管理员

wzq81216 发表于 2007-1-16 10:43:27

ding

laking 发表于 2007-5-18 17:32:02

也下载来学习了。。谢谢
页: [1]
查看完整版本: 简单SQL语句小结

免责声明:
本站所发布的一切破解补丁、注册机和注册信息及软件的解密分析文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:Admin@SybaseBbs.com