MySQL基础--(3) [DML(数据操纵语言),DQL(数据查询语言)]


DML(数据操纵语言)


数据操作语言DML(Data Manipulation Language).用户通过它可以实现对数据库的基本操作。例如,对表中数据的查询、插入、删除和修改。 在DML中,应用程序可以对数据库作插,删,改,排,检等五种操作。

常用语句: insert插入,delete删除,update修改

(1)插操作:把数据插入到数据库中指定的位置上去,如Append 是在数据库文件的末尾添加记录,而INSERT是在指定记录前添加记录。
(2)删操作:删除数据库中不必再继续保留的一组记录,如DELETE 对数据库中记录作删除标志。PACK是将标有删除标志的记录彻底清除掉。ZAP 是去掉数据库文件的所有记录。
(3)改操作:修改记录或数据库模式,或在原有数据的基础上, 产生新的关系模式和记录,如连接Join操作和投影操作Projection.
(4)排序操作:改变物理存储的排列方式。如SORT命令按指定关键字串把DBF文件中记录排序。从物理存储的观点看,数据库发生了变化,但从逻辑的观点(或集合论观点看),新的关系与排序前是等价的。
(5)检索操作:从数据库中检索出满足条件的数据,它可以是一个数据项, 一个记录或一组记录。如BROWSE单元实现对数据的浏览操作。SELECT选出满足一定条件和范围的记录。


插入数据操作


方式1: INSERT INTO 表名(列1,列2……,列n) VALUES(值1,值2……,值n);
每执行一次插入单行数据.


例如首先是数据库studentmessage_db的创建数据表t_student;将数据表t_student的结构复制到数据表t_student1中,两个表都是空的;

#创建表;
CREATE TABLE t_student(
         #学号:int类型,设置主键且自增;
         id INT PRIMARY KEY  AUTO_INCREMENT COMMENT '学号_主键',
         #姓名:最大长度为5的可定长字符串,设置不能为空约束,
         NAME VARCHAR(5) NOT NULL COMMENT '姓名',
         #性别:长度为1的定长字符串,设置默认值为女;
         sex  CHAR(1)DEFAULT '女' COMMENT '性别' ,
         #生日:日期类型;
         birthday DATE COMMENT '生日',
         #年级:长度为3的定长字符串,
         grade CHAR(3) COMMENT '年级',
         #成绩:double类型,数值总长度为3,保留小数后1位,且成绩在0-120之间;
         score DOUBLE(3,1) CHECK(score>=0 AND score<=120) COMMENT '成绩',
         #手机号:长度为11位定长字符串,设置唯一约束;
         phone CHAR(11) UNIQUE COMMENT '手机号',
         #注册时间:时间类型,
         registertime DATETIME COMMENT '注册时间' 
);

将t_student的结构复制到表t_student1;

#将t_student的结构复制到表t_student1;
CREATE TABLE t_student1 LIKE t_student;

对数据表t_student单行插入数据;

单引号’ '或双引号" "都可以表示字符串||||||||

表名中如果不描述列名,则默认向表中的所有列插入数据,值的数量要和列的数量相匹配

在设置当前时间的数据时;可使用NOW( )得到当前时间

#单行插入;
INSERT INTO t_student (id,NAME,sex,birthday,grade,score,phone,registertime) VALUES (181,'张三','男','2008-5-1','一年级',50,'12345678998',NOW());

效果:

在这里插入图片描述


方式2: INSERT INTO 表名 set 列名1=值1,…列名n=值n;
单个列名都对应的一个一个设置插入的数据
对数据表t_student用方式2插入数据;

#方式2:单个列名设置数据;
INSERT INTO t_student SET id=182,NAME='李四',sex='男',birthday='2021-6-1',grade='二年级',score=60,phone='12345698745',registertime=NOW();

在这里插入图片描述


方式3: INSERT INTO 表名(列1,列2……,列n) VALUES(值1,值2……,值n),(值1,值2……,值n);
同时插入多行数据.
对数据表t_student用方式3插入数据;

