SQL语句基础4

注:除指明表格之外所有的数据来源于Oracle数据库自带的SCOTT用户表。

1. 表连接(99语法)

1.1 内连接

  • cross join语法:cross join即交叉连接,用于得到笛卡尔积

    --语法
    select 数据 from 数据源1 cross join 数据源2...;
    --员工信息表与部门信息表得到笛卡尔积
    select e.empno,e.ename,d.deptno from emp e cross join dept d;
    
  • natural join语法:natural join即自然连接,用于等值连接,会自动做同名字段或具有主外键关系的字段的等值连接。

    --语法
    select 数据 from 数据源1 natural join 数据源2;
    --查询员工的个人信息,部门信息
    select * from emp natural join dept;
    

    注:同名字段不能指明出处。

  • join…using语法:用于等值连接,可指定使用哪一个字段做等值连接。

    --语法
    select 数据 from 数据源1 join 数据源2 using (同名字段);
    --查询10部门员工的个人信息,部门信息
    select * from emp join dept using (deptno) where deptno = 10;
    

    注:同名字段不能指明出处。

  • join…on语法:可用于等值连接、非等值连接和多表连接。

    --语法
    select 数据 from 数据源1 join 数据源2 on 连接条件1 join 数据源3 on 连接条件3...;
    --等值连接(查询员工信息与其所在部门信息)
    select * from emp e join dept d on e.deptno = d.deptno;
    --非等值连接(查询员工信息及其薪资等级信息)
    select * from emp e join salgrade s on e.sal between s.losal and s.hisal;
    --多表连接(查询员工的个人信息,部门信息,工资等级)
    select * from emp e join dept d on e.deptno = d.deptno join salgrade s on e.sal between s.losal and s.hisal;
    

    注:同名字段需指明出处。

1.2 外连接

外连接分为左连接(left join)和右连接(right join),具体语法即举例代码如下:

select 数据 from 数据源1 left|right join 数据源2 on 表连接条件;
--左连接(查询员工的个人信息及上级信息)
select * from emp e1 left join emp e2 on e1.mgr = e2.empno;
--右连接(查询员工的个人信息及下级信息)
select * from emp e1 right join emp e2 on e1.mgr = e2.empno;

注:在from后,主表在左边即为左连接,主表在右边即为右连接。

同时还有一个全连接的概念,代码如下:

--全连接
select * from emp e1 full join emp e2 on e1.mgr = e2.empno;

select语法练习

创建多个新的表来进行select查询语句的练习,建表的代码如下:

