SQL语言是通用的数据库语言
SQL命令可分为数据定义语言、数据操纵语言、事务控制语言和数据控制语言
Oracle支持的数据类型包括字符、数值、日期时间、RAW和LOB等
伪列:ROWID、ROWNUM
数据完整性:实体完整性、域完整性、引用完整性、自定义完整性
1、选择无重复的行,使用distinct关键字
select distinct sclass from student;
2、给列指定别名
select cid as 课程号,cname as 课程名 from course;
3、对查询结果进行排序 order by 排序字段 排序方式
select * from score where sid='10011' order by score desc;
4、模糊查询:字段 like 匹配表达式
%:0个或多个字符
_:任意单个字符
select * from student where sname like '张%';
5、利用现有的表创建表
create table <new_table_name> as select column_names from <old_table_name>;
例如:create table stubak as select * from student;
create table stuclass as select * from student where sclass=1;
create table stuemp as select * from student where 1=2;
联接查询(多表)
交叉联接(cross join)
select 列名列表 from T1 cross join T2;
一个交叉联接(cross join)接收两个分别有N行和M行的表T1和T2,然后返回一个包含交叉乘积N×M条记录的联接表
例如:知道学生与课程有多少可能的组合:select * from student cross join course;
也可以不适用join:select * from student,course;
内联接(等值联接)
例如:查询学生总体学习情况:学生姓名,课程名,成绩
select sname,cname,score from t_student join t_score on t_student.sid=t_score.sid join t_course on t_course.cid=t_score.cid;
或者:select sname,cname,score from t_student,t_score,t_coure where t_student.sid=t_score.sid and t_coure.cid=t_score.cid;
外联接
例如:内联接查询教师和课程的对应情况
select * from teacher join teachcourse on teacher.tid=teachcourse.tid;
查看所有教师的工作分配情况,即没有课程的教师也要出现在查询结果中,此时就用外联接
select * from teacher full join teachcourse on teacher.tid=teachcourse.tid;
左外联接left
右外联接right
全联接
分组聚合
SQL中提供得聚合函数 Min、Max、Sum、Avg、Count
对记录分组通过关键字group by 实现
select sid, max(score) as maxscore, min(score) as minscore, sum(score) as totalscore, avg(score) as avgscore from t_score group by sid;
Having子句
Having子句主要用于聚合查询中,在group之后过滤那些不符合条件的组
例如:平均成绩超过75的学生的学号和平均成绩
select sid,avg(score) as avgscore from t_score group by sid having avg(score)>=75;
子查询
例如:查询比大山老师年龄大的教师的信息
select * from teacher where tage > (select tage from teacher where tname='大山');
[not]in子查询 适用于子查询中返回多个值时的情况
select 列名 from 表名 where 列名 [not] in (子查询)
例如:查询所有已经安排教师上课的课程信息
select * from course where cid in (select cid from teachcourse);
exists子查询:存在查询,子查询不返回任何结果,只产生逻辑真或逻辑假
select 列名 from 表名 where [not] eaists (子查询)
例如:查询所有已经安排教师上课的课程信息
select * from course where exists (select * from teachcourse where teachcourse.cid=course.cid);
在from里面的子查询
当子查询返回一个结果集时,那么它就相当于一个普通的表,所以,在from子句我们同样可以使用子查询
在成绩表中查询出所有学生的最高平均分
select max(avgscore) from (select avg(score) as avgscore from t_score group by sid);
分页查询:rownum伪列
select * from (select rownum as num,sid,sname,ssex,sclass from t_student) where num>=11 and num<=20;