4.数据库

目录

一、数据库的基本信息

1.1 数据库的定义

1.2数据库的分类

1.2.1 关系型数据库

1.2.2 非关系型数据库

1.3 SQL介绍

1.3.1 概念

1.3.2 SQl语言分类

1.3.3 SQL注释

1.3.4 数据库操作命令DDL

1.3.5 数据表操作命令DDL

1.3.6 数据表操作命令DML

1.3.7 数据表中内容查询

二、MySQL数据库

2.1 MySQL数据库的特点

2.2 MySQL数据库的链接

2.2.1 命令连接MySQL数据库

2.2.2 工具连接MySQL数据库

2.3 数据类型和数据约束

2.4 通过navicat操作数据库

2.4.1 基础数据库操作

2.4.2 基础数据表操作

2.4.3 数据库的备份和还原

2.4.4 navicat命令行操作

三、数据查询操作

3.1 数据准备

3.1.1 创建数据表

3.1.2 插入数据

3.2 查询基本语法

3.2.1 查询所有字段

3.2.2 查询部分字段

3.2.3 起别名

3.2.4 去重

3.3 条件查询

3.3.1 比较运算符

3.3.2 逻辑运算符

3.3.3 模糊查询

3.3.4 范围查询

3.3.5 空判断

3.4 排序

3.5 聚合函数

3.5.1 查询总记录数

3.5.2 查询最大值

3.5.3 查询最小值

3.5.4 求和

3.5.5 求平均值

3.5.6 其它聚合函数

3.6 分组

3.6.1 分组

3.6.2 分组后的数据筛选

3.7 对比 where 与 having

3.8 分页

3.8.1. 获取部分行

3.8.2 分页

四、连接查询

4.1 常用连接方式

4.2 数据准备

4.3 内连接

4.4 左连接

4.5 右连接

五、子查询

5.1 主查询和子查询的关系

5.2 子查找充当条件

5.3 子查询充当数据源

5.4 子查询中特定关键字使用

六、完整的查询语法

6.1 select [选项 all|distinct]

6.2 表示从数据源中查询哪些字段

6.3 from字句

6.4 where子句

6.5 group by 分组查询

6.6 having 子句

6.7 order by 子句:排序,对数据源进行排序

6.8 limit子句


一、数据库的基本信息

1.1 数据库的定义

数据库是指长期存储在计算机内、有组织的数据集合。简而言之,数据库就是一个存储数据的地方。

1.2数据库的分类

1.2.1 关系型数据库

以表格方式展示:

4.数据库_第1张图片

常见的关系型数据库:

  • Oracle:大型项目使用

  • MySQL:web项目中使用最广泛的数据库

  • Microsoft SQL Server:在微软项目中使用

  • SQLite:轻量级数据库,一般在移动平台使用

1.2.2 非关系型数据库

以键值对方式展示:

4.数据库_第2张图片

常见非关系型数据库:

  • Redis

  • Mongodb

  • Hbase

1.3 SQL介绍

1.3.1 概念

Structured Query Language (结构化查询语言),通过SQL语言可以对数据库进行操作。

1.3.2 SQl语言分类

  • DQL:数据查询语言,用于对数据进行查询,例如:select(掌握)

  • DML︰数据操作语言,对数据进行增加、修改、删除,例如:insert、update、delete(掌握)

  • TPL:事务处理语言,对事务进行处理,例如: begin transaction、commit、rollback(了解)

  • DCL:数据控制语言,进行授权与权限回收,例如:grant、revoke(了解)

  • DDL:数据定义语言,进行数据库、表的管理等,例如: create、drop(了解)

  • CCL︰指针控制语言,通过控制指针完成表的操作,例如: declare cursor(了解)

注意∶主流的关系型数据库都支持SQL语言,在MySql中SQL语言不区分大小写

1.3.3 SQL注释

- SQL标准

- 多行注释:/* XXXXX */

- 单行注释:-- XXXX。

注意:第2个破折号后面必须跟一个空格符

- MYSQL标准

- 单行注释:”#”

1.3.4 数据库操作命令DDL

首先通过命令行工具连接到数据库。