--创建course表
CREATE TABLE COURSE(CNO   VARCHAR2 (5) NOT NULL,CNAME VARCHAR2 (15) NOT NULL,TNO   VARCHAR2 (10) NOT NULL,CONSTRAINT PK_COURSE PRIMARY KEY (CNO));
COMMENT ON COLUMN COURSE.CNO IS '学科编号';
COMMENT ON COLUMN COURSE.CNAME IS '学科名称';
COMMENT ON COLUMN COURSE.TNO IS '教师编号';
--创建grade表
CREATE TABLE GRADE(LOW  NUMBER (3) NOT NULL,UPP  NUMBER (3) NOT NULL,RANK CHAR (1) NOT NULL,CONSTRAINT PK_GRADE PRIMARY KEY (LOW, UPP));
COMMENT ON COLUMN GRADE.LOW IS '分数范围下限';
COMMENT ON COLUMN GRADE.UPP IS '分数范围上限';
COMMENT ON COLUMN GRADE.RANK IS '评级';
--创建score表
CREATE TABLE SCORE(SNO    VARCHAR2 (3) NOT NULL,CNO    VARCHAR2 (5) NOT NULL,DEGREE NUMBER (10,1) NOT NULL,CONSTRAINT PK_SCORE PRIMARY KEY (SNO, CNO));
COMMENT ON COLUMN SCORE.SNO IS '学生编号';
COMMENT ON COLUMN SCORE.CNO IS '学科编号';
COMMENT ON COLUMN SCORE.DEGREE IS '成绩';
--创建student表
CREATE TABLE STUDENT(SNO       VARCHAR2 (3) NOT NULL,SNAME     VARCHAR2 (6) NOT NULL,SSEX      VARCHAR2 (3) NOT NULL,SBIRTHDAY DATE NOT NULL,CLASS     VARCHAR2 (5) NOT NULL);
COMMENT ON COLUMN STUDENT.SNO IS '学生编号';
COMMENT ON COLUMN STUDENT.SNAME IS '学生姓名';
COMMENT ON COLUMN STUDENT.SSEX IS '学生性别';
COMMENT ON COLUMN STUDENT.SBIRTHDAY IS '生日';
COMMENT ON COLUMN STUDENT.CLASS IS '班级';
--创建teacher表
CREATE TABLE TEACHER(TNO       VARCHAR2 (3) NOT NULL,TNAME     VARCHAR2 (6) NOT NULL,TSEX      VARCHAR2 (3) NOT NULL,TBIRTHDAY DATE NOT NULL,PROF      VARCHAR2 (9) NOT NULL,DEPART    VARCHAR2 (15) NOT NULL,CONSTRAINT PK_TEACHER PRIMARY KEY (TNO));
COMMENT ON COLUMN TEACHER.TNO IS '教师编号';
COMMENT ON COLUMN TEACHER.TNAME IS '教师姓名';
COMMENT ON COLUMN TEACHER.TSEX IS '性别';
COMMENT ON COLUMN TEACHER.TBIRTHDAY IS '生日';
COMMENT ON COLUMN TEACHER.PROF IS '职称';
COMMENT ON COLUMN TEACHER.DEPART IS '部门';
--往course表中插入数据
INSERT INTO COURSE (CNO, CNAME, TNO)
VALUES ('3-105', '计算机导论', '825');
INSERT INTO COURSE (CNO, CNAME, TNO)
VALUES ('3-245', '操作系统', '804');
INSERT INTO COURSE (CNO, CNAME, TNO)
VALUES ('6-166', '数据电路', '856');
INSERT INTO COURSE (CNO, CNAME, TNO)
VALUES ('9-888', '高等数学', '100');
--往grade表中插入数据
INSERT INTO GRADE (LOW, UPP, RANK)
VALUES (90, 100, 'A');
INSERT INTO GRADE (LOW, UPP, RANK)
VALUES (80, 89, 'B');
INSERT INTO GRADE (LOW, UPP, RANK)
VALUES (70, 79, 'C');
INSERT INTO GRADE (LOW, UPP, RANK)
VALUES (60, 69, 'D');
INSERT INTO GRADE (LOW, UPP, RANK)
VALUES (0, 59, 'E');
--往score表中插入数据
INSERT INTO SCORE (SNO, CNO, DEGREE)
VALUES ('103', '3-245', 86);
INSERT INTO SCORE (SNO, CNO, DEGREE)
VALUES ('105', '3-245', 75);
INSERT INTO SCORE (SNO, CNO, DEGREE)
VALUES ('109', '3-245', 68);
INSERT INTO SCORE (SNO, CNO, DEGREE)
VALUES ('103', '3-105', 92);
INSERT INTO SCORE (SNO, CNO, DEGREE)
VALUES ('105', '3-105', 88);
INSERT INTO SCORE (SNO, CNO, DEGREE)
VALUES ('109', '3-105', 76);
INSERT INTO SCORE (SNO, CNO, DEGREE)
VALUES ('101', '3-105', 64);
INSERT INTO SCORE (SNO, CNO, DEGREE)
VALUES ('107', '3-105', 91);
INSERT INTO SCORE (SNO, CNO, DEGREE)
VALUES ('108', '3-105', 78);
INSERT INTO SCORE (SNO, CNO, DEGREE)
VALUES ('101', '6-166', 85);
INSERT INTO SCORE (SNO, CNO, DEGREE)
VALUES ('107', '6-166', 79);
INSERT INTO SCORE (SNO, CNO, DEGREE)
VALUES ('108', '6-166', 81);
--往student表中插入数据
INSERT INTO STUDENT (SNO, SNAME, SSEX, SBIRTHDAY, CLASS)
VALUES ('108', '曾华', '男', TO_DATE ('1977-09-01', 'YYYY-MM-DD'), '95033');
INSERT INTO STUDENT (SNO, SNAME, SSEX, SBIRTHDAY, CLASS)
VALUES ('105', '匡明', '男', TO_DATE ('1975-10-02', 'YYYY-MM-DD'), '95031');
INSERT INTO STUDENT (SNO, SNAME, SSEX, SBIRTHDAY, CLASS)
VALUES ('107', '王丽', '女', TO_DATE ('1976-01-23', 'YYYY-MM-DD'), '95033');
INSERT INTO STUDENT (SNO, SNAME, SSEX, SBIRTHDAY, CLASS)
VALUES ('101', '李军', '男', TO_DATE ('1976-02-20', 'YYYY-MM-DD'), '95033');
INSERT INTO STUDENT (SNO, SNAME, SSEX, SBIRTHDAY, CLASS)
VALUES ('109', '王芳', '女', TO_DATE ('1975-02-10', 'YYYY-MM-DD'), '95031');
INSERT INTO STUDENT (SNO, SNAME, SSEX, SBIRTHDAY, CLASS)
VALUES ('103', '陆君', '男', TO_DATE ('1974-06-03', 'YYYY-MM-DD'), '95031');
--往teacher表中插入数据
INSERT INTO TEACHER (TNO, TNAME, TSEX, TBIRTHDAY, PROF, DEPART)
VALUES ('804', '李诚', '男', TO_DATE ('1958-12-02', 'YYYY-MM-DD'), '副教授', '计算机系');
INSERT INTO TEACHER (TNO, TNAME, TSEX, TBIRTHDAY, PROF, DEPART)
VALUES ('856', '张旭', '男', TO_DATE ('1969-03-12', 'YYYY-MM-DD'), '讲师', '电子工程系');
INSERT INTO TEACHER (TNO, TNAME, TSEX, TBIRTHDAY, PROF, DEPART)
VALUES ('825', '王萍', '女', TO_DATE ('1972-05-05', 'YYYY-MM-DD'), '助教', '计算机系');
INSERT INTO TEACHER (TNO, TNAME, TSEX, TBIRTHDAY, PROF, DEPART)
VALUES ('831', '刘冰', '女', TO_DATE ('1977-08-14', 'YYYY-MM-DD'), '助教', '电子工程系');