#方式3:多行插入;
INSERT INTO t_student (id,NAME,sex,birthday,grade,score,phone,registertime)
       VALUES(185,'张三','男','2006-5-27','一年级',50,'12115678998',NOW()),
             (186,'杰斯','女','2019-2-1','三年级',80,'12343378998',NOW()),
             (187,'咸鱼','男','2018-9-25','五年级',90,'12342278998',NOW()),
             (189,'小树人','女','2018-10-5','一年级',20,'12885678998',NOW());

在这里插入图片描述



方式4:INSERT INTO 表名(列1,列2……,列n) 查询语句(查询的列数与插入列数匹配);
可以用查询语句将一个表的数据插入到另一个表;注意;查询的列数与插入列数要匹配

对数据表t_student1用方式4插入数据;即将数据表t_student的数据插入t_student1中.

#方式4:
#没有写列名,就默认为全部的列;
INSERT INTO t_student1 SELECT*FROM t_student;

修改数据


UPDATE 表名 SET 列名 = ‘新值’WHERE 条件;
注意:修改表数据时一定要加条件语句,不然的话就会直接去修改每一行数据;
一般都是以主键作为条件语句的;由于主键是具有唯一性;(主键会在数据库中添加索引;就类似于一本书的目录;查找起来也方便)

例如:对数据表t_student的id为182的那行数据的name进行更改;

#修改数据;
# UPDATE  表名    SET 列名  = ‘新值’WHERE   条件;
UPDATE t_student SET NAME='暗星' WHERE id=182;

在这里插入图片描述


删除数据


对于表中部分数据的删除

DELETE FROM 表名 WHERE 条件
注意:如果不加条件语句就默认删除了表中所有数据

删除数据表所有的数据

TRUNCATE TABLE 表名;清空整张表
DELETE FROM 表名 不加条件就直接删除了表中所有数据

例如:删除数据表 t_student 的id=181的那一行数据;

DELETE FROM t_student WHERE  id=181;

在这里插入图片描述

例如:清空数据表 t_student1;

TRUNCATE TABLE t_student1;

在这里插入图片描述


DQL(数据查询语言)


DQL数据库查询语言基本结构是由select子句,from子句,where子句组成的查询块
select 字段名(结果的列) ;from 表名或视图名;where 查询条件
可以从一个表中查询数据,也可以从多个表中查询数据.

特点为:

  • 查询列表:表中的字段、常量、表达式、函数
  • 查询的结果是一个虚拟的表格,不会对表中的数据进行修改;就相当于查询了需要的数据然后将结果放在一个新的表中,且这个新的表不是存在的;这个表是只读的
  • 如果要同时执行多行SQL语句,每行都加分号;执行后的表格是分开的.

查询结果处理


首先学习这个对于查询结果的处理;查询常量值,表达式,函数(单行函数,日期函数,字符函数,数学函数,多行函数);对于列查询;排除重复行;使用的算术运算符.


查询常量值 例如:SELECT 20;
一般不会这样查询的

在这里插入图片描述


查询表达式:例如: select 20*9;

在这里插入图片描述


查询函数:select 函数; / 例如 select version( ); 查询版本号
之后会对函数进行分类学习;
SQL 拥有很多可用于计数和计算的内建函数。

在这里插入图片描述


全部列查询: select * from 表名
这里的 * 匹配所有列.
例如查询:数据表t_student;的所有列数据.
SELECT * FROM t_student;

在这里插入图片描述


特定列查询:select column1,column2 from 表名
例如查询:数据表t_student;的姓名和生日
SELECT NAME,birthday FROM t_student;

在这里插入图片描述


排除重复行: select distinct column1,column2 from table
(重复指的是多行数据的所有列相同;就例如说有个数据表,且只有姓名列和生日列,;其中有两个人姓名相同,生日相同;这两行就是重复数据.)
这主要是对于查询结果的处理;即查询出了一列结果,发现有重复的,就选择用关键字distinct 排除所有重复值.
例如:先查询数据表t_student;的性别;
SELECT sex FROM t_student;

在这里插入图片描述

然后排除重复数据

SELECT DISTINCT sex FROM t_student;

在这里插入图片描述


算数运算符:+ - * /

使用运算符都是对于数值数据使用的


函数

类似于java中的方法,将一组逻辑语句事先在数据库中定义好

隐藏了实现细节;提高代码的重用性.

调用:select 函数名(实参列表) [from 表];

分类

单行函数
对于单行数据进行操作,函数可以嵌套;
单行函数里面有 字符函数,数学函数,日期函数

