首页 > 数据库 >mysql用select的子查询结果作为where后筛选条件

mysql用select的子查询结果作为where后筛选条件

时间:2022-10-27 12:01:26浏览次数:63  
标签:语句 查询 SELECT mysql FROMtb where id select


mysql select查询语句where子句除了写子查询,还有没有更好的代替子查询的?

一使用SELECT子句进行多表查询

SELECT字段名FROM表1,表2…WHERE表1.字段=表2.字段AND其它查询条件

SELECTa.id,a.name,a.address,a.date,b.math,b.english,b.chineseFROMtb_demo065_telASb,tb_demo065ASaWHEREa.id=b.id

注:在上面的的代码中,以两张表的id字段信息相同作为条件建立两表关联,但在实际开发中不应该这样使用,最好用主外键约束来实现

二使用表的别名进行多表查询

如:SELECTa.id,a.name,a.address,b.math,b.english,b.chineseFROMtb_demo065a,tb_demo065_telbWHEREa.id=b.idANDb.id='$_POST[textid]'

SQL语言中,可以通过两种方式为表指定别名

第一种是通过关键字AS指定,如

SELECTa.id,a.name,a.address,b.math,b.english,b.chineseFROMtb_demo065ASa,tb_demo065_telASbWHEREa.id=b.id

第二种是在表名后直接加表的别名实现

SELECTa.id,a.name,a.address,b.math,b.english,b.chineseFROMtb_demo065a,tb_demo065_telbWHEREa.id=b.id

使用表的别名应注意几下几点

(1)别名通常是一个缩短了的表名,用于在连接中引用表中的特定列,如果连接中的多个表中有相同的名称列存在,必须用表名或表的别名限定列名

(2)如果定义了表的别名就不能再使用表名

三合并多个结果集

SQL语言中,可以通过UNION或ALL将多个SELECT语句的查询结果合并输出,这两个关键字的使用说明如下:

UNION:利用该关键字可以将多个SELECT语句的查询结果合并输出,并删除重复行

ALL:利用该关键字可以将多个SELECT语句的查询结果合并输出,但不会删除重复行

在使用UNION或ALL关键字将多个表合并输出时,查询结果必须具有相同的结构并且数据类型必须兼容,另外使用UNION时两张表的字段数量也必须相同,否则会提示SQL语句有错误。

e.x:SELECTid,name,pwdFROMtb_demo067UNIONSELECTuid,price,dateFROMtb_demo067_tel

四简单嵌套查询

子查询:子查询是一个SELECT查询,返回单个值且嵌套在SELECT、INSERT、UPDATE和DELETE语句或其它查询语句中,任何可以使用表达式的地方都可以使用子查询.

SELECTid,name,sex,dateFROMtb_demo068WHEREidin(SELECTidFROMtb_demo068WHEREid='$_POST[test]')

内连接:把查询结果作为WHERE子句的查询条件即称为内连接

五复杂的嵌套查询

多表之间的嵌套查询可以通过谓词IN实现,语法格式如下:

test_expression[NOT]IN{

subquery

参数说明:test_expression指SQL表达式,subquery包含某结果集的子查询

多表嵌套查询的原理:无论是多少张表进行嵌套,表与表之间一定存在某种关联,通过WHERE子句建立此种关联实现查询

六嵌套查询在查询统计中的应用

实现多表查询时,可以同时使用谓词ANY、SOME、ALL,这些谓词被称为定量比较谓词,可以和比较运算符联合使用,判断是否全部返回值都满足搜索条件.SOME和ANY谓词是存在量的,只注重是否有返回值满足搜索条件,这两个谓词的含义相同,可以替换使用;ALL谓词称为通用谓词,它只关心是否有谓词满足搜索要求.

SELECT*FROMtb_demo069_peopleWHEREuidIN(SELECTdeptIDFROMtb_demo069_deptWHEREdeptName='$_POST[select]')

SELECTa.id,a.nameFROMtb_demo067ASaWHEREid<3)

>ANY大于子查询中的某个值

>=ANY大于等于子查询中的某个值

<=ANY小于等于子查询中的某个值

=ANY等于子查询中的某个值

!=ANY或<>ANY不等于子查询中的某个值

>ALL大于子查询中的所有值

>=ALL大于等于子查询中的所有值

<=ALL小于等于子查询中的所有值

=ALL等于子查询中的所有值

!=ALL或<>ALL不等于子查询中的所有值

七.使用子查询作派生的表

在实际项目开发过程中经常用到从一个信息较为完善的表中派生出一个只含有几个关键字段的信息表,通过子查询就可以来实现这一目标,如

SELECTpeople.name,people.chinese,people.math,people.englishFROM(SELECTname,chinese,math,englishFROMtb_demo071)ASpeople

注:子查询应遵循以下规则:

(1)由比较运算符引入的内层子查询只包含一个表达式或列名,在外层语句中的WHERE子句内命名的列必须与内层子查询命名的列兼容