下面给出了一些自己练习的题目以及答案代码(可能也会有更好的方法):

/*
course 学科表
score 成绩表
student 学生表
grade 评级表
teacher 教师表
*/
--查询Student表中的所有记录的Sname、Ssex和Class列。
select sname, ssex, class from student;
--查询教师所有的单位即不重复的Depart列。
select distinct depart from teacher;
--查询Student表的所有记录。
select * from student;
--查询Score表中成绩在60到80之间的所有记录。
select * from score where degree between 60 and 80;
--查询Score表中成绩为85,86或88的记录。
select * from score where degree in (85, 86, 88);
--查询Student表中“95031”班或性别为“女”的同学记录。
select *from studentwhere class = 95031or ssex = '女';
--以Class降序查询Student表的所有记录。
select * from student order by class desc;
--以Cno升序、Degree降序查询Score表的所有记录。
select * from score order by cno asc, degree desc;
--查询“95031”班的学生人数。
select count(sno) from student where class = 95031;
--查询Score表中的最高分的学生学号和课程号。
select sno, cno from score where degree = (select max(degree) from score);
--查询‘3-105’号课程的平均分。
select avg(degree) from score where cno = '3-105';
--查询Score表中至少有5名学生选修的并以3开头的课程的平均分数。
select avg(degree)from scorewhere cno like '3%'group by cno
having count(cno) > 5;
--查询最低分大于70,最高分小于90的Sno列。
select snofrom scoregroup by sno
having min(degree) > 70 and max(degree) < 90;
--查询所有学生的Sname、Cno和Degree列。
select s1.sname, s2.cno, s2.degree --表连接92语法from student s1, score s2where s1.sno = s2.sno;select s1.sname, s2.cno, s2.degree --表连接99语法from student s1join score s2on s1.sno = s2.sno;
--查询所有学生的Sno、Cname和Degree列。
select s1.sno, c.cname, s2.degree --表连接92语法from student s1, score s2, course cwhere s1.sno = s2.snoand s2.cno = c.cno;select s1.sno, c.cname, s2.degree --表连接99语法from student s1join score s2on s1.sno = s2.snojoin course con s2.cno = c.cno;
--查询所有学生的Sname、Cname和Degree列。
select s1.sname, c.cname, s2.degree --表连接92语法from student s1, score s2, course cwhere s1.sno = s2.snoand s2.cno = c.cno;select s1.sname, c.cname, s2.degree --表连接99语法from student s1join score s2on s1.sno = s2.snojoin course con s2.cno = c.cno;
--查询“95033”班所选课程的平均分
select avg(degree)from (select s1.sname, s1.class, s2.cno, s2.degree --表连接92语法from student s1, score s2where s1.sno = s2.snoand s1.class = 95033)group by cno;select avg(degree)from (select s1.sname, s1.class, s2.cno, s2.degree --表连接99语法from student s1join score s2on s1.sno = s2.snoand s1.class = 95033)group by cno;
--现查询所有同学的Sno、Cno和rank列。
select s.sno, s.cno, g.rank --表连接92语法from score s, grade gwhere s.degree between g.low and g.upp;select s.sno, s.cno, g.rank --表连接99语法from score sjoin grade gon s.degree between g.low and g.upp;
--查询选修“3-105”课程的成绩高于“109”号同学成绩的所有同学的记录。
select *from scorewhere cno = '3-105'and degree > (select degreefrom scorewhere sno = 109and cno = '3-105');
--查询score中选学一门以上课程的同学中分数为非最高分成绩的记录。
select *from score s1where sno in (select sno from score group by sno having count(sno) > 1)and degree <(select max(degree) from score s2 group by cno having s2.cno = s1.cno);
--查询成绩高于学号为“109”、课程号为“3-105”的成绩的所有记录。
select *from scorewhere cno = '3-105'and degree > (select degreefrom scorewhere sno = 109and cno = '3-105');
--查询“张旭“教师任课的学生成绩。
select sno, tname, degree --表连接92语法from (select *from course c, score s, teacher twhere t.tno = c.tnoand c.cno = s.cno)where tname = '张旭';select sno, tname, degree --表连接99语法from (select *from course cjoin score son c.cno = s.cnojoin teacher ton t.tno = c.tno)where tname = '张旭';
--查询选修某课程的同学人数多于5人的教师姓名。
select tnamefrom (select *from course c, score s, teacher t --表连接92语法where t.tno = c.tnoand c.cno = s.cno)group by tname
having count(tname) > 5;select tname --表连接99语法from (select *from course cjoin score son c.cno = s.cnojoin teacher ton t.tno = c.tno)group by tname
having count(tname) > 5;
--查询95033班和95031班全体学生的记录
select * from student where class in (95033, 95031);
--查询存在有85分以上成绩的课程Cno.
select cno from score group by cno having max(degree) > 85;
--查询出“计算机系“教师所教课程的成绩表。
select sno, degree, tname, departfrom (select *from course c, score s, teacher t --表连接92语法where t.tno = c.tnoand c.cno = s.cno)where depart = '计算机系';select sno, degree, tname, depart --表连接99语法from (select *from course cjoin score son c.cno = s.cnojoin teacher ton t.tno = c.tno)where depart = '计算机系';
--查询选修编号为“3-105“课程且成绩至少高于选修编号为“3-245”的同学的Cno、Sno和Degree,并按Degree从高到低次序排序。
select cno, sno, degreefrom scorewhere sno in(select snofrom score s1group by snohaving (select degreefrom score s2where cno = '3-105'and s2.sno = s1.sno) > (select degreefrom score s2where cno = '3-245'and s2.sno = s1.sno))order by degree asc;
--查询所有教师和同学的name、sex和birthday.
select t.tname name, t.tsex sex, t.tbirthday birthdayfrom teacher t
union
select s.sname name, s.ssex sex, s.sbirthday birthdayfrom student s;
--查询所有“女”教师和“女”同学的name、sex和birthday.
select t.tname name, t.tsex sex, t.tbirthday birthdayfrom teacher twhere t.tsex = '女'
union
select s.sname name, s.ssex sex, s.sbirthday birthdayfrom student swhere s.ssex = '女';
--成绩比该课程平均成绩低的同学的成绩表。
select *from score s1where degree <(select avg(degree) from score s2 group by cno having s2.cno = s1.cno);
--查询所有任课教师的Tname和Depart.
select t.tname, t.depart from teacher t, course c where t.tno = c.tno; --表连接92语法select t.tname,t.depart from teacher t join course c on t.tno = c.tno; --表连接99语法
--查询所有未讲课的教师的Tname和Depart.
select t.tname, t.departfrom teacher t
minus
select t.tname, t.departfrom teacher t, course cwhere t.tno = c.tno;
--查询至少有2名男生的班号。
select classfrom (select class, count('男') "nan"from studentwhere ssex = '男'group by class)where "nan" >= 2;
--查询Student表中不姓“王”的同学记录。
select * from student where sname not like '王%';
--查询Student表中每个学生的姓名和年龄。
select sname, (sysdate - sbirthday) / 365 "年龄" from student;
--查询Student表中最大和最小的Sbirthday日期值。
select sname, sbirthdayfrom studentwhere (sysdate - sbirthday) =(select max(sysdate - sbirthday) from student)or (sysdate - sbirthday) =(select min(sysdate - sbirthday) from student);
--以班号和年龄从大到小的顺序查询Student表中的全部记录。
select * from student order by class desc, sysdate - sbirthday desc;
--查询“男”教师及其所上的课程。
select *from (select t.tname, t.tsex, c.cname --表连接92语法from teacher t, course cwhere t.tno = c.tno)where tsex = '男';select *from (select t.tname, t.tsex, c.cname --表连接99语法from teacher tjoin course con t.tno = c.tno)where tsex = '男';
--查询最高分同学的Sno、Cno和Degree列。
select sno, cno, degreefrom score s1where degree =(select max(degree) from score s2 group by cno having s2.cno = s1.cno);
--查询和“李军”同性别的所有同学的Sname.
select snamefrom studentwhere ssex = (select ssex from student where sname = '李军');
--查询和“李军”同性别并同班的同学Sname.
select snamefrom studentwhere ssex = (select ssex from student where sname = '李军')and class = (select class from student where sname = '李军');
--查询所有选修“计算机导论”课程的“男”同学的成绩表
select sname, cname, ssex, degreefrom (select *from course c, score s1, student s2 --表连接92语法where c.cno = s1.cnoand s2.sno = s1.sno)where cname = '计算机导论'and ssex = '男';select sname, cname, ssex, degree --表连接99语法from (select *from course cjoin score s1on c.cno = s1.cnojoin student s2on s2.sno = s1.sno)where cname = '计算机导论'and ssex = '男';

