单表查询

来源:互联网 发布:mac关闭访客 编辑:程序博客网 时间:2024/06/05 11:05

一、投影查询:

需要注意的是这里是可以作别名查询的,如:select    name    as   EmpName,age   as   EmpAge   from   employee;

其实表也是可以取别名的,在查询中首次出现表名的地方后接as并设定别名,如:

select   t.name  as  EmpName,t.age     as   EmpAge    from   employee   as   t;

二、选择查询:基本定义:在关系表中选择满足给定条件的元组(从行的角度),更进一步说,选择查询通过一系列的方式筛选出我们实际需要的数据,常见的有四种筛选方式:


1、条件子句:多条件连接词and、or。需要注意的是针对范围性的查询,有三种SQL写法:

(1.)

(2.)一般用于离散数据,关键字IN后面的括号中必须包含所有可能匹配的值。如果表示不在这个范围里的话,可以用关键字NOT IN来反转查询结果:

   

(3.)between   ... and ...:



2、模糊查询:通配符是一种特殊语句,主要用于模糊搜索,常见的通配符包括:

(1.)%任意数量的未知字符的替身;

(2.)-下划线是一个未知字符的替身。

如:select   *  from   employee   where  name  LIKE   '张%';

3、子查询:将内层查询的结果集作为外层查询的条件使用,如:

select   *  from   employee  where  entry_time   in(select   entry_time   from   employee  where  name='张三');

查询排序:

select    *  from   employee  where dept='软件开发部'    order by  name   ASC;

ASC是升序,DESC是降序,如果是中文字符,会按照其拼音的顺序排序。

4、聚合查询:做一些统计方面的工作,有两种统计方式:

(1.)简单统计:简单统计主要是利用SQL语言中的内置聚合函数来实现,常见的聚合函数包括:


如:


(2.)分组统计:group  by;如:


得到的结果集如下:


带有条件的分组查询:


得到的结果集如下:



注意(1.)聚合和非聚合不可以同时出现在查询的字段中,如现有person表如下:


select   name,count(age)  from  person是不对的,如果出现这种混合,那么非聚合的字段必须跟在group  by后面作为分组的条件,如select   name,count(age)  from  person   group  by  age;再如select name,age,count(*) from person group by age,name,结果集如下:


不过group by后面的字段却可以是select后面没有出现的。

(2.)聚合函数只能出现在select   和from之间。

(3.)没有聚合函数是不可以用group  by分组语句的。

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

例一:现有选课系统:

学生表  student:


课程表 course:


选课表 xk:


(1.)现在按照班级统计男女的比例:

select s.classes,s.gender,100*count(s.studentno)/(select count(studentno) from student s1 where s.classes=s1.classes)||'%' from student s   group by s.classes,s.gender;
说明:小括号的优先级是最高的,这里最外面的count有条件group  by  s.classes,s.gender的限制,所以它是分过班级并且分过性别后的人数,里面一层的count统计的则是分过班级后的总数。两者相除即为结果。
结果集如下:


(2.)统计各个班级各门课程的平均分、最高分、最低分:

select s.classes 班级,c.coursename 课程,sum(score)/count(id) 平均分,max(score) 最高分,min(score) 最低分 fromxk inner join student s on xk.studentno=s.studentno inner join course c on xk.courseno=c.courseno group by s.classes,c.coursename order by s.classes; 
同样,这里有group by的条件。所以这里的sum、max、min都是分过班级、分过课程后的结果集。

(3.)

查询所有已选课程的函数querycourse:

create or replace function querycourse(sname varchar2) return varchar2 is  Result varchar2(500);  cursor c_job is  select c.coursename from course c inner join xk on c.courseno=xk.courseno  inner join student s on s.studentno=xk.studentno where s.studentname=sname;  c_row c_job%rowtype;  begin    open c_job;      loop        fetch c_job into c_row;        exit when c_job%notfound;        dbms_output.put_line(c_row.coursename);        Result:=Result||c_row.coursename||',';        end loop;        close c_job;  return(Result);end querycourse;

查询所有未选课程的函数nocourse:

create or replace function nocourse(sname varchar2) return varchar2 is  Result varchar2(500);  cursor c_job is  select c.coursename from course c where c.coursename not in (  select c.coursename from course c  inner join xk on xk.courseno=c.courseno  inner join student s on s.studentno=xk.studentno where s.studentname=sname);  c_row c_job%rowtype;  begin    open c_job;      loop        fetch c_job into c_row;        exit when c_job%notfound;        dbms_output.put_line(c_row.coursename);        Result:=Result||c_row.coursename||',';        end loop;        close c_job;  return(Result);end nocourse;


查询张三的选课情况:

select s.studentno 学号,s.studentname 姓名,(select querycourse('张三') from dual) 已选课 ,(select nocourse('张三') from dual) 未选课from student s where s.studentname='张三';

结果集:


原创粉丝点击