mysql -h数据库IP -P端口号 –u数据库登陆用户名 -p数据库登陆密码
mysql –u数据库登陆用户名 -p数据库登陆密码      (如果连接的为本机的数据库,无需指定IP和端口)
  • 查看所有数据库:show databases;

  • 查询数据库:show databases [like '数据库名'];

  • 使用数据库:use 数据库名;

  • 查看当前使用数据库: select database();

  • 创建数据库:

    • create database 数据库名 charset=utf8;

    • create database [if not exists] 数据库名 [default charset=utf8];

  • 删除数据库:

    • drop database 数据库名;

    • drop database [if exists] 数据库名;

1.3.5 数据表操作命令DDL

  • 查看当前数据库所有的表:

    • show tables;

    • show tables [from 数据库名] [like wild];

  • 查看表结构:desc 表名;

  • 查看表的创建语句:show create table 表名;

  • 创建数据库表

    • 语法格式:

create table 表名(
字段名1 类型 约束,
字段名2 类型 约束,
... ... ...
)[engine=innodb default charset=utf8];
create table students(
    id int unsigned primary key auto_increment,         -- id字段为主键,且值自增
    name varchar ( 20 ) ,       -- name字段类型为字符串,长度为20
    age int unsigned,           --age字段类型为无符号的整型
    height decimal(5,2)     --sight字段类型为小数,小数位数为2
)engine=innodb default charset=utf8;
  • 删除数据库表

    • drop table 表名; --删除表

    • drop table if exists 表名; --如果存在这个表则删除

  • 修改表结构

    • 增加列:alter table 表名 add 列名 列类型 [after 列名]|first;

    • 修改列类型:alter table 表名 modify 列名 列类型[after 列名];

    • 改列名:alter table 表名 change 旧列名 新列名 列类型 [after 列名];

    • 删除列:alter table 表名 drop 列名;

    • 改表名:alter table 表名 rename 新表名;

1.3.6 数据表操作命令DML

  • 添加数据

    • 说明:主键列是自动增长,插入时需要占位,通常使用0或者 default 或者 null 来占位,插入成功后以实际数据为准。

    • 4.数据库_第3张图片

    • 方式一:insert into 表名 values(...);

      • 例1: insert into students values(0,'亚瑟',22,177.56);

    • 方式二: inert into 表名 (字段1,字段2,...) values(值1,值2,.….);

      • 例: inert into students (name) values('老夫子');

      • 例: inert into students (name,age) values('老夫子',24);

  • 修改:update 表名 set 列1=值1,列2=值2... where 条件;

  • 删除

    • 方式一:delete

      • delete from 表名 where 条件;

        逻辑删除:对于重要的数据,不能轻易执行delete语句进行删除。因为一旦删除,数据无法恢复,这时可以

        进行逻辑删除。

        1、给表添加字段,代表数据是否删除,一般起名isdelete,0代表未删除,1代表删除,默认值为0

        2、当要删除某条数据时,只需要设置这条数据的isdelete字段为1

        3、以后在查询数据时,只查询出isdelete为0的数据

        例:1、给学生表添加字段(isdelete),默认值为0,

        如果表中已经有数据,需要把所有数据的isdelete字段更新为0

        update students set isdelete=0;

        2、删除id为1的学生

        update students set isdelete=1 where id=1;

        3、查询未删除的数据

        select * from students where isdelete=0;

    • 方式二:truncate

      • truncate table 表名;(删除表的所有数据,保留表结构)

    • 格式三:drop

      • drop table 表名;(删除表,所有数据和表结构都删掉)

TruncateDeleteDrop 的区别

1、Delete 删除数据时,即使删除所有数据,其中的自增长字段不会从1开始

2、Truncate 删除数据时,其中的自增长字段恢复从1开始

3、Drop 是删除表,所有数据和表结构都删掉

总结

在速度上,drop > truncate > delete

如果想删除部分数据用 delete,注意带上 where 子句

如果想删除表,用 drop

如果想保留表而将所有数据删除,自增长字段恢复从1开始,用 truncate

1.3.7 数据表中内容查询

简单查询(查询表格中所以内容):select * from 表名;

二、MySQL数据库

2.1 MySQL数据库的特点

1、可移植性好

2、支持多操作系统