分组函数
做统计使用,又称为统计函数、聚合函数、组函数



单行函数


字符函数


length( ):获取参数值的字节个数(以字节为单位)
char_length( )获取参数值的字符个数(以字符为单位)
空格也算入字符长度

concat(str1,str2,…):拼接字符串
upper( )/lower( ):将字符串变成大写/小写
substring(str操作的字符串,pos开始的位置,length长度);截取字符串; (索引位置从1开始)
instr(str,指定字符):返回指定字符第一次出现的索引(索引从1开始),如果找不到返回0

trim(str):去掉字符串前后的空格或字符,trim(指定字符 from 字符串)去除1个空格的话,这里的指定字符和from就不写

lpad(str操作的字符串,length总长度,填充字符):用指定的字符实现左填充将str填充为指定长度;

rpad(str操作的字符串,length总长度,填充字符):用指定的字符实现右填充将str填充为指定长度

replace(str操作的字符串,old旧的字符,new新的字符):替换,用指定的字符替换所有的字符.


查询数据表t_student的姓名字节长度;

SELECT length(NAME) FROM t_student;

在这里插入图片描述

#查询数据表t_student的姓名字符长度;

SELECT char_length(NAME) FROM t_student;

在这里插入图片描述


拼接数据表t_student姓名以及生日;

SELECT CONCAT(NAME,birthday) FROM t_student;

在这里插入图片描述


由于之前给数据表t_student插入数据时,没有用英文字母;临时插入两个名字JACK以及mark;

将数据表t_student姓名转大写;

SELECT UPPER(NAME) FROM t_student;

在这里插入图片描述

数据表t_student姓名转小写;

SELECT LOWER(NAME) FROM t_student;

在这里插入图片描述


查询截取数据表t_student手机号前三位;

SELECT SUBSTRING(phone,1,3)FROM t_student;

在这里插入图片描述


查询数据表t_student的姓名列中,字符"星"首次出现的索引;如果找不到返回0;

SELECT INSTR(NAME ,'星')FROM t_student;

在这里插入图片描述


查询数据表t_student的姓名列去除字符"暗";

SELECT TRIM('暗'FROM NAME) FROM t_student;

在这里插入图片描述


查询数据表t_student的姓名列左边填充字符’fortnite’;

SELECT LPAD(NAME,10,'fortnite')FROM t_student;

在这里插入图片描述

查询数据表t_student的姓名列右边填充字符’fortnite’;

SELECT RPAD(NAME,10,'fortnite')FROM t_student;

在这里插入图片描述


查询数据表t_student的年级列的字符’年级’替换为’grade’;

SELECT replace(grade,'年级','grade')FROM t_student;

在这里插入图片描述



逻辑处理


case when 条件语句

case when 条件 then 结果1 else 结果2 end; 可以有多个when
还可以对这个查询的结果的加别名
( case when 条件 then 结果 1 else 结果2 end) ‘别名’

查询对数据表t_student的成绩划分;

SELECT  (CASE WHEN score>=60 THEN '好耶' ELSE '不及格' END )'成绩分布' FROM t_student; 

在这里插入图片描述


加入多个when;(就类似于Java的switch语句)
查询对数据表t_student的年级划分;

SELECT  grade,
      (CASE WHEN grade='一年级' THEN 'Q'
            WHEN grade='二年级' THEN 'W'
            WHEN grade='三年级' THEN 'E'
            ELSE 'R'
            END)'年级划分'
            FROM t_student;

在这里插入图片描述


ifnull(判断是否为空)

ifnull(被检测值,指定的值)函数检测是否为null,如果为null,则返回指定的值,否则返回原本的值.
在逻辑语句结束后也可以加别名;例如 (ifnull(被检测值,默认值)) 别名

查询数据表t-student生日是否为空;

SELECT birthday,(IFNULL(birthday,'未登记生日'))'生日登记状况'FROM t_student;

在这里插入图片描述


if 判断:

if(条件,结果1:条件成立执行,结果2:条件不成立执行);
语句结束也可以加别名

查询数据表t_student的成绩进行划分;

SELECT score,(IF (score>=60,'好耶','不及格'))'别名:成绩划分'FROM t_student;

