一、初识MySQL
数据库(Database)就是一个存储数据的仓库。为了方便数据的存储和管理,它将数据按照特定的规律存储在磁盘上。通过数据库管理系统,可以有效地组织和管理存储在数据库中的数据。
二、数据库的安装和配置
见软件安装文件
三、数据库服务器操作(开启、关闭)
服务器的启动和停止有2种方法:系统服务器和命令提示符
1、系统服务器
搜索“服务”---mysql 右击(启动,停止)
2、命令提示符
搜索cmd----右击以管理员身份运行
启动服务器:
net start mysql
停止服务器:
net stop mysql
四、(登陆及退出服务器)连接和断开服务器
1、连接服务器:
mysql -uroot -p123 (u---user用户名 p-password密码)
2、断开服务器:
exit quit \q 3个方法都可以
五、相关概念
1、数据管理:指对各种数据进行分类、组织、编码、存储、检索和维护。
2、数据管理技术经历了3个阶段:
人工管理阶段、文件系统阶段、数据库系统阶段
3、数据库(DB):是指长期保存在计算机的存储设备上,按照一定的规则组织起来,可以被共享的数据集合。
4、数据库管理系统(DBMS):是指一种操作和管理数据库的软件,用于建立,使用和维护数据库,对数据进行统一管理和控制,以保证数据库的安全性和完整性。
5、数据库系统:是采用数据库技术的计算机系统。由数据库、数据库管理系统、数据库管理员、数据库的硬件和软件、以及用户5部分构成的运行实体。
六、数据模型的概念:
1、数据模型是由(数据结构、数据操作、完整性约束)3部分构成。
2、常见的数据模型有哪些?
1)层次模型----树状结构
2)网状模型----有向图结构
3)关系模型----二维表结构(excel 表格)
3、我们主要讲关系模型,由(关系数据结构,关系操作集合和完整性约束)3部分构成。
七,数据库的种类的特点
1、SQL server ----适用于入门者 (只能在windows上运行,没有开放性)
2、Mysql ----小型数据库(体积小,速度快,成本低,使用简单)
3、oracle ----强大的功能和可配置、可管理能力(开放性,安全性)
4、DB2 ----兼容性好,风险小
八、建库操作(建库、查看、使用、删除)
数据库:database
创建:create
展示,表演:show
使用: use
删除:drop
1、创建数据库:
格式: create database 数据库名;
另外一个格式:
create schema数据库名;
2、查看所有的数据库:
格式:show databases; // cat(一只猫) cats(多只猫)
3、删除数据库:
格式:drop database 数据库名;
4、使用数据库(选择该数据库为当前数据库):
格式:use 数据库名;
七、关系模型的基本属性
1)关系(一张二维表)
2)记录(行)
3)字段(列)
4)域 (取值范围)
八、创建数据库:
1、create database 1905a;
解释:如果系统中不存在1905a这个数据库,则就创建1905a数据库。
如果系统中已经存在1905a这个数据库了,则系统报错。
2、createdatabase if not exists 1905a;
解释:如果系统中不存在1905a这个数据库,则就创建1905a数据库。
如果系统中已经存在1905a这个数据库了,则不创建1905a数据库,但是系统不报错。
九、删除数据库:
1、drop database 1905a;
解释:如果系统中存在1905a这个数据库,则就删除1905a数据库。
如果系统中不存在1905a这个数据库了,则系统报错。
2、drop database if exists 1905a;
解释:如果系统中存在1905a这个数据库,则就删除1905a数据库。
如果系统中不存在1905a这个数据库了,则不删除而已,系统不报错。
十、数据库的编码(字符集)设置
格式:create
database 数据库名character set =utf8;
创建 数据库 数据库名 编码 设置 成utf8
十一、数据库命名规则:
1、不能与其他数据库重名,否则报错
2、可以由字母、数字、下划线、$符号组成,但是不能全部是数字
3、不能使用数据库中的关键字作为数据库名、表名
4、名称最长为64个字符
5、数据库中不区分大小写
[if !supportLists]一、[endif]SQL:结构化查询语言(structured query language)
二、数据库的语法要求:
1、可以在单行或多行书写,以分号结尾
2、注释格式: /*注释内容*/
3、不区分大小写 例如:create 与 CREATE 一样
三、数据类型:数值类型、字符串类型、日期和时间3种类型。
1、数值类
整型(int)--默认11位
浮点型(float 或double) decimal float(5,2)----共5位数,保留2位小数
2、字符串类型: char(长度固定) varchar(长度可变) text -赋值时加单引号
Varchar(40) char(40) 3
3、日期和时间:日期(date) 时间(time) datetime --赋值时加单引号
123 int
123.123 float(6,3)
张三a1 varchar(20)
2019-11-19 date
14:24:14 time
四、创建数据表的格式:
创建:create 表格:table
Id name sex score
create table表名(
列名1 列类型,
列名2 列类型,
....
列名n 列类型
);
五、查看数据库的表
格式: show tables;
六、查看数据表的结构(结构---就是表里有几个字段,每个字段什么类型)
两种方法:
方法一:
格式:desc 表名; 或者:describe 表名; (describe(描述) 简写 desc)
方法二:
格式:
showcolumnsfrom表名; (columns---列)
一、表的结构(结构指的是表中有几个字段,每个字段什么类型)
选择数据库:use 数据库名;
修改表结构前缀使用 alter table 表名
二、修改表的结构(增删改查)
1、查看数据表的某个字段的结构(某一列的结构)
格式:desc 表名 字段(列)名;
2、增加字段(一个或多个)
(增加一个字段)格式:alter
table 表名 add 新字段名 新字段类型;
(增加多个字段)格式:alter
table 表名 add (新字段名1 新字段类型,新字段名2 新字段类型);
3、删除字段(一个或多个)
(删除一个字段)格式:alter
table 表名 drop 字段名;
(删除多个字段)格式:alter
table 表名 drop 字段名1,drop 字段名2,....,drop 字段名n ;
注意:不能删除所有的字段,至少保留1个字段。
4、修改字段(字段类型或者字段名)
1)修改字段类型
(修改一个字段)格式:alter
table 表名 modify 字段名 字段类型;
(修改多个字段)格式:alter
table 表名 modify 字段名1 字段类型,modify 字段名2 字段类型;
2)修改字段名
(修改一个字段)格式:alter
table 表名 change 原字段名 新字段名 字段类型;
(修改多个字段)格式:alter
table 表名 change 原字段名1 新字段名1 字段类型,change 原字段名2 新字段名2 字段类型;
三、数据表的删除命令(drop):
格式:drop table 表名;
四、修改表名(rename--重命名):
有2种方法:
方法一:
格式:alter table 原表名rename to 新表名;
或者:alter table 原表名 rename as 新表名;
方法二:
格式:rename table原表名 to 新表名;
如何向数据表中添加数据呢? 使用insert语句实现。
一、数据插入(假设表中有3个字段)
(所有字段数据输入)
格式:
insert into 表名(字段1,字段2,字段3) ------插入1行记录
values(值1,值2,值3);
insert into表名 (字段1,字段2,字段3) ------插入3行记录
values(值1,值2,值3),(值1,值2,值3),(值1,值2,值3);
(部分字段数据插入)
格式:
insert into表名 (字段2,字段3) ------插入1行记录
values(值2,值3);
insert into表名 (字段2,字段3) ------插入3行记录
values(值2,值3),(值2,值3),(值2,值3);
注意:所有字符串数据和日期时间数据必须用单引号。
系统默认字符串是字符型,如果想使用汉字,则需要设置:set names gbk;
查看表中数据:select * from表名;
如果数据插入错误,如何更改数据呢?使用update语句实现。
二、修改表记录
格式:
update 表名 set 字段=值(改谁的就写谁的名字) where条件; --修改一个字段值
update表名 set 字段1=值1,字段2=值2.... where条件; ------修改多个字段值
三、删除记录(2种方法)
方法一: 格式:delete from 表名;(不清除格式)
删除表中某个记录:格式 delete from表名 where 条件
方法二: 格式:truncate 表名;(格式也全部清除
四、数据库备份和恢复
1、数据库备份(生成数据库脚本):(备份的是数据库的内容,不是备份数据库)
格式:mysqldump
-u用户名 -p密码 数据库名>生成脚本的文件路径(扩展名是.sql)
例如:mysqldump -uroot -p123 1905a>d:\1905a.sql
注意:
1、语句结尾不要打分号,不要连接数据库,直接在cmd下运行。
2、生成的脚本文件中不包含 create database 语句。
2、恢复数据库
格式:mysql
-u用户名 -p密码 数据库名<备份的脚本路径
例如:
1、先删除mysql数据库,再重新创建一个空的数据库mysql(为恢复数据库内容做准备)
2、mysql -uroot -p123 mysql
注意:
1、语句结尾不要打分号,不要连接数据库,直接在cmd下运行。
单表查询:在一张表中查询所需要的数据。
什么是查询语句呢?使用select语句进行查询功能,它的使用有些复杂,但是功能非常强大。
一、查询所有字段
1、查询所有字段是指查询表中所有字段的数据。
2、在Mysql中使用"*"代表所有的字段。
3、语法格式:select * from 表名;
二、查询指定字段
1、查询指定字段是指查询指定的部分字段。
2、语法格式:
select 字段名 from 表名;
3、如果查询多个字段,使用“,”对字段进行分隔
语法格式:
select字段名1,字段名2,字段名3 from 表名;
三、去重查询(重复记录只查询一次)
1、使用关键字distinct可以去除查询结果中的重复记录
2、语法格式:
select distinct 字段名 from 表名;
四、列运算(掌握运算符)
1、列运算:列和列之间进行运算。
2、了解运算符:
1)算术运算符:+ - * /(div) %(mod) 10/3 =3.。。1
2)比较运算符:> >= < <= = != <>
3)逻辑运算符:and(&&)与 or(||)或 not(!)非
3、列运算实践:
1)数值类型的列可以做算术运算(+
- * / %)
例如:select 列*1.5 from表名;
select列1+列2 from表名;
select列1*列2 from表名;
2)字符串类型的列可以做连接运算 (concat(列1,列2)或者concat('字符常量',列))
例如:
select concat(列1,列2) from 表名;
select concat('$',列) from 表名;
3)数值型
转换NULL值 (把值是NULL的列转换成数值0计算)
ifnull(age,0)-----把age列中存在的NULL值当成0来计算。
字符型
ifnull(sname,'无姓名')-----把sname列中为NULL的转换为无姓名
4)给列起别名
例如:select 列1+列2 as 名字 from 表名;
注意:as 可以省略
五、查询指定数据(补充)
1、在很多条记录中查询出符合条件的记录,设定查询条件用where子句。
2、例如,查询编号为6的学生记录
select * from 表名 where id=6;
3、例如,查询名字为张三的学生记录
select * from表名 where name='张三';
一、掌握集合查询(in)
1、关键字in可以判断某个字段的值是否在指定的集合中。
1)如果字段的值在集合中,则满足查询条件,该记录可以被查询出来。
2)如果字段的值不在集合中,则不满足条件,该记录不能被查询出来。
2、案例实践
1)查询学号是1001,1002,1003的记录
select * from 表名 where id
in(1001,1002,1003);
2)查询学号不是1001,1002,1003的记录
select * from 表名 where id not
in(1001,1002,1003);
二、掌握范围查询(between...and)
1、关键字between...and可以判断某个字段的值是否在指定的范围中。
1)如果字段的值在指定的范围中,则满足查询条件,该记录可以被查询出来。
2)如果字段的值不在指定的范围中,则不满足条件,该记录不能被查询出来。
2、案例实践
查询年龄在20到40之间的学生记录
select * from表名where agebetween 20 and 40;
或者:select *
from 表名where age>=20 and age<=40;
三、掌握空值及多重条件查询(is null,and,or)
1、空值查询(is null)----------不能用等于(=)号
查询年龄为null的记录
select * from 表名 where age is
null;
2、查询姓名不为null的学生记录
select * from 表名 where name
is not null;
或者:select * from 表名wherenot name is null;
3、带关键字and的多条件查询
1、查询年龄大于25岁的男讲师
select * from 表名 where
age>25 and sex='男';
2、查询出性别为男、年龄在30岁以下的精英学院的教师
select * from表名 where sex='男'and age<30 and xueyuan='精英学院';
4、带关键字or的多条件查询
查询出部门为大数据或者收入在5千以上教师姓名、性别、年龄
select name,sex,age
from 表名 where bumen='大数据' or money>5000;
四、限制查询结果的数量----limit关键字(补充)
1、查询数据时,可能会查询出很多的记录,而用户需要的记录可能只是很少的一部分,这样就需要来限制查询结果的数量。
关键字limit可以对查询结果的记录条数进行限定,控制它输出的行数。
2、显示前3条记录 select * from表名 limit 3;
3、使用关键字limit还可以查询结果的中间部分取值。
两个参数,参数1是开始读取的第一条记录的编号(在查询结果中,第一个结果的记录编号是0,而不是1);
参数2是要查询记录的个数。
例如:查询出第2条到第4条记录信息 select * from表名limit 1,3; 234
一、约束的作用
作用:完整性约束是为了表的数据的正确性,如果数据不正确,则数据不能添加到表中。
二、约束的分类
1、主键约束-----唯一标识(用于整型INT后)
a:当某一列添加了主键约束后,那么这一列的数据就不能重复出现,也不能为空。
b:每一个表中只能定义一个主键,可被外键引用。
c:指定主键约束的关键字primary key
d:主键约束的方式有3种:
1)创建表的列的同时指定主键 格式: 列名 列类型 primary key
2)创建表的列之后独立指定主键 格式: primary key(列名)
格式:alter table 表名 add primary
key(列名);
3)修改表指定主键
ALTER TABLE stu MODIFY id INT PRIMARY KEY;
e:删除主键约束(注意:只是删除主键约束,不会删除主键列)
格式:alter table 表名dropprimary key;
2、主键自增长约束
a:主键必须是整型才可以自增长。
b:当主键设置为自动增长后,在没有给出主键值时,主键从1开始,每次自增1。
当主键设置为自动增长后,在给定主键值后,会在给定值的基础上每次自增1。
c:指定主键自增长约束的关键字是:auto_increment
d:主键自增长约束的方式有2种:
1)创建表的列的同时指定主键自增长 格式:列名 类型 primary key auto_increment;
2)修改表时设置主键自增长
格式:alter table 表名change 旧列名 新列名 类型 primary key auto_increment;
3)删除主键自增长约束:格式:alter table 表名 change 旧列名 新列名 类型;(只是加自增长约束,新列名和旧列名一样就行)
e:主键自增长设置初始值
alter table表名auto_increment=初始值;(必须在加入数据前设置)
3、非空约束
a:指定非空约束的列不能没有值,否则报错。
b:非空约束的关键字not null
c:非空约束的格式: 列名 类型 not null;
d:字段默认是可以为空 例如:age int ; 等价于age int null;
4、唯一约束
a:字段指定唯一约束后,那么字段的值必须是唯一的。类似于主键约束。
b:唯一约束的关键字unique
c:唯一约束多的格式:列名 类型unique;
d:取消唯一约束: alter
table 表名 drop index 列名;
alter table student dropindex sname;
5、外键约束
a:主外键是构成表与表关联的唯一途径。
b:外键是另一张表的主键。
c:外键约束的格式:constraint 外键名(随便起) foreign key(外键列) references 主键表(主键列 就是参考哪个表的列写哪个);
d:删除外键约束的格式
alter table 外键表drop foreignkey 外键名;
e:查看外键:show create table 表名;
6、默认值约束(补充)
a、使用关键字default设置列的默认值
b、语法格式:
列名 类型 default 默认值;
例如:性别列默认值为男 sex varchar(50) default '男';
年龄列默认值为20 age int default 20;
一、掌握order by子句对查询结果排序ASC升序,DESC降序
1、使用关键字order by 对查询的结果进行排序。
2、在默认情况下,order by 按升序输出结果。升序(ASC) 降序(DESC)
3、排序的语法格式:
select * from 表名order by 字段名 asc/desc;
4、当排序时字段值相同,可以按照另一个字段排序
语法格式:
select * from 表名 order by 字段1 asc/desc,字段2 asc/desc;
二、掌握模糊查询 (like) like----喜欢,像
1、使用关键字like实现模糊查询,有两种通配符:% 和 下划线(_)
2、“%”----可以匹配一个或多个字符,可以代表任意长度的字符串。
1)查询姓王的学生信息 :select * from 表名 where name like '王%';
2)查询名字中包含“明”的学生信息: select *
from 表名 where name like '%明%';
3、“_”----可以匹配一个字符。
1)查询以m开头,以n结尾的3个字符姓名的学生信息 select * from 表名where name like 'm_n';
2)查询由5个字母构成的姓名的学生信息 select * from表名 where name like '_____';
4、练习:
1)查询姓名由5个字母构成,并且第5个字母为“i”的学生记录
select * from表where sname like '____i';
2)查询姓名以“z”开头的学生记录
select * from表where sname like 'z%';
3)查询姓名中第2个字母为“i”的学生记录
select * from表where sname like '_i%';
4)查询姓名中包含“a”字母的学生记录
select * from表where sname like '%a%;'
一、查询指定字段、查询所有字段以及列运算
1、查询指定字段: select字段名1,字段名2 from 表名;
2、查询所有字段: select * from表名;
3、列运算:
1)数值类型字段进行算术运算
2)字符串类型字段可以进行连接运算
3)null值的字段可以转换成0来计算
4)给进行运算的字段起别名
二、条件查询练习(范围查询、查询空及非空数据、多条件查询练习)
1、between and
2、is null
3、is not null
4、and or
三、将查询结果去重
select distinct 字段名 from 表名;
四、对查询结果进行排序
select * from表名 order by 字段名 asc/desc;
五、单个或多个字符匹配查询(模糊查询)
like---模糊查询
“%”----任意字符 “_”-----一个字符
day10(第十天)
聚合函数是用来做纵向运算的函数。
一、count()函数
1、功能:统计指定列不为null的记录行数
2、查询student表中记录数 selectcount(*) from student;
查询student表中sex列不为空的记录行数 select count(sex) from student;
查询student表中工资大于10000的人数 select count(*) fromstudent where money>10000;
3、多列字段同时统计行数
格式:select count(字段1),count(字段2) from 表名;
二、sum()函数
1、功能:计算某列的和
2、计算score列之和 select sum(score) from表名;
3、计算多列的和格式:
select sum(列1),sum(列2) from 表名;
三、avg()函数
1、功能:计算某列的平均值
2、计算score列的平均值 select avg(score) from表名;
3、平均值保留两位小数
round(avg(列名),2) -----会进行四舍五入计算
四、max()函数
1、功能:找出某列中的最大值
2、语法格式: select max(列名)from 表名;
3、找出多列中的最大值:select max(列名1),max(列名2) from 表名;
五、min()函数
1、功能:找出某列中的最小值
2、语法格式: select min(列名)from 表名;
3、找出多列中的最小值:select min(列名1),min(列名2) from 表名;
一、灵活运用分组查询group by子句(一个字段中有几种类别,比如男,女等,给分组出现)
例如:每个公司都有多个部门,如果统计每个部门的在职员工人数,那么就需要分组统计人数...
分组查询需要使用关键字group by
语法格式:
select ... from 表名 group by 列名;
例如:
查询每个部门的部门编号和每个部门的人数:
select id,count(*) from 表名 group by id;
having用法(补充)
一、having 用法与WHERE用法类似,但有三点不同
1、HAVING只用于GROUP BY(分组统计语句),
2、WHERE 是用于在初始表中筛选查询,HAVING用于在WHERE和GROUP
BY 结果中查询。
3、HAVING可以使用聚合函数,而WHERE 不能。
这个是用在聚合函数的用法。当我们在用聚合函数的时候,一般都要用到GROUP BY 先进行分组,然后再进行聚合函数的运算。
二、HAVING子句----练习
查询工资总和大于9000的部门编号以及工资和:
SELECT deptno, SUM(sal) FROM emp GROUP BYdeptno HAVING SUM(sal) > 9000;
二、掌握limit子句
限制查询结果的数量----limit关键字
1、查询数据时,可能会查询出很多的记录,而用户需要的记录可能只是很少的一部分,这样就需要来限制查询结果的数量。
关键字limit可以对查询结果的记录条数进行限定,控制它输出的行数。
2、显示前3条记录 select * from表名 limit 3;
3、使用关键字limit还可以查询结果的中间部分取值。
两个参数,参数1是开始读取的第一条记录的编号(在查询结果中,第一个结果的记录编号是0,而不是1);
参数2是要查询记录的个数。
例如:查询出第2条到第4条记录信息 select * from表名 limit 1,3;
一、查询表中满足某一条件的所有数据
select * from表名where id=3;
或者:select * from 表名 where name='张三';
二、对查询表中满足某一条件的数据限制查询数量
select * from表名where score>=80 limit 3;
三、查询表中满足多个条件的所有数据
select * from表名 where score>=80 and sex='男'and address='河南省';
select * from表名 where bumen='大数据'or bumen='物联网';
四、对满足条件的数据排序
select * from表名 where sex='男' order by score;
五、对某一范围内满足条件的数据进行分组
select id,score,xueyuan from表名where scorebetween 60 and 80 group by xueyuan;
六、对某一范围内满足条件的数据进行去重
select distinct xueyuan from表名where id between1 and 45;
七、模糊查询的数据限制查询结果的数量
select * from表名 where name like '王__' limit 3;
一、合并结果集
1、合并结果集就是把不同表中的记录连到一起,这样查询结果会产生笛卡尔积。
笛卡尔积:多表连接时,表中记录个数的乘积。
笛卡尔积中会存在我们不想要的结果,那么怎么去除这些记录呢?用条件过滤不想要的记录。
2、合并结果集的方法:内连接查询和外连接查询。
二、内连接查询 inner join
1、内连接是最普通的连接类型,它要求构成连接的表中有等同的字段。
2、内连接要求构成连接的每一部分的每个表的匹配,不匹配的行将被排除。
3、语法格式:
假设两个表中都有等同的字段user
select 字段名 from 表1,表2 where表1.user=表2.user; ------隐式内连接
或者:select 字段名 from 表1
inner join 表2 on 表1.user=表2.user; ------显式内连接(效率高)
三、外连接查询 outer join
1、与内连接不同,外连接是指使用outer join关键字将两个表连接起来。
外连接生成的结果集不仅包含符合连接条件的行数据,而且还包括左表(左外连接时的表)、右表(右外连接时的表)或两边连接表(全外连接时的表)中所有的数据行
(以及不符合条件的)。
2、语法格式:
select 字段名 from 表名1 left|right|full[outer] join表名2 on 表名1.字段名1=表名2.字段名2;
3、外连接分为左外连接(left
join)、右外连接(right join)和全外连接3种类型。
4、左外连接:
左连接是先查询出左表(即以左表为主),然后查询右表,右表中满足条件的显示出来,不满足条件的显示NULL。
5、右外连接:
右连接就是先把右表中所有记录都查询出来,然后左表满足条件的显示,不满足显示NULL。
四、合并查询结果 (补充)
1、合并查询结果是将多个select语句的查询结果合并到一起。
合并查询结果使用关键字union和union
all。
1)关键字union是将所有的查询结果合并到一起,然后去除重复记录;
2)关键字union all则只是简单地将结果合并到一起,不会去除重复记录。
2、语法格式:
select 字段 from 表1 union/union all select字段 from 表2;
一、复合条件连接查询
1、在连接查询时,也可以增加其他的限制条件。通过多个条件的复合查询,可以使查询结果更加准确。
2、语法格式:
select * from表1,表2
where 表1.字段=表2.字段 and 其他条件;---隐式
select* from表1 inner join 表2 on 表1.字段=表2.字段and 条件;---显式
3、练习:查询所有具有有效部门并且在2001年后入职的员工的所有信息(两张表)
select * from表1 a,表2b where a.depno=b.depno and a.hiredate>'2001';
二、查询指定列
1、查询指定的字段
2、练习:查询出所具有有效部门并且员工编号是1008,1011、1014的员工编号,员工姓名,部门编号,部门名称
select a.id,a.sname,a.depno,b.depname from表1 a,表2 b where a.depno=b.depno and a.depno in(1008,1011,1014);
三、查询指定数据
1、查询指定符合条件的数据
2、练习:查询出所具有有效部门并且员工工资高于20000元的员工编号,员工姓名,部门编号,部门名称
select * from表1 a,表2b where a.depno=b.depno anda.salary>20000;
查询student表中入职时间是2008年的所有数据
select * from student where hiredatebetween '2008-1-1' and '2008-12-31';
select * from student wherehiredate>='2008-1-1' and hiredate<='2008-12-31';
select * from student where hiredate like '2008%';
select * from student where year(hiredate)=2008;
1、子查询就是嵌套查询,即select中包含select,如果一条语句中存在两个,或两个以上select,那么就是子查询语句了。
2、子查询出现的位置:
1)where后作为条件存在
2)from后作为表存在(多行多列)
一、带关键字in的子查询
1、只有子查询返回的结果列包含一个值时,比较运算符才适用。
2、假如一个子查询返回的结果集是值的列表,这时比较运算符就必须用关键字in代替。
3、in 运算符可以检测结果集中是否存在某个特定的值,如果检测成功就执行外部的查询。
4、练习:查询性别和工资与李鹏飞完全相同的员工信息
select * from 表名 where (sex,salary) in (select
sex,salary from 表名 where sname='李鹏飞');
二、带比较运算符的子查询 > >= < <= = != <>
练习1:查询工资高于李鹏飞的员工信息
select * from 表名 where
salary>(select salary from 表名 where sname='李鹏飞');
练习2:查询分数大于班级平均分的学生的信息
select * from
student where score>(select avg(score) from student);
三、带exists的子查询
1、含有exists的子查询特点:
含有exists的子查询实际上不产生任何数据
在有返回行的情况下,子查询将返回true,反之则返回false
由于仅仅判断是否存在返回行,所以子查询的选择列表通常指定为(*)
2、练习:
1)如果student中存在name为张三,则查询表中的所有学生的姓名、性别和年龄
select
sname,sex,age from student where exists (select * from student where sname='张三');
2)如果student中不存在name为张三,则查询表中的所有学生的姓名、性别和年龄
select
sname,sex,age from student where not exists (select * from student where
sname='张三');
一、带any的子查询
1、关键字any表示满足其中任意一个条件。
2、使用关键字any时,只要满足内层查询语句返回的结果中的任意一个,就可以通过该条件来执行外层查询语句。
3、练习:查询工资大于大数据任意一人薪资的员工信息
select * from 表名 where salary > any(select salary from表名 where sname='大数据');
等价于:select *
from 表名 wheresalary >(select min(salary) from表名 where sname='大数据');
二、带all的子查询
1、关键字all表示满足所有条件。
2、使用关键字all时,只有满足内层查询语句返回的所有结果,才可以执行外层查询语句。
3、练习:查询工资高于大数据所有人的员工信息
select * from 表名 where salary > all(select salary from表名 where sname='大数据');
等价于:select *
from 表名 wheresalary >(select max(salary) from表名 where sname='大数据');
三、合并查询结果
1、合并查询结果是将多个select语句的查询结果合并到一起。
合并查询结果使用关键字union和union
all。
1)关键字union是将所有的查询结果合并到一起,然后去除重复记录;(比较常用)
2)关键字union all则只是简单地将结果合并到一起,不会去除重复记录。
2、语法格式:
select * from 表1 union/union all select * from表2;
或 select 字段 from 表1 union/union all select字段 from 表2;
3、注意事项:
合并结果的多个表中字段的数量和类型一致。