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 关系型数据库

以表格方式展示:

常见的关系型数据库:

  • Oracle:大型项目使用

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

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

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

1.2.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 来占位,插入成功后以实际数据为准。

    • 方式一: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端口

2.2.2 工具连接MySQL数据库

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

以navicat为例:

1.新建mysql连接

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

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属性,且该属性必须为主键的一部分

2.4 通过navicat操作数据库

2.4.1 基础数据库操作

1.使用数据库

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

2.创建数据库

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

3.修改数据库

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

4.删除数据库

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

2.4.2 基础数据表操作

1.新建表

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

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

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

2.修改、删除表

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

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

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

2.4.3 数据库的备份和还原

备份:

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

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

还原:

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

2.4.4 navicat命令行操作

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

2.输入命令,点击运行

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

三、数据查询操作

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 常用连接方式

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

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

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

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;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/239490.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

详解TCP报文格式以及TCP相关特性

✏️✏️✏️今天给大家分享的是TCP报文格式的解释以及TCP协议的一些重要特性。 清风的CSDN博客 &#x1f6e9;️&#x1f6e9;️&#x1f6e9;️希望我的文章能对你有所帮助&#xff0c;有不足的地方还请各位看官多多指教&#xff0c;大家一起学习交流&#xff01; ✈️✈️✈…

PPT制作的几个注意事项

PPT制作的几个注意事项 字数不可过多字体大小字体颜色排版问题PPT篇末致谢什么是好的PPT关于演讲不要念PPT说话时面向观众。讲话的时候抖腿其他 事先声明&#xff1a; 以下展示的PPT就PPT制作技巧而言&#xff0c;与其内容无关。 字数不可过多 做PPT最忌讳的就是满篇全是文字&…

NCNN 源码学习【二】:模型加载

​ 正文 这次先来看一段NCNN应用代码中&#xff0c;最先出现的部分&#xff0c;模型加载 ncnn::Net squeezenet; squeezenet.load_param("squeezenet_v1.1.param"); squeezenet.load_model("squeezenet_v1.1.bin");首先我们可以看到一个 ncnn的类Net&am…

【C语言】结构体实现位段

引言 对位段进行介绍&#xff0c;什么是位段&#xff0c;位段如何节省空间&#xff0c;位段的内存分布&#xff0c;位段存在的跨平台问题&#xff0c;及位段的应用。 ✨ 猪巴戒&#xff1a;个人主页✨ 所属专栏&#xff1a;《C语言进阶》 &#x1f388;跟着猪巴戒&#xff0c;…

鸿蒙系统扫盲(五):再谈鸿蒙开发用什么语言?

前段时间&#xff0c;发表了鸿蒙系统扫盲&#xff08;三&#xff09;&#xff1a;鸿蒙开发用什么语言&#xff1f;这篇文章&#xff0c;收到一些网友的提问&#xff0c;一一解答了&#xff0c;还有网友对我进行了严厉的批评和尖锐的指责&#xff0c;说我有点颠倒是非&#xff0…

集成开发之如何用好明道云

内容来自演讲&#xff1a;张嵩 | 苏州睿能科技有限公司 | 公司负责人 摘要 这篇文章介绍了作者所在公司如何利用明道云进行集成开发&#xff0c;并分享了四个实际案例。在第一个数字化实验室项目中&#xff0c;该公司使用明道云取代现有的STARLIMS商业软件&#xff0c;并实现…

sleep和wait区别,并且查看线程运行状态

一、sleep和wait区别 区别一&#xff1a;语法使用不同 wait 方法必须配合 synchronized 一起使用&#xff0c;不然在运行时就会抛出 IllegalMonitorStateException 的异常 而 sleep 可以单独使用&#xff0c;无需配合 synchronized 一起使用。 区别二&#xff1a;所属类不同…

【Spring教程26】Spring框架实战:从零开始学习SpringMVC 之 bean加载控制

目录 1 问题分析2 思路分析3 环境准备4 设置bean加载控制5 知识点1&#xff1a;ComponentScan 欢迎大家回到《Java教程之Spring30天快速入门》&#xff0c;本教程所有示例均基于Maven实现&#xff0c;如果您对Maven还很陌生&#xff0c;请移步本人的博文《如何在windows11下安装…

大数据技术6:大数据技术栈

前言&#xff1a;大数据相关的技术名词特别多&#xff0c;这些技术栈之间的关系是什么&#xff0c;对初学者来说很难找到抓手。我一开始从后端转大数据的时候有点懵逼&#xff0c;整体接触了一遍之后才把大数据技术栈给弄明白了。 一、大数据技术栈 做大数据开发&#xff0c;无…