在这里插入图片描述



数学函数


数学函数是MySQL中常用的函数,主要用于处理数字,包括整形、浮点数等。

round(数值):四舍五入
ceil(数值):向上取整,返回()>=该参数的最小整数
floor(数值):向下取整,返回<=该参数的最大整数
truncate(数值,保留小数的位数):截断,小数点后截断到几位(注意:后面的小数不会进位上去)
mod(被除数,除数):取余数,被除数为正,则为正;被除数为负,则为负
rand():获取随机数,返回0-1之间的随机数(不会为1);


四舍五入,round(数值);

SELECT round(5.277);

在这里插入图片描述


向上取整,ceil(数值);

SELECT ceil(5.277);

在这里插入图片描述

向下取整,floor(数值);

SELECT floor(5.277);

在这里插入图片描述


truncate(数值,保留小数的位数):保留到小数第几位;注意后面的小数不会进位上来;

SELECT truncate(5.277,2);

在这里插入图片描述


mod(被除数,除数):取余,被除数为正,则为正;被除数为负,则为负;

SELECT mod(-20,3);

在这里插入图片描述


rand():获取随机数,返回0-1之间的随机数(不会取得1);

SELECT rand();

在这里插入图片描述



日期函数


日期函数是对于日期的获取,日期的设置以及对日期格式的处理.

now():返回当前系统日期+时间;
curdate():返回当前系统日期,不包含时间;
curtime():返回当前时间,不包含日期;

YEAR(日期),MONTH(日期),DAY(日期) ,HOUR(日期) ,MINUTE(日期) SECOND(日期)
可以获取指定的部分,年、月、日、小时、分钟、秒;

str_to_date(str需要处理的字符串,format日期格式化的指定格式):将日期格式的字符转换成指定格式的日期;
实际上数据库会进行默认转换

date_format(date需要处理的日期,format转化的指定格式):将日期转换成指定格式字符串;

datediff(big,small):返回两个日期之间相差的天数;

日期的格式:

格式含义
%Y年,(4 位 )
%m月,数值(00-12)
%d月的天,数值(00-31)
%H小时 (00-23)
%i分钟,数值(00-59)
%s秒(00-59)
%f微秒
%T时间 24-小时 (hh:mm:ss)
%j年的天 (001-366)
%w周的天 (0=星期日, 6=星期六)

now():返回当前系统日期+时间;

SELECT now();

在这里插入图片描述


curdate( ):返回当前系统日期,不包含时间;

SELECT curdate();

在这里插入图片描述


curtime():返回当前时间,不包含日期;

SELECT curtime();

在这里插入图片描述


YEAR(日期),MONTH(日期),DAY(日期) ,HOUR(日期) ,MINUTE(日期) SECOND(日期)
可以获取指定的部分,年、月、日、小时、分钟、秒;

例如:获取数据表生日列的年份和日期;

SELECT birthday,year(birthday),day(birthday) FROM t_student;

在这里插入图片描述


str_to_date(str需要处理的日期,format日期格式化的指定格式):将日期格式的字符转换成指定格式的日期;

SELECT str_to_date('2008-1-1',"%Y-%m-%d");

在这里插入图片描述


date_format(date:需要处理的日期,format:转化的指定格式):将日期转换成指定格式字符串;

例如:将数据表t_student的生日列转化为指定格式字符串显示;

SELECT birthday,date_format(birthday,'%Y年%m月%d日')FROM t_student;

在这里插入图片描述


datediff(big,small):返回两个日期相差的天数;

例如:计算数据表t_student的生日列距离现在系统日期的相差天数;

SELECT birthday,datediff(now(),birthday)FROM t_student;

在这里插入图片描述


分组函数


功能:
用作统计使用,又称为聚合函数或统计函数或组函数(多行数据综合为分类的数据)

分类:

sum 求和、avg 求平均值、max求 最大值、min求 最小值、count 计数(非空)
后面也可以加别名

特点:

1.sum,avg一般用于处理数值型max,min,count可以处理任何类型
2.以上分组函数都忽略null值;自动将null值排除掉
3.可以和distinct搭配实现去重的运算
4.count函数的一般使用count(*)(没有null值的列)用作统计行数;或者用主键统计行数
5.和分组函数一同查询的字段要求是group by后的字段



