您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 数据结构与算法 > SQL语言之数据查询(1)
第七讲SQL语言之数据查询(1)数据库技术数据库技术SQL语言之数据查询Select插入、修改和删除数据的任务只需要少数人员负责完成,而绝大多数的用户都是共享数据库中的数据,生产各种各样需要的表格数据库技术一.简单查询select语句的语法:select子句[into子句]from子句[where子句][groupby子句][having子句][orderby子句]数据库技术一.简单查询最基本的select语句:select需要的数据(如字段)from表名①列出student表所有数据(所有)select*fromstudent②列出student表sno列的数据(单个字段数据)selectsnofromstudent③列出student表sno列和sname列的数据(多个)selectsno,snamefromstudent数据库技术一.简单查询详细的select子句选项:select[all|distinct][topn[percent]]select-list①使用distinct,显示唯一行如selectdistinctsdeptfromstudent②使用topn[percent](注意percent)如selectdistincttop2sdeptfromstudent数据库技术一.简单查询③改变显示的列标题。从select的结果可以看出,结果中的标题部分都是显示列名。对于不熟悉数据库结构的用户来说,这些列名很不容易理解,可以在select-list中使用as子句,自定义显示标题.如selectdistinctsdeptas系别fromstudent数据库技术一.简单查询搜索条件:where子句如果说我们需要的是符合某一条件的数据的时候,就要用到where子句了。如,我们要查找student表中系别为教育系的学生,可以:select*fromstudentwheresdept='教育系'①where后面就是搜索条件②where后面可以用and添加多个条件数据库技术二.单表查询单表查询就是涉及一个表的查询一、选择表中的若干列selectselect-list(目标表达式)1.查询指定列很多情况下,用户只对一部分属性列感兴趣,这时可以在目标表达式中指定要查询的属性selectsnofromstudent;selectsno,snamefromstudent;selectsname,sno,sdeptfromstudent;目标表达式中各个列的先后顺序可以跟表中不同数据库技术二.单表查询2.查询全部列在select后面的目标表达式把所有列名都列出来,或者用*代替select*fromstudent3.查询经过计算的值目标表达式不仅可以是属性列,也可以是表达式.如查询全体学生的姓名和出生年月selectsname,2004-sagefromstudent数据库技术二.单表查询用户可以通过指定别名来改变查询结果的列标题,使用as子句。as子句可以出现在select和from子句中,也就是说可以用as子句来更改属性名(列名)和关系名(表名),但要注意的是这里的改名并不会改变数据表的名称,只是为了查询上的方便使用改名而已,特别对含有表达式、函数名的目标表达式尤为有用。具体语法为:old_name[as]new_name如selectsname,2004-sagebirthfromstudent但是特别注意改名后两个名称能否混用?数据库技术二.单表查询二、选择表中的若干元组(记录)1.取消取值重复的行distinct和all的区别2.topn[percent]的使用数据库技术二.单表查询3.查询满足条件的元组查询满足指定条件的元组可以通过where子句实现,常用的查询条件有比较、确定范围、确定集合、字符匹配、空值、多重条件等数据库技术二.单表查询(1)比较大小可进行比较的运算符一般包括:=、、、=、=、、!=逻辑运算符not可与比较运算符同用,对条件求非①查询教育系全体学生的名单selectsnamefromstudentwheresdept=‘教育系’②查询所有年龄在20以下的学生selectsname,sagefromstudentwheresage20selectsname,sagefromstudentwherenotsage=20③查询考试成绩有不及格的学生的学号selectdistinctsnofromcoursewheregrade60数据库技术二.单表查询(2)确定范围谓词between…and…和notbetween…and…可以用来查找属性值在或不在指定范围内的元组,其中between后是范围的下限(即低值),and后是范围的上限(即高值).如查找年龄在20~23(包括20和23)的学生姓名,系别和年龄:selectsname,sdept,sagefromstudentwheresagebetween20and23如果是不在范围的话可以用notbetween…and…数据库技术二.单表查询(3)确定集合谓词in可以用来查找属性值属于指定集合的元组.如查询教育系,数学系和中文系学生的姓名和性别:selectsname,ssexfromstudentwheredeptin(教育系’,‘数学系’,‘中文系’)其中where条件等价于:dept=‘教育系’ordept=‘数学系’ordept=‘中文系’数据库技术二.单表查询selectsname,ssexfromstudentwheredept=‘教育系’ordept=‘数学系’ordept=‘中文系’数据库技术二.单表查询(4)字符匹配谓词like可以用来进行字符串的匹配,格式如下[not]like'匹配串‘如要查找姓刘的学生,这是要用到like操作符:selectsname,sdeptfromstudentwheresnamelike'刘%'数据库技术二.单表查询在like的匹配串中,①用百分号%来匹配任意子串(零个或者多个)②用下划线_来匹配任意一个字符③匹配串中是区分字母大小写的④在匹配串中为了使用特殊字符如%和_可以使用反斜线字符\将它们转义成普通字符,如‘a\%’数据库技术二.单表查询例1:查询所有姓名为李的学生姓名,学号selectsname,cnofromstudentwheresnamelike’李%’例2:查询姓李,且全名为三个汉字的学生的姓名selectsname,cnofromstudentwheresnamelike’李__’数据库技术二.单表查询注意这里有两个下划线,但要注意的时有些系统的sql语言可能要四个下划线,因一个汉字要占两个字符.还要注意的就是如果在sqlserver中执行这一语句后结果会怎样,不是三个汉字的也会出现了。如果下划线写多了又会怎样?如何处理这种问题?selectsname,cnofromstudentwheresnamelike’___’数据库技术二.单表查询(5)涉及空值的查询谓词isnull和isnotnull用来判断字段值是否是空值如:某些学生选修课程后没有参加考试,所以有选修记录,但没有考试成绩,进行如下操作①查询缺少成绩的学生的学号和相应的课程号selectsno,cnofromscwheregradeisnull注意这里的is不能用=(等号)代替②查询所有有成绩的学生学号和课程号selectsno,cnofromscwheregradeisnotnull数据库技术二.单表查询(6)多重条件查询逻辑运算符and和or可以用来联结多个查询条件,and的优先级高于or,但可以使用括号来改变优先级。如查询系别为教育系,年龄大于20的学生姓名selectsnamefromstudentwheresdept=‘教育系’andsage20前面讲的谓词in实际上是多个or的缩写法数据库技术二.单表查询三、对查询结果排序可以通过orderby子句对结果按照一个或多个属性列的升序(asc)或降序(desc)排列,缺省为升序.orderby列名[asc|desc]如查询选修了2号课程的学生姓名和成绩,并按分数降序排列:selectsno,gradefromscwherecno=‘3’orderbygradedesc数据库技术二.单表查询注意:①对于空值的升序和降序是排在什么位置的?②orderby的列名如果不在select目标表达式中会怎样?数据库技术二.单表查询四、使用集函数(聚合函数)SQL提供了集函数用来实现统计查询count([disntinct|all]*):统计元组的个数count([disntinct|all]列名):统计一列中值个数sum([disntinct|all]列名):此列为数值型avg([disntinct|all]列名):此列为数值型max([disntinct|all]列名)min([disntinct|all]列名)数据库技术二.单表查询①查询学生总人数selectcount(*)fromstudent②查询查询选修课程的学生人数selectcount(distinctsno)fromsc这里count(*)和count(列名)有区别,主要是空值的问题。如果表里面没有空值,可能就没区别了数据库技术二.单表查询③查询2号课程的平均成绩和最高分selectavg(grade),max(grade)fromscwherecno=‘2’数据库技术二.单表查询五、对查询结果进行分组groupby子句将查询结果按照某一列或多列值分组,值相等的为一组。对查询结果分组的目的是为了细化集函数的作用对象。如果未对查询结果分组,集函数将作用于整个查询结果。如果分组后还要求按一定的条件对这些组进行筛选,最终只输出满足条件的组,则可以使用having短语指定筛选条件.数据库技术二.单表查询如查询各个课程号及相应的选课人数selectcno,count(sno)fromscgroupbycno数据库技术二.单表查询注意问题:①如果select子句目标表达式中包含聚合函数,则计算每组的汇总值指定groupby时,选择列表中每一个非聚合表达式的所有列都应包含在groupby列表中,或者groupby表达式必须与选择列表表达式完全匹配。数据库技术二.单表查询②使用all关键字可以包含所在组和结果集,甚至包含那些任何行都不满足where子句指定的搜索条件的组中不满足搜索条件的汇总列返回空值selectcno,count(sno)fromscwherecno=2groupbycnowherecno=2groupbyallcno数据库技术二.单表查询六、指定组和聚合的搜索条件having子句的功能是指定组或聚合的搜索条件。Having通常与groupby子句一起使用。如果不使用groupby子句,having的作用跟where子句一样。having与where的区别在于:where子句搜索条件在进行分组操作之前应用;而having搜索条件在进行分组之后应用。having语法与where语法类似,但having可以包含聚合函数。数据库技术二.单表查询如查询选修了3门以上课程的学生学号selectsnofromscgroupbysnohavingcount(*)3
本文标题:SQL语言之数据查询(1)
链接地址:https://www.777doc.com/doc-3592143 .html