YOLOv8改进 | 2023主干篇 | 利用RT-DETR特征提取网络PPHGNetV2改进YOLOv8(超级轻量化精度更高)

一、本文介绍 本文给大家带来利用RT-DETR模型主干HGNet去替换YOLOv8的主干&#xff0c;RT-DETR是今年由百度推出的第一款实时的ViT模型&#xff0c;其在实时检测的领域上号称是打败了YOLO系列&#xff0c;其利用两个主干一个是HGNet一个是ResNet&#xff0c;其中HGNet就是我们…

Logstash输入Kafka输出Es配置

Logstash介绍 Logstash是一个开源的数据收集引擎&#xff0c;具有实时管道功能。它可以从各种数据源中动态地统一和标准化数据&#xff0c;并将其发送到你选择的目的地。Logstash的早期目标主要是用于收集日志&#xff0c;但现在的功能已经远远超出这个范围。任何事件类型都可…

记录汇川:MODBUS-梯形图

H5U的MODBUS通信不需要编写程序&#xff0c;通过组态MODBUS通信配置表&#xff0c;实现数据通信。 相对自由口走报文的形式&#xff0c;这个更加的方便。配置结束&#xff0c;就可以监控数据或写入。

Linux - 进程间通信(中)- 管道的应用场景

前言 在上篇博客当中&#xff0c;对Linux 当中的进程通信&#xff0c;做了详细阐述&#xff0c;主要是针对父子进程的通信来阐述的同时&#xff0c;也进行了模拟实现。 对于管道也有了初步了解&#xff0c;但是这仅仅是 进程间通信的一部分&#xff0c;Linux 当中关于进程间通…

Unity光照模型实践

光照作为3D渲染中最重要的部分之一&#xff0c;如何去模拟真实环境的光照是重要的研究内容&#xff0c;但是现实环境光照过于复杂&#xff0c;有很多经典好用的光照模型去近似真实光照。 根据基础的Phong模型 最终某个点的结果为 环境光Ambient 漫反射光Diffuse 高光Specula…

安卓MediaRecorder(2)录制源码分析

文章目录 前言JAVA new MediaRecorder() 源码分析android_media_MediaRecorder.cpp native_init()MediaRecorder.java postEventFromNativeandroid_media_MediaRecorder.cpp native_setup() MediaRecorder 参数设置MediaRecorder.prepare 分析MediaRecorder.start 分析MediaRec…

Navicat 技术指引 | 适用于 GaussDB 分布式的服务器对象的创建/设计

Navicat Premium&#xff08;16.3.3 Windows版或以上&#xff09;正式支持 GaussDB 分布式数据库。GaussDB分布式模式更适合对系统可用性和数据处理能力要求较高的场景。Navicat 工具不仅提供可视化数据查看和编辑功能&#xff0c;还提供强大的高阶功能&#xff08;如模型、结构…

JavaSE知识点回顾,附学习思维导图

第一阶段 day01 java 发展&#xff0c;java 环境( path, java_home, class_path)&#xff0c;java 原理&#xff0c; java 执行 &#xff0c; jvm , jre , jdk day02 变量 标识符命名规则 数据类型 数据类型的转换 运算符 day03 选择结构 if , switch day04 循环结构 for , whi…

java--Collection的遍历方式

1.迭代器概述 迭代器是用来遍历集合的专用方式(数组没有迭代器)&#xff0c;在java中迭代器是Iterator。 2.Collection集合获取迭代器的方法 3.Iterator迭代器中的常用方法 4.增强for循环 ①增强for可以用来遍历集合或数组。 ②增强for遍历集合&#xff0c;本质就是迭代器遍…

005、Softmax损失

之——softmax与交叉熵 杂谈 我们常用到softmax函数与交叉熵的结合作为损失函数以监督学习&#xff0c;这里做一个小小的总结。 正文 1.softmax的基本改进 所谓softmax就是在对接全连接层输出时候把输出概率归一化&#xff0c;最基础的就是这样&#xff1a; 效果就是这样&…

(第65天)PDB 快照

介绍 PDB 快照是一个 PDB 指定时间点的副本。在创建快照时,源 PDB 可以是只读或者读写模式。 PDB 快照可以用于快速创建 PDB。 PDB 快照可以分为手动和自动两种创建方式(create pluggable database|alter pluggable database): 手动快照使用 SNAPSHOT 子句的方式来创建自动…