基本用法


sum 求和
查询数据表t_student的成绩列总和;

SELECT sum(score)'总分数'FROM t_student;

在这里插入图片描述


avg 求平均值
查询数据表t_student的成绩列平均值;

SELECT avg(score)'平均分数'FROM t_student;

在这里插入图片描述


max求 最大值、min求 最小值
查询数据表t_student的成绩列最大值;

SELECT max(score) '最高分数'FROM t_student;

在这里插入图片描述


count 计数
查询数据表t_student有几行姓名数据;

SELECT count(NAME)'姓名数'FROM  t_student;

在这里插入图片描述


可以和distinct搭配实现去重的运算;
去掉重复数值;查询数据表t_student的分数总和;

SELECT sum(DISTINCT score)'去重后的成绩总和' FROM t_student;

在这里插入图片描述


条件查询


使用WHERE 子句,将不满足条件的行数据过滤掉,WHERE 子句紧随 FROM 子句。

语法:select <结果> from <表名> where <条件>

基础查询


条件语句中使用的比较符号;
= (判断是否相等)
!= 或<>(不等于), >(大于) ,<(小于) , >=(大于或等于) , <=(小于或等于)

涉及到逻辑运算时:

and 与(两个或以上的条件同时成立)
or 或(两个或以上的条件有一个成立)
not 非(不符合所指定条件的)


练习;
#基础条件查询练习;(这里就不指定查询了;用*来获得所有列的数据);
#查询数据表t_student中成绩大于或等于60的;
SELECT * FROM t_student WHERE score>=60;
#查询数据表t_student中成绩大于或等于60的以及小于80的;
SELECT * FROM t_student WHERE score>=60 AND score<80;	
#查询数据表t_student中成绩大于或等于60的或者成绩小于30的;
SELECT * FROM t_student WHERE score>=60 OR score<30;	

模糊查询


LIKE:

LIKE :匹配于一个模式 一般和通配符搭配使用,可以判断字符型数值或数值型.
通配符:
% (百分号)任意多个字符,包含0个字符
_ (下划线)任意单个字符
一个下划线 _ 表示一个字符
例如:(匹配名字包含某个字符的) LIKE '%字符%';
匹配到第一个指定字符后且长度为3的 ;LIKE '%字符__'(注意两个下划线);
匹配到前面有一个字符且第二个字符为指定的 ; LIKE '_字符%'

例如:对于姓名的匹配;

#查询数据表中姓"鱼"的同学;
SELECT * FROM t_student WHERE NAME LIKE '鱼%';

在这里插入图片描述

#查询数据表中姓名包含"鱼"的同学;
SELECT * FROM t_student WHERE NAME LIKE '%鱼%';

在这里插入图片描述

#查询数据表中姓"鱼"的,且姓名长度为3个字的同学;(注意是两个下划线);
SELECT * FROM t_student WHERE NAME LIKE '%鱼__';

在这里插入图片描述


between and 两者之间,包含临界值;

即在一个闭区间内.

例如:查询数据表中成绩在30-60之间的同学;

SELECT * FROM t_student WHERE score BETWEEN 30 AND 60;

在这里插入图片描述


in 判断某字段的值是否属于in列表中的某一项

in ( ) 在列表中的数据;
not in( ) 不在列表中的数据;

例如:查询数据表中的一年级,二年级同学;

SELECT * FROM t_student WHERE grade IN('一年级','二年级');

在这里插入图片描述


IS NULL(为空的)或 IS NOT NULL(不为空的)

例如:

#查询数据表中生日为空值的;
SELECT * FROM t_student WHERE birthday IS NULL;
#查询数据表中生日不为空值的;
SELECT * FROM t_student WHERE birthday IS NOT NULL;

连接查询结果(union ,union all)


将多个SQL查询语句连接合并起来,最后的表统一到一张表;
在合并的时候,SQL语句获得的结果列数要一致,否则会报错;

