​
SQL> select * from student;SNO SNAME                                    SSEX           SAGE SDEPT
---------- ---------------------------------------- -------- ---------- ----------------------------------------6 李宇航                                   男               22 口腔医学7 苏小白                                   男               22 中医药1 张波                                     男               18 软件工程2 李增福                                   男               21 预防医学3 安霞                                     女               21 临床医学4 贺建                                     女               20 应用数学5 杨鹏飞                                   男               20 应用数学已选择7行。​

学生表

SQL> select * from studentscore;SNO SNAME                   ENGLISH    CHINESE       MATH
---------- -------------------- ---------- ---------- ----------1 张波                         53         99         752 李增福                       62         88         903 安霞                         80         46         864 贺建                         99         86         965 杨鹏飞                       72         76         636 李宇航                       62         65         667 苏小白                       32         68         608 李旭                         64         86         989 张必过                       26         35         3610 安星宇                       76         75         73已选择10行。

成绩表

这是我用的表

一、筛选查询

1.比较查询

格式 :select  列名1,... from 表名 where  比较条件

查询年龄大于20的所有人的姓名和年龄

语句:select sname as "姓名",sage as "年龄" from student where sage>20;

SQL> select sname as "姓名",sage as "年龄" from student where sage>20;姓名                                           年龄
---------------------------------------- ----------
李宇航                                           22
苏小白                                           22
李增福                                           21
安霞                                             21

注意:不等于号为  !=或者   <>

2.逻辑查询

关键字:and,or,not

and只有全为true时返回,or只要有一个正确就返回,not求反操作

查询年龄大于20且非女生专业为口腔医学或者预防医学的姓名,专业,性别,年龄

select sname as "姓名",sage as "年龄",ssex as "性别",sdept as "专业" from student where sage>20 and (not ssex='女') and (sdept='预防医学' or sdept='口腔医学');

结果:

SQL> select sname as "姓名",sage as "年龄",ssex as "性别",sdept as "专业" from student where sage>20 and (not ssex='女') and (sdept='预防医学' or sdept='口腔医学');姓名                                           年龄 性别     专业
---------------------------------------- ---------- -------- ----------------------------------------
李宇航                                           22 男       口腔医学
李增福                                           21 男       预防医学

3.模糊查询

用于符合一定要求的查询,比如查询姓李的人,为  name like '李%'

关键字:like,not like

与like搭配使用%和_:%说明还有0或者n个字符,_只有一个字符

比如:like %c%查找中间为c的字符串

例子:查找姓李的同学姓名

select sname from student where sname like '李%';

SQL>  select sname from student where sname like '李%';SNAME
----------------------------------------
李增福
李宇航

查询不姓李的同学:

select sname from student where sname not like '李%';

SQL> select sname from student where sname not like '李%';SNAME
----------------------------------------
安霞
张波
杨鹏飞
苏小白
贺建

4.范围查询

关键词 between .....and 在....之间。

not between ...and 不在....之间。

使用范围:数字、字符串、日期

例:查询年龄在20到21之间学生姓名和年龄

select sname,sage from student where sage between 20 and 21;(包含20与21)

SQL> select sname,sage from student where sage between 20 and 21;SNAME                                          SAGE
---------------------------------------- ----------
李增福                                           21
安霞                                             21
贺建                                             20
杨鹏飞                                           20

查询年龄不在20到21之间的

select sname,sage from student where sage not between 20 and 21;

SQL> select sname,sage from student where sage not between 20 and 21;SNAME                                          SAGE
---------------------------------------- ----------
李宇航                                           22
苏小白                                           22
张波                                             18

5.判断内容是否为null

关键字: is null,is not null

当一个字段为null,那么如果对其进行一些计算操作那么结果也为null

我们在student中插入一条数据

insert into student (sno,sname,ssex)values (8,'李旭','男');

SQL> select * from student where sno=8;SNO SNAME                                    SSEX           SAGE SDEPT
---------- ---------------------------------------- -------- ---------- ----------------------------------------8 李旭                                     男

这条数据的年龄和专业都为null

例子:判断没有存入学生专业的那名学生姓名

我们用 =null 和 is null同时查找

SQL> select sname from student where sage is null;SNAME
----------------------------------------
李旭SQL> select sname from student where sage=null;未选定行SQL> select sname from student where sdept=null;未选定行

我们发现虽然=null不报错,但是它查不到任何信息

查询年龄不为null的所有学生姓名