3、支持多种编程语言

4、开源、社区版免费

5、支持多线程

6、优化SQL查询算法

7、多种数据库连接方式

8、支持多语言编码格式

2.2 MySQL数据库的链接

注意: 实际工作中, 数据库是安装在服务器当中的, 如果要直连数据库进行数据校验, 就必须远程连接

2.2.1 命令连接MySQL数据库

前置条件:

  • 确定mysql数据库的IP地址

    • 可以通过ifconfig来确认

  • 确认mysql数据库服务是否开启

    • netstat anptu |grep 3306(服务器端操作)

连接命令:

mysql -h数据库IP -P端口号 –u数据库登陆用户名 -p数据库登陆密码
mysql –u数据库登陆用户名 -p数据库登陆密码      (如果连接的为本机的数据库,无需指定IP和端口)
  • -h不加时则表示为本机

  • -P不加时则表示默认3306端口

4.数据库_第4张图片

2.2.2 工具连接MySQL数据库

MySQL客户端工具有很多种,其中navicat用的比较多,还有mysql workbench等。

以navicat为例:

1.新建mysql连接

4.数据库_第5张图片

2.输入账号密码、端口等信息,连接测试,测试成功点击确定,完成连接。

4.数据库_第6张图片

2.3 数据类型和数据约束

数据类型:

  • 整型:int

    • 有符号范围(-2147483648~2147483647)

    • 无符号范围(0~4294967295)

  • 字符串: varchar

    • 范围(0~65533)

    • 一个字母或一个中文占一个字符

    • 例如: varchar(3)表示最多存3个字符

  • 小数: decimal

    • 示例:decimal(5,2),表示该字段可以存5位数,其中小数位数为2,整数3位。

  • 时间日期: datetime

    • 范围(1000-01-01 00:00:00 ~ 9999-12-31 23:59:59)

    • 示例:2021-01-01 12:29:59'

  • 数据约束:

    • 主键(primary key):物理上存储的顺序

      • 当把某个字段设定为主键之后,该字段的值必须唯一,且不能为空

      • 针对主键的字段,可以设定自动自增,自动在原来最大的ID值上加1。

    • 非空( not null):此字段不允许填写空值

      • 空(Null)和' '空字符是不一样的

    • 唯一( unique):此字段的值不允许重复

    • 默认值( default) :当不填写此值时会使用默认值,如果填写时以填写为准。

    • 外键( foreign key)):维护两个表之间的关联关系

    • Auto_increment: 自动增长,

    • 一个表只能有一个auto_increment属性,且该属性必须为主键的一部分

    4.数据库_第7张图片

2.4 通过navicat操作数据库

2.4.1 基础数据库操作

1.使用数据库

在navicat窗口中,双击左侧已连接的连接名称即可打开并连接到数据库。

4.数据库_第8张图片

2.创建数据库

打开数据库后,右击连接名称,选择“创建数据库”,然后输入对应的数据,点击确定。

4.数据库_第9张图片

4.数据库_第10张图片

3.修改数据库

打开数据库后,右击要修改的数据库名称,选择数据库属性。

4.数据库_第11张图片

4.删除数据库

打开数据库后,右击要删除的数据库名称,选择“删除数据库”

4.数据库_第12张图片

2.4.2 基础数据表操作

1.新建表

右击已打开的数据库中“表”字段名,选择“新建表”

4.数据库_第13张图片

在新建表的窗口中输入字段的名称及选择字段的类型等信息

4.数据库_第14张图片

点击保存,输入对应的表名称,再点击确定,然后关闭新建表窗口即可

4.数据库_第15张图片

2.修改、删除表

修改表:右击表名,选择“设计表”,可以进入到表字段设计的窗口。针对要修改的表可以做增加字段、删除字段、修改字段名称及类型等操作。

双击表名,或鼠标右键打开表,可以进入到表格窗口。可以增加、删除表格中的数据。

4.数据库_第16张图片

4.数据库_第17张图片

删除表:右击表名,选择"删除表"即可

4.数据库_第18张图片

2.4.3 数据库的备份和还原

备份:

  • 选择结构和数据时保存数据字段和列表信息

  • 选择仅结构时保存数据字段,不保存列表信息