union 是取唯一值,记录没有重复;并且Union将会按照字段的顺序进行排序;
(UNION会将重复的数据合并)
union all是直接连接,取到得是所有值,记录可能有重复
(UNION ALL只是将两张表合并;重复数据没有合并处理)
1、UNION 的语法:
[SQL 语句 1]
UNION
[SQL 语句 2]
2、UNION ALL 的语法:
[SQL 语句 1]
UNION ALL
[SQL 语句 2]
效率:
UNION和UNION ALL关键字都是将两个结果集合并为一个,但这两者从使用和效率上来说都有所不同。
1、对重复结果的处理:UNION在进行表链接后会筛选掉重复的记录,Union All不会去除重复记录。
2、对排序的处理:Union将会按照字段的顺序进行排序;UNION ALL只是简单的将两个结果合并后就返回。
从效率上说,UNION ALL 要比UNION快很多,所以,如果可以确认合并的两个结果集中不包含重复数据且不需要排序时的话,那么就使用UNION ALL。


例如:
使用UNION;
1.查询数据表中一年级的;2.查询成绩大于等于40分的;

SELECT id,NAME,grade FROM t_student WHERE grade='一年级'
UNION
SELECT id,NAME,grade FROM t_student WHERE score>=40;

在这里插入图片描述

使用 UNION ALL;
1.查询数据表中一年级的;2.查询成绩大于等于40分的;

SELECT id,NAME,grade FROM t_student WHERE grade='一年级'
UNION ALL
SELECT id,NAME,grade FROM t_student WHERE score>=40;

在这里插入图片描述


排序查询结果(order by 字段 asc/desc)


查询结果排序,使用 ORDER BY 子句排序

语法

order by 字段 asc(升序)/desc(降序)
asc代表的是升序,desc代表的是降序,如果不写,默认是升序
order by子句中可以支持单个字段、多个字段、表达式、函数、别名


如果order by后不加 字段和升序降序;就默认是使用主键的升序;

两列排序规则,先用第一个排序,当出现相同值,才使用第二个排序.


案例:查询数据表t_student,按成绩的降序排序;

SELECT * FROM t_student ORDER BY score DESC;

在这里插入图片描述

查询数据表t_student;按年级的升序排序;且按成绩的降序排序;

SELECT * FROM t_student ORDER BY grade ASC ,score DESC; 

在这里插入图片描述



数量限制(LIMIT ;OFFSET)



limit子句:对查询的显示结果限制数目 (位于sql语句最末尾位置)
语法

SELECT 查询结果 FROM 表名 WHERE 条件 LIMIT 显示的行数前几行;’


SELECT 查询结果 FROM 表名 WHERE 条件 LIMIT (可指定开始的位置从零开始计算) ,指定显示的行数;


SELECT 查询结果 FROM 表名 WHERE 条件 LIMIT 指定显示的行数 OFFSET 指定开始的位置从零开始计算

案例:(这里省略了条件的设置;)

#查询数据表的前4行;
SELECT * FROM t_student LIMIT 4;

在这里插入图片描述


#从第二行开始查询数据表的4行;
SELECT * FROM t_student LIMIT 1,4;

在这里插入图片描述

或者用
#从第二行开始查询数据表的4行;
SELECT * FROM t_student LIMIT 4 OFFSET 1;


分组查询(group by 分组条件)



group by 分组条件;
把相同条件的数据分到一个组;
和分组函数同列的只能是在group by 后的列;
分组别用主键;因为主键是不能重复的;


使用group by将数据分组后,由count( )计数统计的是每组中的数据个数.


语法:

select 分组函数,列和group by后的列是一致的
from 表名
[where 条件语句]
group by 需要分组的列
[having 分组后的筛选]
[order by 要排序的列]


分组查询中的筛选条件分为两类:
分组前筛选,分组后筛选

数据源源位置关键字
分组前筛选原始表group by子句的前面where
分组后筛选分组后的结果集group by的后面having

案例:
在分组前进行数据筛选;
按性别分组查询数据表中一年级的人数;且按人数的降序输出;

SELECT sex,count(*) 人数 
FROM t_student
WHERE  grade='一年级' 
GROUP BY sex 
ORDER BY 人数 DESC;

在这里插入图片描述

在分组后进行数据筛选;
按班级分组查询人数大于5的班级;

SELECT grade,count(*) 最多人数
FROM t_student
GROUP BY grade
HAVING 最多人数 > 5;

在这里插入图片描述



子查询



可理解为查询的嵌套;