SQL> select sname from student where sage is not null;SNAME
----------------------------------------
李宇航
苏小白
张波
李增福
安霞
贺建
杨鹏飞已选择7行。SQL> select sname from student where sage!=null;未选定行

二、分组查询

首先介绍一些常用的函数

        函数                                         说明
avg(str) 返回数字列或者计算列的平均值
count(str) 返回查询结果的记录数
max(str) 返回一计算列或者计算列最大值
min(str) 返回一计算列或者计算列最小值
sum(str) 返回一数字列或者计算的总和

所用到表的内容:

SQL> select * from student;SNO SNAME                                    SSEX           SAGE SDEPT
---------- ---------------------------------------- -------- ---------- ----------------------------------------6 李宇航                                   男               22 口腔医学7 苏小白                                   男               22 中医药1 张波                                     男               18 软件工程2 李增福                                   男               21 预防医学3 安霞                                     女               21 临床医学4 贺建                                     女               20 应用数学5 杨鹏飞                                   男               20 应用数学8 李旭                                     男               19 临床医学9 张必过                                   男               19 预防医学10 安星宇                                   男               23 软件工程已选择10行。

1.单字段分组

关键字:group by

格式: select 列名.... where 表名 gruop by  列名;

例子:查询每一专业的人数

select sdept,count(sdept) from student group by sdept;

SQL> select sdept,count(sdept) from student group by sdept;SDEPT                                    COUNT(SDEPT)
---------------------------------------- ------------
口腔医学                                            1
临床医学                                            2
软件工程                                            2
预防医学                                            2
应用数学                                            2
中医药                                              1已选择6行。

查询每一专业最大和最小年龄

select sdept,max(sage),min(sage) from student group by sdept;

SQL> select sdept,max(sage),min(sage) from student group by sdept;SDEPT                                     MAX(SAGE)  MIN(SAGE)
---------------------------------------- ---------- ----------
口腔医学                                         22         22
临床医学                                         21         19
软件工程                                         23         18
预防医学                                         21         19
应用数学                                         20         20
中医药                                           22         22已选择6行。

2.多字段分组

关键字:group by4

格式:select ...from 表名 列名...;

例:查询每一个专业男女年龄最大最小

select sdept,max(sage),min(sage),ssex from student group by sdept,ssex;

SQL> select sdept,max(sage),min(sage),ssex from student group by sdept,ssex;SDEPT                                     MAX(SAGE)  MIN(SAGE) SSEX
---------------------------------------- ---------- ---------- --------
中医药                                           22         22 男
软件工程                                         23         18 男
临床医学                                         21         21 女
应用数学                                         20         20 女
临床医学                                         19         19 男
预防医学                                         21         19 男
应用数学                                         20         20 男
口腔医学                                         22         22 男

3.限制分组结构

关键字 having

对数据进行了限制

例:查找每一个专业的最大年龄按专业分组,且最大年龄大于21;

select sdept,max(sage) from student
   group by sdept
    having max(sage)>21;

SQL> select sdept,max(sage) from student2  group by sdept3  having max(sage)>21;SDEPT                                     MAX(SAGE)
---------------------------------------- ----------
口腔医学                                         22
软件工程                                         23
中医药                                           22

三、排序查询

1.单列排列

关键字 desc和asc一种为降序一种为升序

和order by 一起使用

格式:select 列名  from 表名

[where  ....]

[order by 列名 desc];

例:查询数学成绩大于60人的名字
 select sname,math from studentscore
    where math>=60
    order by math desc;

SQL> select sname,math from studentscore2  where math>=603  order by math desc;SNAME                      MATH
-------------------- ----------
李旭                         98
贺建                         96
李增福                       90
安霞                         86
张波                         75
安星宇                       73
李宇航                       66
杨鹏飞                       63
苏小白                       60已选择9行。

2.多列排列

关键字 desc和asc一种为降序一种为升序

和order by 一起使用

格式:select 列名  from 表名

[where  ....]

[order by 列名1 desc,列名2 asc.....];

当第一列相同时那么在根据列名2规定排序

例:查询学生表里的学生姓名先按年龄降序,年龄相同按学号升序

select sname,sage,sno from student
order by sage desc,sno asc;

SQL> select sname,sage,sno from student2  order by sage desc,sno asc;SNAME                                          SAGE        SNO
---------------------------------------- ---------- ----------
安星宇                                           23         10
李宇航                                           22          6
苏小白                                           22          7
李增福                                           21          2
安霞                                             21          3
贺建                                             20          4
杨鹏飞                                           20          5
李旭                                             19          8
张必过                                           19          9
张波                                             18          1已选择10行。