4.数据库_第19张图片

4.数据库_第20张图片

还原:

要还原的数据库不存在时,需要先创建数据库

4.数据库_第21张图片

4.数据库_第22张图片

2.4.4 navicat命令行操作

1.点击数据库,选择新建查询

4.数据库_第23张图片

2.输入命令,点击运行

4.数据库_第24张图片

3.可以对命令行内容进行保存

4.数据库_第25张图片

三、数据查询操作

3.1 数据准备

3.1.1 创建数据表

drop table if exists students;
create table students (
studentNo varchar(10) primary key,
name varchar(10),
sex varchar(1),
hometown varchar(20),
age tinyint(4),
class varchar(10),
card varchar(20)
);

3.1.2 插入数据

insert into students values
('001', '王昭君', '女', '北京', '20', '1班', '340322199001247654'),
('002', '诸葛亮', '男', '上海', '18', '2班', '340322199002242354'),
('003', '张飞', '男', '南京', '24', '3班', '340322199003247654'),
('004', '白起', '男', '安徽', '22', '4班', '340322199005247654'),
('005', '大乔', '女', '天津', '19', '3班', '340322199004247654'),
('006', '孙尚香', '女', '河北', '18', '1班', '340322199006247654'),
('007', '百里玄策', '男', '山西', '20', '2班', '340322199007247654'),
('008', '小乔', '女', '河南', '15', '3班', null),
('009', '百里守约', '男', '湖南', '21', '1班', ''),
('010', '妲己', '女', '广东', '26', '2班', '340322199607247654'),
('011', '李白', '男', '北京', '30', '4班', '340322199005267754'),
('012', '孙膑', '男', '新疆', '26', '3班', '340322199000297655');

3.2 查询基本语法

3.2.1 查询所有字段

语法: select * from 表名

例:查询所有学生的所有字段 select * from students

3.2.2 查询部分字段

语法:select 字段1,字段2,... from 表名

例:查询所有学生的姓名、性别、年龄 select name,sex,age from students

3.2.3 起别名

给表起别名,在多表查询中经常使用

语法:

select 别名.字段1,别名.字段2,... from 表名 as 别名

例:给学生表起别名

select s.name,s.sex,s.age from students as s;

给字段起别名,这个别名出现在结果集中

语法: select 字段1 as 别名1,字段2 as 别名2,... from 表名

例:查询所有学生的姓名、性别、年龄,结果中的字段名显示为中文

select name as 姓名,sex as 性别,age as 年龄 from students;

3.2.4 去重

语法: select distinct 字段1,... from 表名

例:查询所有学生的性别,不显示重复的数据

select distinct sex from students;

3.3 条件查询

使用 where 子句对表中的数据筛选,符合条件的数据会出现在结果集中

语法:select 字段1,字段2... from 表名 where 条件;

where 后面支持多种运算符,进行条件的处理

  • 比较运算

  • 逻辑运算

  • 模糊查询

  • 范围查询

  • 空判断

3.3.1 比较运算符

  • 等于: =

  • 大于: >

  • 大于等于: >=

  • 小于: <

  • 小于等于: <=

  • 不等于: !=或<>

例1:查询小乔的年龄

select age from students where name='小乔'

例2:查询20岁以下的学生

select * from students where age<20

例3:查询家乡不在北京的学生

select * from students where hometown!='北京'

3.3.2 逻辑运算符

  • and

  • or

  • not

例1:查询年龄小于20的女同学

select * from students where age<20 and sex='女'

例2:查询女学生或'1班'的学生

select * from students where sex='女' or class='1班'

例3:查询非天津的学生

select * from students where not hometown='天津'

3.3.3 模糊查询

  • like

  • %表示任意多个任意字符

  • _表示一个任意字符

例1:查询姓孙的学生

select * from students where name like '孙%'

例2:查询姓孙且名字是一个字的学生

select * from students where name like '孙_'

例3:查询姓名以乔结尾的学生

select * from students where name like '%乔'

例4:查询姓名含白的学生

select * from students where name like '%白%'

3.3.4 范围查询

  • in表示在一个非连续的范围内

  • between ... and ...表示在一个连续的范围内