(2)由不可更改的比较运算符引入的子查询(比较运算符后面不跟关键字ANY或ALL)不包括GROUPBY或HAVING子句,除非预先确定了成组或单个的值

(3)用EXISTS引入的SELECT列表一般都由*组成,不必指定列名

(4)子查询不能在内部处理其结果

八使用子查询作表达式

SELECT(SELECTAVG(chinese)FROMtb_demo071),(SELECTAVG(english)FROMtb_demo071),(SELECTAVG(math)FROMtb_demo071)FROMtb_demo071

注:在使用子查询时最好为列表项取个别名,这样可以方便用户在使用mysql_fetch_array()函数时为表项赋值,如

SELECT(SELECTAVG(chinese)FROMtb_demo071)ASyuwen,(SELECTAVG(english)FROMtb_demo071)ASyingyu,(SELECTAVG(math)FROMtb_demo071)ASshuxueFROMtb_demo071

九使用子查询关联数据

SELECT*FROMtb_demo072_studentWHEREid=(SELECTidFROMtb_demo072_classWHEREclassName='$_POST[text]')

十多表联合查询

利用SQL语句中的UNION,可以将不同表中符合条件的数据信息显示在同一列中。

e.x:SELECT*FROMtb_demo074_studentUNIONSELECT*FROMtb_demo074_fasten

注:使用UNION时应注意以下两点:

(1)在使用UNION运算符组合的语句中,所有选择列表的表达式数目必须相同,如列名、算术表达式及聚合函数等

(2)在每个查询表中,对应列的数据结构必须一样。

十一对联合后的结果进行排序

为了UNION的运算兼容,要求所有SELECT语句都不能有ORDERBY语句,但有一种情况例外,那就是在最后一个SELECT语句中放置ORDERBY子句实现结果的最终排序输出。

e.x:SELECT*FROMtb_demo074_studentUNIONSELECT*FROMtb_demo074_fastenORDERBYid

使用UNION条件上相对比较苛刻,所以使用此语句时一定要注意两个表项数目和字段类型是否相同

十二条件联合语句

SELECT*FROMtb_demo076_BEIJINGGROUPBYnameHAVINGname='人民邮电出版社'ORname='机械工业出版社'UNIONSELECT*FROMtb_demo076_BEIJINGGROUPBYnameHAVINGname<>'人民邮电出版社'ANDname<>'机械工业再版社'ORDERBYid

上面语句应用了GROUPBY分组语句和HAVING语句实现条件联合查询。其实现目的是先保证将'人民邮电出版社'和'机械工业出版社'始终位于名单最前列,然后再输出其它的出版社

十三简单内连接查询

SELECTfiledlistFROMtable1[INNER]JOINtable2ONtable1.column1=table2.column1

其中,filedlist是要显示的字段,INNER表示表之间的连接方式为内连接,table1.column1=table2.column1用于指明两表间的连接条件,如:

SELECTa.name,a.address,a.date,b.chinese,b.math,b.englishFROMtb_demo065ASaINNERJOINtb_demo065_telASbona.id=b.id

十四复杂内连接查询

复杂的内连接查询是在基本的内连接查询的基础上再附加一些查询条件,如:

SELECTa.name,a.address,a.date,b.chinese,b.math,b.englishFROMtb_demo065ASaINNERJOINtb_demo065_telASbona.id=b.idWHEREb.id=(SELECTidFROMtb_demo065WHEREtb_demo065.name='$_POST[text]')

总之,实现表与表之间的关联的本质是两表之间存在共同的数据项或者相同的数据项,通过WHERE子句或内连接INNERJOIN…ON语句将两表连接起来,实现查询

十五使用外连接实现多表联合查询

(1)LEFTOUTERJOIN表示表之间通过左连接方式相互连接,也可简写成LEFTJOIN,它是以左侧的表为基准故称左连接,左侧表中所有信息将被全部输出,而右侧表信息则只会输出符合条件的信息,对不符合条件的信息则返回NULL

e.x:SELECTa.name,a.address,b.math,b.englishFROMtb_demo065ASALEFTOUTERJOINtb_demo065_telASbONa.id=b.id

(2)RIGHTOUTERJOIN表示表之间通过右连接方式相互连接,也可简写成RIGHTJOIN,它是以右侧的表为基准故称右连接,右侧表中所有信息将被全部输出,而左侧表信息则只会输出符合条件的信息,对不符合条件的信息则返回NULL

E.X:SELECTa.name,a.address,b.math,b.englishFROMtb_demo065ASARIGHTOUTERJOINtb_demo065_telASbONa.id=b.id

十六利用IN或NOTIN关键字限定范围

e.x:SELECT*FROMtb_demo083WHEREcodeIN(SELECTcodeFROMtb_demo083WHEREcodeBETWEEN'$_POST[text1]'AND'$_POST[text2]')

利用IN可指定在范围内查询,若要求在某范围外查询可以用NOTIN代替它

十七由IN引入的关联子查询