四、多表关联

在多表关联要应用到数据为空的时候,所以我们在插入几条数据

向student表中插入:

insert into student (sno,sname,ssex)values(11,'李四','男');

insert into student (sno,sname,ssex,sage,sdept)values(13,'苏非','女',19,'中医药');

向studentscore中插入:

insert into studentscore(sno,sname)values(12,'王五');

insert into studentscore values(14,'黄尚',86,82,80);

在介绍多表 查询前先介绍一下表的别名

表的别名类似列的别名相同不过用不需要关键词,只需要在表名后直接写即可

如图s便是student的表别名

SQL> select s.sname from student s;SNAME
----------------------------------------
安星宇
安霞
张必过
张波
李增福
李宇航
李旭
杨鹏飞
苏小白
贺建已选择10行。

多表查询的一个例子:查询编号为1的姓名和成绩

select s.sno,s.sname,sc.math,sc.english,sc.chinese
   from student s,studentscore sc
   where s.sno=sc.sno
   and s.sno=1

SQL> select s.sno,s.sname,sc.math,sc.english,sc.chinese2  from student s,studentscore sc3  where s.sno=sc.sno4  and s.sno=1;SNO SNAME                                          MATH    ENGLISH    CHINESE
---------- ---------------------------------------- ---------- ---------- ----------1 张波                                             75         53         99

 1.内连接等值链接

内连接据时两个表的连接,当两个表都存在时保存

关键字:inner join.....on。其中inner可以省略

格式:select 列....from 表1 join 表2 on 内连接条件

我们通过编号将两个表进行内连接

select s.sno,s.sname,s.sage,s.ssex,sc.math,sc.english,sc.chinese
  from student s join studentscore sc
  on s.sno=sc.sno;

结果:

SQL> select s.sno,s.sname,s.sage,s.ssex,sc.math,sc.english,sc.chinese2  from student s join studentscore sc3  on s.sno=sc.sno;SNO SNAME                                          SAGE SSEX           MATH    ENGLISH    CHINESE
---------- ---------------------------------------- ---------- -------- ---------- ---------- ----------1 张波                                             18 男               75         53         992 李增福                                           21 男               90         62         883 安霞                                             21 女               86         80         464 贺建                                             20 女               96         99         865 杨鹏飞                                           20 男               63         72         766 李宇航                                           22 男               66         62         657 苏小白                                           22 男               60         32         688 李旭                                             19 男               98         64         869 张必过                                           19 男               36         26         3510 安星宇                                           23 男               73         76         75已选择10行。

我们通过内连接的方式查询年龄大于20的所有人成绩

select s.sno,s.sname,s.sage,s.ssex,sc.math,sc.english,sc.chinese 
from student s join studentscore sc 
on s.sno=sc.sno
where s.sage>20;

结果:

SQL> select s.sno,s.sname,s.sage,s.ssex,sc.math,sc.english,sc.chinese2  from student s join studentscore sc3  on s.sno=sc.sno4  where s.sage>20;SNO SNAME                                          SAGE SSEX           MATH    ENGLISH    CHINESE
---------- ---------------------------------------- ---------- -------- ---------- ---------- ----------2 李增福                                           21 男               90         62         883 安霞                                             21 女               86         80         466 李宇航                                           22 男               66         62         657 苏小白                                           22 男               60         32         6810 安星宇                                           23 男               73         76         75

2.外连接

外连接一共分为3种:左外连接,右外连接和完全连接

a.左外连接

关键字:left outer join ..on或者为left join ..on

格式:select ... from 表1 left join 表2 on 条件;

内连接是将所有符合调节的要求输出

左外连接是以左表为主表将左表中信息输出即使右表没有与之匹配的数据,当右表没有与之匹配的数据则右表数据输出null

我们查询student表中同学的成绩

select s.sno,s.sname,s.sage,s.ssex,sc.math,sc.english,sc.chinese
       from student s left join studentscore sc
       on s.sno=sc.sno;

结果:

SQL> select s.sno,s.sname,s.sage,s.ssex,sc.math,sc.english,sc.chinese2      from student s left join studentscore sc3      on s.sno=sc.sno;SNO SNAME                                          SAGE SSEX           MATH    ENGLISH    CHINESE
---------- ---------------------------------------- ---------- -------- ---------- ---------- ----------1 张波                                             18 男               75         53         992 李增福                                           21 男               90         62         883 安霞                                             21 女               86         80         464 贺建                                             20 女               96         99         865 杨鹏飞                                           20 男               63         72         766 李宇航                                           22 男               66         62         657 苏小白                                           22 男               60         32         688 李旭                                             19 男               98         64         869 张必过                                           19 男               36         26         3510 安星宇                                           23 男               73         76         7513 苏非                                             19 女11 李四                                                男已选择12行。

我们可以看到,即使studentscore中没有学号为11,14的成绩信息它也会输出只是会以null代替

b.右外连接

关键字:right outer join..on或者 right join ..on..

格式:select .... from 表名1right join 表名2 on 条件

右外连接和左外接连刚好相反,以右表为主表,右边全部输出,左表没有数据输出null

示例:查询studentscore表中所有学生的信息

select sc.sno,sc.sname,s.sage,s.sdept,s.ssex,sc.math,sc.english,sc.chinese
rom student s right join studentscore sc
 on s.sno=sc.sno;

SQL>   select sc.sno,sc.sname,s.sage,s.sdept,s.ssex,sc.math,sc.english,sc.chinese2           from student s right join studentscore sc3           on s.sno=sc.sno;SNO SNAME                      SAGE SDEPT                                    SSEX           MATH    ENGLISH    CHINESE
---------- -------------------- ---------- ---------------------------------------- -------- ---------- ---------- ----------6 李宇航                       22 口腔医学                                 男               66     62     657 苏小白                       22 中医药                                   男               60     32     681 张波                         18 软件工程                                 男               75     53     992 李增福                       21 预防医学                                 男               90     62     883 安霞                         21 临床医学                                 女               86     80     464 贺建                         20 应用数学                                 女               96     99     865 杨鹏飞                       20 应用数学                                 男               63     72     768 李旭                         19 临床医学                                 男               98     64     869 张必过                       19 预防医学                                 男               36     26     3510 安星宇                       23 软件工程                                 男               73     76     7512 王五14 黄尚                                                                                      80     86     82已选择12行。

上面数据我们可以看出右表中数据全部显示,与右表中没有匹配的数据都显示为null.

c.完全外连接

关键字:full outer join...on或者 full join ..on

格式:select...from 表1 full join 表2 on 条件。

完全外连接相当于左外连接和右外连接的结合,输出左右表中的所有查询的数据,如果对应的表中没有数据则用null代替。

示例:输出student 和studenrscor表中的学号和姓名

select s.sno,s.sname,sc.sno,sc.sname
from student s full join studentscore sc
on s.sno=sc.sno

SQL> select s.sno,s.sname,sc.sno,sc.sname2  from student s full join studentscore sc3  on s.sno=sc.sno;SNO SNAME                                           SNO SNAME
---------- ---------------------------------------- ---------- --------------------12 王五14 黄尚1 张波                                              1 张波2 李增福                                            2 李增福3 安霞                                              3 安霞4 贺建                                              4 贺建5 杨鹏飞                                            5 杨鹏飞6 李宇航                                            6 李宇航7 苏小白                                            7 苏小白8 李旭                                              8 李旭9 张必过                                            9 张必过10 安星宇                                           10 安星宇13 苏非11 李四已选择14行。

我们可以看到将所有的名字都进行了输出,如果对应的表中没有该条数据用null代替

3.自然连接

关键字:natural join

格式:select...from 表1 natural jion 表2

和内连接相似,数据库自动会连接第一个表和第二个表中相同的列名进行匹配

4.自连接

就是自己与自己连接

自连接用的方法其实就是内连接和外连接的方法,只是两个表为同一个表。

如下面这个例子就是应用内连接的方法

示例:查找studentscore表中数学成绩与英语成绩相同的人的名字

select s.sname,s.math,sc.sname,sc.english
from studentscore s join studentscore sc
on s.math=sc.english

结果:

SQL> select s.sname,s.math,sc.sname,sc.english2  from studentscore s join studentscore sc3  on s.math=sc.english;SNAME                      MATH SNAME                   ENGLISH
-------------------- ---------- -------------------- ----------
安霞                         86 黄尚                         86
黄尚

昨天考科三过了,美滋滋

