mysql常用基础操作语法(十)~~子查询【命令行模式】

mysql中虽然有连接查询实现多表连接查询,但是连接查询的性能很差,因此便出现了子查询。

1、理论上,子查询可以出现在查询语句的任何位置,但实际应用中多出现在from后和where后。出现在from后的子查询结果通常是多行多列的,充当临时表;而出现在where后的子查询结果通常是单行单列,充当条件:

2、where后作为条件的子查询多与“=”、“!=”、“>”、“<”等比较运算符一起使用。结果虽然通常是单行单列,但是有的时候也会用单行多列,而且有的时候还会返回多行单列。如果是多行单列的情况,则多与in、any、all、exists结合使用:

in和not in:

其中in表示包含于后边子查询结果集里的任意一个,not in表示不包含于后边结果集里的任意一个。上图子查询的结果中,返回depart_id为1、2、4,因此第一个查询就会查出emp中所有depart_id是1或2或4的,第二个就会查出既不是1也不是2也不是4的。

any:

=any的用法和in的效果是一样的;>any是说要大于子查询结果集里的任意一个就可以,简单理解就是只要大于结果集中最小的那个就可以;<any就是要小于子查询结果集里任意一个就可以,简单理解就是只要小于最大的一个就可以。因此这里>any是只要大于1就行,而<any则只要小于4就行。

all:

>all就是说要大于子查询结果集里所有的,简单理解就是要比最大的那个还大;<all就是要小于结果集里所有的,简单理解就是要比最小的还小。因此上边的第一个查询就是要大于4,第二个就是要小于1。

exists:

exists和not exists只关心后边的子查询是否有结果,而不关心子查询的结果是什么;对于exists,如果后边的子查询有结果,那么它的值就是true,反之如果没有查到结果,则为false,而not exists正好和这个情况相反,有值为false,无值为true。当他们的值为true时,前边查询到的结果成立,会被加入到主查询的结果集,否则不会被加入主查询的结果集。

在上便的查询中,查询语句会先从emp中查询一条数据,然后拿这条数据的depart_id和company中的depart_id比较,当存在两个id相同的数据时,就会有结果返回,然后最终返回6条数据,而第二个查询一样的道理,当不存在两个id相同的数据时,主查询才有结果返回,只有一条数据。

时间: 2024-12-24 08:33:34

mysql常用基础操作语法(十)~~子查询【命令行模式】的相关文章

mysql常用基础操作语法(四)--对数据的简单无条件查询及库和表查询【命令行模式】

1.mysql简单的查询:select 字段1,字段2...  from tablename; 如果字段那里写一个*,代表查询所有的字段,等同于指定出所有的字段名,因此如果要查询所有字段的数据,一般都是用*. 2.去重查询:select distinct 字段1,字段2... form tablename: 可以结合上一张图的结果来对比. 3.直接在查询时做数学四则运算,加减乘除余: 4.查询时给查询结果字段重命名:select 字段1 as 名称1,字段2 as 名称2 ... from ta

mysql常用基础操作语法(九)~~外连接查询【命令行模式】

1.左外连接left outer join或者left jion,outer可以省略不写,下边的右连接和全连接也一样: 左外连接的意思是,以left join左边的表中的数据为基准,即左边的表中有的必须要全部显示出来,如下图: 这里第一个查询中,company表在左边,因此就以company为基准,所以显示的结果中除了depart_id相同的6条数据外,还把company中存在的另外一条也显示出来. 而第二个查询中,emp在左边,就以emp为基准,因此显示的结果中除了depart_id相同的6条

mysql常用基础操作语法(七)--统计函数和分组查询【命令行模式】

注:文中所有的...代表多个. 1.使用count统计条数:select count(字段名...) from tablename; 2.使用avg计算字段的平均值:select avg(字段名) from tablename: 这里都可以适当的拓展,比如加条件,重命名等等. 3.使用sum求和:select sum(字段名) from tablename: 4.使用max和min求最大值.最小值: 5.注意:使用这些函数时,如果数据库中没有数据,count返回0,其他的返回null: 6.使用

mysql常用基础操作语法(六)--对数据排序和限制结果数量的条件查询【命令行模式】

1.使用order by对查询的结果进行排序,asc升序,desc降序: 也可以在order by后指定多个字段名和排序方式进行多级排序: 2.使用limit限制查询结果的数量: 上图中的0,代表查询的开始位置,也可以理解为跳过的数量:上图中的2代表需要查询出的数量.这个表中有3条数据,因为限制了条数为2,因此实际结果只是两条.另外,这里的初始位置是0,实际上可以不写,默认就是0: 这里还有一种情况,就是指定查询结果的数量可能大于表中的实际数量,这个时候返回结果会返回表中所有符合条件的数据,例如

mysql常用基础操作语法(五)--对数据的简单条件查询【命令行模式】

1.单条件查询:select 字段名 from tablename where 条件: 2.简单多条件查询,使用&&或者between and等: 3.is null和is not null查询,这里要注意null不是空字符串不是0: 4.in和not in查询,相当于是用or把in后边的集合元素连起来.注意如果in后边带的集合中存在null,那么不会影响结果,但not in后边集合中有null,就不会查处任何结果,not in也查不出null: 5.like模糊查询(不仅适用字符串):

mysql常用基础操作语法(十一)~~字符串函数【命令行模式】

注:sql的移植性比较强,函数的移植性不强,一般为数据库软件特有,例如mysql有mysql的函数,oracle有oracle的函数. 1.concat连接字符串: 从上图中可以看出,直接使用select concat就可以连接任意两个以上的字符串,同时也可以用来连接查询结果,一般情况中也是会用来连接查询结果.需要注意的是,如果连接的内容有null存在的话,那么结果就只会是null. 2.concat_ws使用分隔符连接字符串: 在上边的语法中,第一个字符传代表指定的连接格式,其他的代表需要连接

mysql常用基础操作语法(三)~~对数据的增删改操作【命令行模式】

1.插入单条数据:insert into tablename(字段名1,字段名2,...) values(值1,值2,...); 从图中可以看出,插入时不需要每个字段都有值(在没有相关的约束前提下),但是需要注意的是字段的数量和后边的值的数量必须一致,还要和自定的字段的顺序一致,类型也要一致,否则会报错.另外,如果没有指定任何字段的情况下,默认是选择了所有字段,则必须每个字段都有对应的值,并且需要和表中的字段顺序一致,否则会报错,如图: 2.插入多条数据:insert into tablenam

mysql常用基础操作语法(二)~~对表的增删改操作【命令行模式】

1.修改表名:alert table oldtablename rename newtablename; 或者alert table oldtablename rename to newtablename; [图形界面用多了,alter老是敲成alert] 2.在表的最后添加一个字段列:alter table tablename add 属性名 属性类型; 3.在表的第一列添加字段:alter table tablename add 属性名 属性类型 first; 4.在表指定字段后增加字段:a

mysql常用基础操作语法(一)~~对库的操作【命令行模式】

1.创建数据库:create Database databaseName;例如需要创建mysqlTest数据库,create Database mysqlTest; 由此还可以看出,这里的名称是不分大小写的,据我所知可以通过设置设置为全大些或者全小写. 2.查看系统中已经存在的数据库:show databases; 3.选择数据库:use databaseName;(本文中所有databaseName均是一个代称,表示数据库名称,tableName也是代称,表示表名): 4.删除数据库:drop