例1:查询家乡是北京或上海或广东的学生

select * from students where hometown in('北京','上海','广东')

例2:查询年龄为18至20的学生

select * from students where age between 18 and 20

3.3.5 空判断

  • 注意:null与' '是不同的

  • 判空is null

  • 判非空is not null

例1:查询没有填写身份证的学生

select * from students where card is null

例2:查询填写了身份证的学

select * from students where card is not null

3.4 排序

为了方便查看数据,可以对数据进行排序

语法:select * from 表名 order by 列1 asc|desc,列2 asc|desc,...

将行数据按照列1进行排序,如果某些行列1的值相同时,则按照列2排序,以此类推

默认按照列值从小到大排列

asc从小到大排列,即升序

desc从大到小排序,即降序

例1:查询所有学生信息,按年龄从小到大排序

select * from students order by age

例2:查询所有学生信息,按年龄从大到小排序,年龄相同时,再按学号从小到大排序

select * from students order by age desc,studentNo

3.5 聚合函数

  • 使用聚合函数方便进行数据统计

  • 聚合函数不能在 where 中使用

常用聚合函数:

  • count(): 查询总记录数

  • max(): 查询最大值

  • min(): 查询最小值

  • sum(): 求和

  • avg(): 求平均值

3.5.1 查询总记录数

count(*)表示计算总行数,括号中也可以使用字段名

示例:查询学生总数

select count(*) from students;

3.5.2 查询最大值

max(列)表示求此列的最大值

示例:查询女生的最大年龄

select max(age) from students where sex='女';

3.5.3 查询最小值

min(列)表示求此列的最小值

示例:查询1班的最小年龄

select min(age) from students;

3.5.4 求和

sum(列)表示求此列的和

示例:查询北京学生的年龄总和

select sum(age) from students where hometown='北京';

3.5.5 求平均值

avg(列)表示求此列的平均值

示例:查询女生的平均年龄

select avg(age) from students where sex='女'

3.5.6 其它聚合函数

  • round():把数值字段四舍五入

    • select sex,round(avg(age)) from students group by sex;

  • char_length(): 字符串长度

    • select name,char_length(name) from students;

  • concat(): 返回连接参数产生的字符串,一个或多个待拼接的内容,任意一个为NULL则返回值为NULL

    • select name,sex,concat(name,sex) from students;

  • lower(str): 将str中的字母全部转成小写

    • select lower(name) from students;

  • upper(str): 将str中的字母全部装成大写

    • select upper(name) from students;

  • left(str,n): 返回字符串str从最左边开始的n个字符

    • select left(name,2) from students;

  • right(str,n): 返回字符串str从最右边开始的n个字符

    • select right(name,2) from students;

  • trim(str): 返回字符串s删除了两边空格之后的字符串

    • select trim(name) from students;

  • substr(str,n,len), substr(str,-len) 截取从指定字符串str中返回从n(起始位置,从1开始)开始、长度为len的字符串

    • select substr(name,1,2) from students;

  • reverse(str): 将字符串str反转

    • select reverse(name) from students;

  • replace(str,a,b): 替换,b为新内容,a为原内容

    • select replace(name,'白','黑') from students;

3.6 分组

3.6.1 分组

  • 按照字段分组,此字段相同的数据会被放到一个组中

  • 分组的目的是对每一组的数据进行统计(使用聚合函数)

语法:select 字段1,字段2,聚合... from 表名 group by 字段1,字段2...

例1:查询各种性别的人数

select sex,count(*) from students group by sex

例2:查询每个班级中各种性别的人数

select class,sex,count(*) from students group by class,sex

3.6.2 分组后的数据筛选

语法:select 字段1,字段2,聚合... from 表名 group by 字段1,字段2,字段3... having 字段1,...聚合...

having后面的条件运算符与where的相同

例1:查询男生总人数

方案一

select count(*) from students where sex='男'

-----------------------------------

方案二:

select sex,count(*) from students group by sex having sex='男'

3.7 对比 where 与 having

  • where 是对 from 后面指定的表进行数据筛选,属于对原始数据的筛选

  • having 是对 group by 的结果进行筛选

  • having 后面的条件中可以用聚合函数,where 后面不可以