SQL语句基础4/select查询语句练习相关推荐

  1. SQL server中的SELECT查询语句执行顺序

    各位大牛们好第一次写博客有点小激动!以后我会把自己的心得分享给大家,求各种评论 SQL server 中SELSECT查询语句的执行顺序如下: (8) SELECT   (9) DISTINCT (1 ...

  2. mysql select查询字段_MySQL基础:SELECT查询语句

    Blog:博客园 个人 概述 SELECT语句用于从表中选取/查询数据,结果被存储在一个结果表中(称为结果集). 语法格式 SELECT [ALL | DISTINCT | DISTINCTROW ] ...

  3. mysql select查询语句_mysql的select查询语句

    1.简单查询 mysql> select * from students; +------------+----------+------+------+ | id | sname | sex ...

  4. oracle 10g 连接语句,Oracle 10g数据库基础之基本查询语句-下-连接子查询

    实验18:表的连接查询 该实验的目的是掌握基本的联合查询. 表的连接 我们要从多张表中要得到信息,就得以一定的条件将表连接在一 实验18:表的连接查询 该实验的目的是掌握基本的联合查询. 表的连接 我 ...

  5. Oracle 10g数据库基础之基本查询语句-中-函数

    Oracle 10g数据库基础之基本查询语句-中-函数 --资料参考:张烈 张建中<数据库管理员培训讲义> 函数: 使用函数的目的是为了操作数据 将输入的变量处理,返回一个结果. 变量可以 ...

  6. 基于SqlServer的DML(数据查询)实验,掌握select查询语句的使用、掌握有无条件查询、结果排序与分组、掌握视图用法

    实验三 数据库的查询一.实验目的及要求 1. 熟练掌握SELECT查询语句的使用 2. 掌握无条件.有条件查询及查询结果排序与分组 3. 掌握视图的用法二.实验任务 1.掌握查询语句的一般格式. 2. ...

  7. oracle只查询0点数据,Oracle 10g数据库基础之基本查询语句-中-函数

    Oracle 10g数据库基础之基本查询语句-中-函数 --资料参考:张烈 张建中<数据库管理员培训讲义> 函数: 使用函数的目的是为了操作数据 将输入的变量处理,返回一个结果. 变量可以 ...

  8. 【MySQL】4、Select查询语句

    4.Select查询语句 4.1.select语句 <?php $servername = "localhost"; $username = "username&q ...

  9. 使用explain查询select查询语句执行计划

    1.使用explain查询select查询语句执行计划 mysql> select * from baba where name ='fjdsjf'; +------+--------+ | i ...

最新文章

  1. 2019年我只想明白了这5点
  2. MPLS 企业组网有哪些特性?——Vecloud
  3. 笔记-中项案例题-2019年下-信息系统安全管理
  4. COLING 2020 | 面向机器阅读理解的双向认知思维网络
  5. idea工具debug断点红色变成灰色
  6. location.replace与location.href,location.reload的区别
  7. java 弹窗选择_如何在java中点击button弹出一个选择框
  8. Linux yum仓库的安装
  9. C#实现在图片上斜着写字
  10. DRL实战 : Dynamic Programming
  11. 数据清洗 excel mysql_Excel获取MYSQL数据库数据
  12. 电信校园网宽带创翼破解,路由器PPPOE拦截法
  13. (转)Resin常见问题及解决方法
  14. SpringBoot三种实现邮箱发送功能
  15. 手把手教你:基于深度学习的滚动轴承故障诊断
  16. java半角英数check_java - 关于全角半角介绍以及处理方式
  17. 网易游戏AI Lab 招聘CV日常实习生
  18. 汉字 计算机 坟墓,墓的拼音_墓组词_墓意思(解释)-常用汉字大全
  19. 【采集项目-(6)全量数据采集】
  20. 绘画系统——P5.js

热门文章

  1. oss :Request has expired.
  2. “技能成就梦想 创新促进发展”2016年成德绵创新改革试验区第二届高技能人才交
  3. 百家游坛发起苹果APP推广者大会 揭行业潜规则
  4. 【Linux】修改腾讯云轻量应用服务器的hostname
  5. tp5:为什么find()出来的数据有时候可以用toArray() 有时候会报错?
  6. 【AI每日播报】首次超越LSTM : Facebook 门卷积网络新模型能否取代递归模型
  7. jitter概念理解
  8. 北理工计算机2020学硕录取,北京理工大学2020硕士研究生拟录取名单
  9. 人脸检测:Viola-Jones
  10. 使用ADB命令抓取手机日志——如手机无响应adb bugreport bugreport.txt