Oracle学习(七)——————————————查询进阶相关推荐

  1. Oracle学习笔记(七)——分组统计查询

    Oracle学习笔记(七)--分组统计查询 基础统计函数的使用 分组统计操作的实现,结合多表查询使用分组统计 常用统计函数 COUNT(*|[DISTINCT]字段) MAX(字段,日期或数字) MI ...

  2. 怎样学好Oracle子查询,Oracle学习(六):子查询

    Oracle学习(6):子查询 子查询 为何要用子查询 SQL> --查询工资比SCOTT高的员工信息 SQL> --1. 知道SCOTT的工资 SQL> select sal fr ...

  3. oracle 最大值及其_学习笔记:Oracle优化 SQL查询最大值 最小值时的优化方法案例...

    天萃荷净 select max(id),min(id) from table优化,分享开发DBA需求,在SQL语句查询最大值.最小值数据时的优化方式案例 1.查看数据库版本 SQL> selec ...

  4. Oracle的分组查询和筛选学习

    #Oracle数据库 ##分组查询&筛选学习: –关键字:group by 分组字段名,分组字段名- ----注意1:使用了分组后,在select语句中只允许出现分组字段和多行函数 ----注 ...

  5. Oracle学习之路——简单查询

    本人大三单身狗,虽说还有一年毕业,可是到了大四再幡然醒悟,奋发图强,着实有点晚.为了尽可能将自己从"毕业即失业"的悲惨现状中拯救出来,开始学习吧!!!本博客是为了记录鄙人学习之路中 ...

  6. oracle 查询结果升序,Oracle学习日志-8(查询结果排序)

    要用到的表如下 书上写到,上面的查询结果排序是随机的,再执行几次结果可能不同,但是我执行多次后,查询结果的排序都是如此,是因为oracle的默认处理方式是按照物理储存顺序查询的,而我在插入记录的时候都 ...

  7. oracle号码段拆开,学习-SQL查询连续号码段的巧妙解法

    学习-SQL查询连续号码段的巧妙解法 在ITPUB上有一则非常巧妙的SQL技巧,学习一下,记录在这里. 最初的问题是这样的:我有一个表结构, fphm,kshm 2014,00000001 2014, ...

  8. Oracle学习笔记(三)。连接查询。等值连接,非等值连接,自连接,LEFT OUTER JOIN,RIGHT JOIN,FULL JOIN,自然连接,内连接 INNERJOIN

    文章目录 1. 什么是多表查询 2. 多表链接方式 3. 多表连接语法 3.1 语法结构 3.2 定义连接 3.3 原则 4. 等值连接-内连接 4.1 什么是等值连接 4.2 抉择矩阵 4.3 使用 ...

  9. Oracle学习笔记(最重要的是PL/SQL编程)

    一:Oracle认证,与其它数据库比较,安装 Oracle安装会自动的生成sys用户和system用户: (1) sys用户是超级用户,具有最高权限,具有sysdba角色,有create databa ...

最新文章

  1. 使用VC6.0创建和运行C程序的方法
  2. java格式化星期_在Java中使用SimpleDateFormat格式化星期几
  3. 分布式系统Paxos算法
  4. linux 查看和修改文件编码的方法
  5. 钉钉小程序----使用阿里的F2图表
  6. Python自制微信机器人:群发消息、自动接收好友
  7. Mysql 函数入门
  8. HDFS客户端的权限错误:Permission denied
  9. java hdfs ha_hadoop2.x hdfs完全分布式 HA 搭建
  10. 毕设题目:Matlab图像隐写
  11. 在linux中cd god,Linux基础/Linux基础和命令.md · kelekele/God-Of-BigData - Gitee.com
  12. JS des加密解密
  13. java sql连接代码 sqlserver的jar包
  14. Excel插件POI-ET扩展(NiceXSSFWorkbook)说明
  15. 第一个web项目-微信小程序后端开发
  16. REST服务开发实战
  17. alc662声卡注入id_ALC662声卡Linux提取文件.doc
  18. 《现代操作系统》阅读笔记
  19. 《高仿支付宝运动轨迹七日曲线图》
  20. Windows内核安全与驱动编程学习笔记----1.WDK安装

热门文章

  1. 用 Hypothesis 来自动化单元测试
  2. Windows 10创建用户
  3. Unveiling the java.lang.Out OfMemoryError
  4. FastReport for Delphi
  5. 银行手续费收取标准,你知道吗
  6. 如何查看自己的数据库
  7. 尚硅谷 SpringCloud 第二季学习笔记【已完结】
  8. 找到一个不错的学习python的网站
  9. 在电脑上运行安卓app
  10. TensorFlow2.0损失函数基本原理、调用及自定义