e.x:SELECT*FROMtb_demo083WHEREcodeIN(SELECTcodeFROMtb_demo083WHEREcode='$_POST[text]')

十八利用HAVING语句过滤分组数据

HAVING子句用于指定组或聚合的搜索条件,HAVING通常与GROUPBY语句一起使用,如果SQL语句中不含GROUPBY子句,则HAVING的行为与WHERE子句一样.

e.x:SELECTname,mathFROMtb_demo083GROUPBYidHAVINGmath>'95'

mysql用select的子查询结果作为where后筛选条件_sql

在MySQL中,Where可以直接使用Select产生的结果么?

数据库中执行顺序由于是

1、from子句

2、WHERE子句

3、SELECT子句

所以,where无法获得C字段的存在,只能写子查询。

不光给出了答案,还解释了为什么,非常感谢!

mysql SQL语句如何将sum()放在where后面做条件怎么写呢?

写入语句:“select col1,sum(cols2) from table_name group by col1 having sum(col2)>100”

1. 写入语句可以用where,having代表查询按照col1分组后,sum(col2)大于100。

2. SQL即结构化查询语言,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。

3. SQL语句删除表:drop table tabname--这是将表连同表中信息一起删除但是日志文件中会有记录

4. SQL语句创建索引:create [unique] index idxname on tabname(col…)

5. SQL基本语句

1. sql="select * from 数据表 where字段名like '%字段值%' order by 字段名 [desc]"

2. sql="select top 10 * from 数据表 where字段名=字段值 order by 字段名 [desc]"

3. sql="select top 10 * from 数据表 order by 字段名 [desc]"

4. sql="select * from 数据表 where字段名in ('值1','值2','值3')"

5. sql="select * from 数据表 where字段名between 值1 and 值2"如果是想同一组中的b的总和为5,则是 select * from A where a in (select a from A group by a having sum(b)=5);

如果是想找出任意个b的总和为5,那sql写不出,只能取出所有数据在程序里进行遍历或回溯应该只有分组求和的时候可以将sum用在where后面

select id,sum(num) from table

where sum(num) > 100

group by id;select a,b,c from A

where a in (select a from A group by a having sum(b)=5)

如何用查询出来后的结果作为where条件

select * from Table

where id = (select id from Table2)会出来你所查询的表的全部内容,因为你没有输入显示条件。

标签:语句,查询,SELECT,mysql,FROMtb,where,id,select
From: https://blog.51cto.com/yetaotao/5800706

相关文章

  • Mysql删除用户
    如何在mysql的配置文件添加一个用户注:我的运行环境是widnowsxpprofessional+MySQL5.0一,创建用户:命令:CREATEUSER'username'@'host'IDENTIFIEDBY'password';说明:username......
  • mysql设置远程访问权限
    mysql怎么开启远程登录功能进入cmd命令模式。mysql-hlocalhost-umysql-pEnterpassword:******连接数据库。mysql>usemysql;(此DB存放MySQL的各种配置信息)Databasechangedmy......
  • mysql执行计划的type
    如何理解MySQL的执行计划mysql中有一个叫event的东西,你可以查一下文档,可以设置定时更新,执行一个过程的sql。mysql中执行计划里type为index就需要优化吗mysql是一种sql关系......
  • mysql性能分析工具
    mysql如何分析查询性能如何提高MySQLLimit查询的性能?在MySQL数据库操作中,我们在做一些查询的时候总希望能避免数据库引擎做全表扫描,因为全表扫描时间长,而且其中大部分扫描......
  • mysql面试题
    拼接table_1:1a,b,c2a,btable_2:a北京b上海c南京输出1北京,上海,南京CREATETABLE`table_1`(`id`intDEFAULTNULL,`daihao`varchar(100)DEFAU......
  • 查看mysql binlog日志(转)
    1.使用showbinlogeventsa.获取binlog文件列表mysql>showbinarylogs;+------------------+-----------+|Log_name|File_size|+------------------......
  • Mysql 行号+分组行号+取Top记录 SQL
    Mysql行号+分组行号+取Top记录SQLselect*from(SELECT(@rowNum:=@rowNum+1)asrowNum--全量行号......
  • intellij IDEA+JAVA 做一个登陆界面,用到了mysql数据库
      今天打算学习一下IDEA+JAVA的框架搞点事情。网上发现个例子。发现有很多BUG。因为用到了mysql。还需要去装SQL安装包。以前有点经验。所以就弄了一下。首先下载MYSQL......
  • mysql视图/存储过程
    一.视图相关操作--注:对于单表查询的视图可以进行删除修改操作,多表查询的无法进行删除修改操作。一般视图多数用来做查询,不建议修改。--1.创建视图,语法格式CREATE......
  • mysqltext最大长度
    mysql数据库中text类型不设置大小默认大小事多少TINYBLOBTINYTEXT一个BLOB或TEXT列,最大长度为255(2^8-1)个字符。一个BLOB或TEXT列,最大长度为65535(2^16-1)个字符。MEDIUMBL......