单表查询
来源:互联网 发布: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='张三';
结果集:
- sql单表查询
- mysql 单表查询
- 有关单表查询
- 数据库单表查询
- 五、单表查询
- MyBatis单表查询
- SQLServer单表查询
- 单表查询SQL
- 单表查询
- mysql单表查询
- 单表查询SQL
- 6.单表查询
- MySQL 单表查询
- 单表查询操作
- SELECT单表查询
- MySQL 单表查询
- MySQL-单表查询
- 单表查询
- glob模式
- Linux网络编程(一)socket模型创建
- HDU 6061 RXD and functions
- 前端js面试中的常见的算法问题
- AS-Fragment-cannot resolve method add();
- 单表查询
- 关于寻路算法的一些思考(6):预先计算好的路径的所用空间
- Linux 命令大全
- 高斯消元
- SVM学习笔记-对偶形式的SVM
- hive常见命令
- jstack 命令查看JAVA线程堆栈
- 在指定字段后添加字段示例
- sizeof和strlen区别以及使用情况分析