3.8 分页

3.8.1. 获取部分行

语法:select * from 表名 limit start,count

  • 从start开始,获取count条数据

  • start索引从0开始

例1:查询前3行学生信息

select * from students limit 0,3

3.8.2 分页

limit典型的应用场景就是实现分页查询

已知:每页显示m条数据,求:显示第n页的数据

select * from students limit (n-1)*m,m

四、连接查询

当查询结果的列来源于多张表时,需要将多张表连接成一个大的数据集,再选择合适的列返回

4.1 常用连接方式

  • 内连接:查询的结果为两个表匹配到的数据

4.数据库_第26张图片

  • 左连接:查询的结果为两个表匹配到的数据加左表特有的数据,对于右表中不存在的数据使用 null填充

4.数据库_第27张图片

  • 右连接:查询的结果为两个表匹配到的数据加右表特有的数据,对于左表中不存在的数据使用null填充

4.数据库_第28张图片

4.2 数据准备

drop table if exists courses;
create table courses(
courseNo int(10) unsigned primary key auto_increment,
name varchar(10)
);
​
insert into courses values
('1', '数据库'),
('2', 'qtp'),
('3', 'linux'),
('4', '系统测试'),
('5', '单元测试'),
('6', '测试过程');
​
drop table if exists scores;
create table scores(
id int(10) unsigned primary key auto_increment,
courseNo int(10),
studentno varchar(10),
score tinyint(4)
);
​
insert into scores values
('1', '1', '001', '90'),
('2', '1', '002', '75'),
('3', '2', '002', '98'),
('4', '3', '001', '86'),
('5', '3', '003', '80'),
('6', '4', '004', '79'),
('7', '5', '005', '96'),
('8', '6', '006', '80');

4.3 内连接

语法:select * from 表1 inner join 表2 on 表1.列=表2.列

例1:查询学生信息及学生的成绩

select

*

from

students stu

inner join scores sc on stu.studentNo = sc.studentNo

扩展:内连接的另一种语法:select * from 表1,表2 where 表1.列=表2.列

select* from students stu, scores sc where stu.studentNo = sc.studentNo

例2:查询课程信息及课程的成绩

select

*

from

courses cs

inner join scores sc on cs.courseNo = sc.courseNo

例3:查询学生信息及学生的课程对应的成绩

select

*

from

students stu

inner join scores sc on stu.studentNo = sc.studentNo

inner join courses cs on cs.courseNo = sc.courseNo

例4:查询王昭君的成绩,要求显示姓名、课程号、成绩

select

stu.name,

sc.courseNo,

sc.score

from

students stu

inner join scores sc on stu.studentNo = sc.studentNo wherestu.name = '王昭君'

例5:查询王昭君的数据库成绩,要求显示姓名、课程名、成绩

select

stu.name,

cs.name,

sc.score

from

students stu

inner join scores sc on stu.studentNo = sc.studentNo

inner join courses cs on sc.courseNo = cs.courseNo

where

stu.name = '王昭君' and cs.name = '数据库'

例6:查询所有学生的数据库成绩,要求显示姓名、课程名、成绩

select

stu.name,

cs.name,

sc.score

from

students stu

inner join scores sc on stu.studentNo = sc.studentNo

inner join courses cs on sc.courseNo = cs.courseNo

where

cs.name = '数据库'

例7:查询男生中最高成绩,要求显示姓名、课程名、成绩

select

stu.name,

cs.name,

sc.score

from

students stu

inner join scores sc on stu.studentNo = sc.studentNo

inner join courses cs on sc.courseNo = cs.courseNo

where

stu.sex = '男'

order by

sc.score desc

limit 1

4.4 左连接

语法:select * from 表1 left join 表2 on 表1.列=表2.列

例1:查询所有学生的成绩,包括没有成绩的学生

select

*

from

students stu

left join scores sc on stu.studentNo = sc.studentNo

例2:查询所有学生的成绩,包括没有成绩的学生,需要显示课程名

select

*

from

students stu

left join scores sc on stu.studentNo = sc.studentNo

left join courses cs on cs.courseNo = sc.courseNo

4.5 右连接

语法:select * from 表1 right join 表2 on 表1.列=表2.列

