在SQL语言提到过select查询语句,那仅仅是针对单表而言,现在我们需要更深入了解ORACLE的查询。先前有总结一篇基础查询,但不全面,最近总结了SQL查询,因此再将ORACLE的相关查询语法进行。
有单表肯定就会有多表。以下是多表查询的相关知识概念
select employees.employee_id.employess.department_id,departments.department_name
from employees,department;
为了避免笛卡尔集, 可以在 WHERE 加入有效的连接条件。Oracle 连接。使用连接在多个表中查询数据。具体操作 :在 WHERE 子句中写入连接条件。在表中有相同列时,在列名之前加上表名前缀
select employees.employee_id,departments.department_id
from employees,department;
Where employess.department_id=departments.department_id
为了避免查询中查询列名的繁琐,混淆。我们使用别名 使用别名可以简化查询。使用表名前缀可以提高执行效率。
Eg:查询所有学生的Sno、Cname和Degree列。
连接多个表:连接 n个表,至少需要 n-1个连接条件。 例如:连接三个表,至少需要两个连接条件。
非等值连接Eg :查询每个员工的 last_name 和 GRADE_LEVEL(在 JOB_GRADES 表中).
select last_name, salary, grade_level, lowest_sal, highest_sal
from employees e, job_grades j
where e.salary >= j.lowest_sal and e.salary <= j.highest_sal
外连接语法需要注意的点是:使用外连接可以查询不满足连接条件的数据。外连接的符号是 (+)。我们学到的主要概念是:外连接: 两个表在连接过程中除了返回满足连接条件的行以外还返回左(或右)表中不满足条件的行 ,这种连接称为左(或右) 外连接。没有匹配的行时, 结果表中相应的列为空(NULL). 外连接的 WHERE 子句条件类似于内部连接, 但连接条件中没有匹配行的表的列后面要加外连接运算符, 即用圆括号括起来的加号(+).eg:9. 查询所有部门的名字,location_id,员工数量和工资平均值
select d.department_name,d.location_id,count(employee_id),avg(salary)
from departments d,locations l,employees e
where e.department_id(+)=d.department_id
group by d.department_name,d.location_id
"(+)" 的位置: 以左外连接为例, 因为左表需要返回更多的记录,右表就需要 "加上" 更多的记录, 所以在右表的链接条件上加上 "(+)"
自连接:自己表内的字段查询连接
Eg:选择指定员工的姓名,员工号,以及他的管理者的姓名和员工号
select e1.last_name,e1.employee_id,e2.manager_id,e2.last_name,e2.employee_id
from employees e1 ,employees e2 where e1.employee_id=e2.employee_id
SQL 99 连接:使用SQL: 1999 语法连接。使用连接从多个表中查询数据
Eg:外连接的1999写法。查询所有部门的名字,location_id,员工数量和工资平均值
select distinct d.department_name,d.location_id,count(employee_id),avg(salary)
from employees e right join departments d on e.department_id=d.department_id
使用CROSS JOIN 子句使连接的表产生叉集。叉集和笛卡尔集是相同的。
自然连接:NATURAL JOIN 子句,会以两个表中具有相同名字的列为条件创建等值连接。在表中查询满足等值条件的数据。如果只是列名相同而数据类型不同,则会产生错误。在NATURAL JOIN 子句创建等值连接时,可以使用 USING 子句指定等值连接中需要用到的列。使用 USING 可以在有多个列满足条件时进行选择。不要给选中的列中加上表名前缀或别名。JOIN 和 USING 子句经常同时使用。
使用ON 子句创建连接,自然连接中是以具有相同名字的列为连接条件的。可以使用 ON 子句指定额外的连接条件。这个连接条件是与其它条件分开的。ON 子句使语句具有更高的易读性。使用 ON 子句可创建多表连接,这种也常用到。左(或右) 外连接:1999中,内连接只返回满足连接条件的数据
两个表在连接过程中除了返回满足连接条件的行以外还返回左(或右)表中不满足条件的行
左外连接:关键词:LEFT OUTER JOIN
右外连接:关键词:right OUTER JOIN满外连接:两个表在连接过程中除了返回满足连接条件的行以外还返回两个表中不满足条件的行 ,这种连接称为满外连接。关键词:full OUTER JOIN。运用格式同左连接
单表查询,多表查询过后,我们学习的课程中还有子查询的讲解。子查询语法:子查询 (内查询) 在主查询之前一次执行完成。子查询的结果被主查询(外查询)使用 。
Eg:查询Score表中的最高分的学生学号和课程号。
子查询需要注意到的点:子查询要包含在括号内。将子查询放在比较条件的右侧。单行操作符对应单行子查询,多行操作符对应多行子查询。子查询也有很多操作符。=,eual to 等值;> Greater than 超过
>=Greater than or equal to超值且相等; <>Not equal to 不等; 举一个Greater than 的例子 Eg:查询成绩高于学号为“109”、课程号为“3-105”的成绩的所有记录 select sno,cno,degree from score where cno='3-105' and degree>(select degree from score where cno='3-105'and sno='109') 在子查询中也可以使用组函数 Eg:查询选修编号为“3-105“课程且成绩至少高于选修编号为“3-245”的同学的Cno、Sno和Degree,并按Degree从高到低次序排序。 select * from score where degree>(select max(degree) from score where cno='3-245') and cno='3-105' order by degree desc 子查询中的 HAVING 子句,首先执行子查询。向主查询中的HAVING 子句返回结果。 Eg:查询score中选学多门课程的同学中分数为非最高分成绩的记录。 多行子查询:返回多行。使用多行比较操作符In:等于列表中的任意一个;ANY:和子查询返回的某一个值比较;ALL:和子查询返回的所有值比较Eg:(in)查询所有任课教师的Tname和Depart. Eg:(ANY)查询成绩比该课程平均成绩低的同学的成绩表。 select * from score where degree < any (select avg(degree) from score group by cno) Eg:(ALL) 查询选修编号为“3-105”且成绩高于选修编号为“3-245”课程的同学的Cno、Sno和Degree. Eg:(NOT IN)查询所有未讲课的教师的Tname和Depart.