子查询(Sub Query)或者说内查询(Inner Query),也可以称作嵌套查询(Nested Query),是一种嵌套在其他 SQL 查询的 WHERE 子句中的查询。
子查询用于为主查询返回其所需数据,或者对检索数据进行进一步的限制。
子查询可以在 SELECT、INSERT、UPDATE 和 DELETE 语句中,同 =、<、>、>=、<=、IN、BETWEEN 等运算符一起使用。

含义
出现在其他语句中的select语句,称为子查询或内查询;外部的查询语句,称为主查询或外查询.
这里的其它语句可以是 insert;update ;select;delete语句(主要是select语句)

子查询必须括在圆括号中。
子查询的 SELECT 子句中只能有一个列,除非主查询中有多个列,用于与子查询选中的列相比较。
子查询不能使用 ORDER BY,不过主查询可以。在子查询中,GROUP BY 可以起到同 ORDER BY 相同的作用。
返回多行数据的子查询只能同多值操作符一起使用,比如 IN 操作符。
SELECT 列表中不能包含任何对 BLOB、ARRAY、CLOB 或者 NCLOB 类型值的引用。
子查询不能直接用在聚合函数中。
BETWEEN 操作符不能同子查询一起使用,但是 BETWEEN 操作符可以用在子查询中。
子查询在SELECT语句内部可以出现SELECT 语句。
语句结果可以作为外部语句中条件子句的一部分,也可以作为外部查询的临时表。

注意:在update或delete语句中使用子查询;不能使用当前查询的数据表


分类:
按子查询出现的位置:
select后面:仅支持标量子查询
from后面:仅支持表子查询
where或having后面:支持标量子查询,列子查询,行子查询;不支持表子查询

按返回结果:
标量子查询(结果只有一行一列)
列子查询(结果只有一列多行)
行子查询(结果只有一行多列)首先要同时满足多个条件
表子查询(结果一般为多行多列)先把子查询出来的结果,看做一张临时表;



在insert语句中使用子查询语句;

insert语句中使用子查询;
#将数据表t_student的数据插入到数据表t_student2中;
INSERT INTO t_student2 SELECT* FROM t_student;

在update语句中使用子查询;不能使用当前查询的数据表

#注意:在update语句中使用子查询;不能使用当前查询的数据表;
#查询数据表t_student中的年级为一年级的同学的id;且将数据表t_student2的id在这个范围的性别设置为女;
UPDATE  t_student2 SET sex='女'  WHERE id IN(SELECT id FROM t_student WHERE grade='一年级'); 

在这里插入图片描述

在delete语句中使用子查询;不能使用当前查询的数据表;

#注意:在delete语句中使用子查询;不能使用当前查询的数据表;
#查询数据表t_student中的年级为一年级的同学的id;且将数据表t_student2的id在这个范围的同学删除掉;
DELETE FROM t_student2   WHERE id IN(SELECT id FROM t_student WHERE grade='一年级');

在这里插入图片描述


(重点)在查询语句中使用子查询


在select语句后只能使用标量子查询(返回值一行一列);

#在select语句后只能使用标量子查询(返回值一行一列);
#查询数据表的姓名;
SELECT (SELECT.id FROM t_student  内   WHERE.name=.name),.name FROM t_student 外 ;

在这里插入图片描述


在from语句后使用 表子查询(返回值多行多列);

#在from语句后使用 表子查询(返回值多行多列);
#按班级分组查询人数大于5的班级;
SELECT * FROM (
               SELECT grade,count(*) 最多人数
               FROM t_student
               GROUP BY grade)WHERE.最多人数 > 5;

在这里插入图片描述


在where语句后使用标量子查询;

#在where语句后使用标量子查询;
#查询成绩最高的同学;
SELECT * FROM t_student WHERE score=(SELECT max(score) FROM t_student);

在这里插入图片描述


在where语句后使用列子查询;

#在where语句后使用列子查询;
#查询成绩大于30的学生;
SELECT * FROM t_student WHERE score IN(SELECT score FROM t_student WHERE score>30 );

在这里插入图片描述


在where语句后使用行子查询;

#在where语句后使用行子查询;
#查询学号最大且成绩为最低的同学;
SELECT * FROM t_student WHERE  (id,score)=(SELECT max(id),min(score) FROM t_student );

在这里插入图片描述



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小智RE0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值