例1:查询所有学生的成绩,包括没有成绩的学生

select

*

from

scores sc

right join students stu on stu.studentNo = sc.studentNo

例2:查询所有学生的成绩,包括没有成绩的学生,需要显示课程名

select

*

from

scores sc

right join students stu on stu.studentNo = sc.studentNo

left join courses cs on cs.courseNo = sc.courseNo

五、子查询

子查询:在一个 select 语句中,嵌入了另外一个 select 语句,那么嵌入的 select 语句称之为子查 询语句

主查询:外层的 select 语句称之为主查询语

5.1 主查询和子查询的关系

  • 子查询是嵌入到主查询中的

  • 子查询是辅助主查询的,要么充当条件,要么充当数据源

  • 子查询是可以独立使用的语句,是一条完整的 select 语句

5.2 子查找充当条件

例1:查询大于平均年龄的学生

查询班级学生平均年龄

select avg(age) from students

查询大于平均年龄的学生

select * from students where age > 21.4167

select * from students where age > (select avg(age) from students);

例2:查询王昭君的成绩,要求显示成绩

学生表中查询王昭君的学号

select studentNo from students where name = '王昭君'

成绩表中根据学号查询成

select * from scores where studentNo = '001'

select * from scores where studentNo = (select studentNo from students wherename = '王昭君')

1和例2中:子查询返回的结果只有一个值(一行一列),这种称之为标量子查询

例3:查询18岁的学生的成绩,要求显示成绩

学生表中查询18岁的学生的学号

select studentNo from students where age=18

成绩表中根据学号查询成绩

select * from scores where studentNo in ('002','006')

select * from scores where studentNo in (select studentNo from students whereage=18)

3中:子查询返回的结果是一列数据(一列多行),这种称之为列子查询

例4:查询和王昭君同班、同龄的学生信息

select class,age from students where name='王昭君'

select * from students where class='1班' and age=20

select * from students where (class,age)=('1班',20) s

elect * from students where (class,age)=(select class,age from students wherename='王昭君')

4中:子查询返回的结果是一行(一行多列),这种称之为行子查询

5.3 子查询充当数据源

例5:查询数据库和系统测试的课程成绩

select

*

from

scores s

inner join

(select * from courses where name in ('数据库','系统测试')) c on s.courseNo =c.courseNo

5中:子查询返回的结果是多行多列(相当于一个表),这种称之为表级子查询

5.4 子查询中特定关键字使用

  • in 范围

    • 格式: 主查询 where 条件 in (列子查询)

  • any | some 任意一个

    • 格式: 主查询 where 列 = any (列子查询)

    • 在条件查询的结果中匹配任意一个即可,等价于 in

  • all

    • 格式: 主查询 where 列 = all(列子查询) : 等于里面所有

    • 格式: 主查询 where 列 <>all(列子查询) : 不等一其中所有

select * from students

where age in (select age from students where age between 18 and 20)

六、完整的查询语法

1.select [选项 all|distinct]
2.*|字段|表达式|表 [as] 别名(从数据源中查询哪些字段)
3.from 数据源
4.where 子句
5.group by 子句
6.having 子句
7.order by 子句
8.limit 子句

6.1 select [选项 all|distinct]

  • 选项:

    • all : (默认值)全部

    • distinct :去重

6.2 表示从数据源中查询哪些字段

  • *|字段|表达式|表 [as] 别名 (as 可以省略,建议写上)

6.3 from字句

  • from 后面接的是数据源, 表示查询数据的来源

6.4 where子句

  • 语法: where 条件表达式

  • 作用: 使用用于对数据源进行过滤和筛选.

6.5 group by 分组查询

  • 语法: group by 字段

  • 分组的目的: 为了统计结果

6.6 having 子句

  • 用于分组后的再过滤(用法和where一样,只是位置不同)

  • 语法: having 条件表达式

6.7 order by 子句:排序,对数据源进行排序

  • 语法: order by 字段 [规则 asc|desc], 字段2 [规则];

6.8 limit子句

  • 限制查询结果的条数,作用是减轻数据库服务器的压力.

  • 语法: limit start,length;

你可能感兴趣的:(测试基础,数据库)