php开发-常见查询

//order 子句 对前面取得数据 来指定某个字段的大小进行排序 排序只有两种方式
//正序 :ASC (默认)
倒序 :DESC

select *from  user order by age; //按照年龄从小到大
select *from  user order by age desc; 倒序

//分组查询 limit 子句 用于分页查询
形式:

   limit [起始行号],要取出的行号num
select *from user limit 0 ,3;

一、连接查询

解释:连接就是两个或2个以上的表("连接起来成为一个数据源").
基本含义:将两个表以"并排"的方式,连接起来,成为"更多字段"的一个新表,当然,根据连接的方式不同方式,得到的新表的行数有不同,

1.交叉连接

语法:

    from 表1  jion 表2;

实例:

select *from user cross join class;  //cross可以省略,也可以用inner提替代  这些数据是无意义的
2.内连法: 显示出有意义的数据

语法:

   from 表1 [inner] join 表2 on 表1.字段1 = 表2.字段2;
   select *from user inner join class on user.class_id=class.class_id;
3.左[外]连接:

形式:

  from 表1 left [outer] join 表2 on 连接条件.

说明:
1.这里,left 是关键字.
2.连接条件和内连接一样
3.含义是:内连接的结果基础上,加上左边表中的所有不符合连接条件的数据,相应本应放右边表的字段的位置就自动补位"null"值

  select *from user left join class on user.class_id=class.class_id;
4.右[外]连接

右连接跟左连接恰恰相反:
形式:

   from 表1 right [outer] join 表2 on 连接条件.
   1.这里,right 是关键字.
   2.连接条件和内连接一样
   3.含义是:内连接的结果基础上,加上右边表中的所有不符合连接条件的数据,相应本应放左边表的字段的位置就自动补位"null"值

演示:

   1.找出名字含34的所属 班级名称
select class.class_name from user inner join class on user.class_id=class.class_id where user.name like "%34%";
   2.找出2班的所有人  注意点  user后面的点   和where需要指定表名
 select user.* from user inner join class on user.class_id=class.class_id where class.class_name="二班";

二、子查询

如果一个select查询语句中,又出现了select查询语句,此时就称为"子查询",前者就是"主查询"
形式:

  select  字段或表达式或(子查询)[as 别名] from  表名或(子查询2) where 字段表达式或(子查询3的条件判断

通常:
子查询1应该是一个"数据结果".
子查询2可以是"任意结果",此位置的查询结果,通常作为数据源,可以给一个别名
子查询3可以是一个数据或一列数据甚至是一行数据

三、常见子查询及相关关键字

1.比较运算符中使用子查询
形式为: 操作数 比较运算符 (标量子查询);
操作数通常是一个字段.
含义:判断该操作数(字段)的值是否满足该比较运算符所设定的比较结果
其实就是相当于最简单的这种形式:id > 5;

需求:找出所有大于平均年龄的人

   第一步:找出平均年龄:
    select avg(age) as avg_age from user;
   第二步:找商品:
    select *from user  where age >600.4 ; <====>
    select *from user where age > (select avg(age) from user); //结合

2.使用in子查询
in的基本语法形式为:

   where  操作数  in (值1,值2, ....)

则in子查询就是:

   where  操作数  in (列子查询) ;

含义:
表示该操作数(字段值) 等于 该子查询的其中任意一个只,就算满足条件

需求:
找出所有带"43"字的人的班级
第一步:
找出所有含43的字的班级id

 select class_id from user where name like "%43%";

第二部:
根据结果找出这些类别的产品:

   select *from class where class_id in (1,2,3,34);  <====>
   select *from class where class_id in  (select class_id from user where name like "%43%");//联合

2.使用any子查询 和some一样的用法
使用形式:

  where  操作数  比较运算符   any ( 列子查询 );

说明:
1操作数通常仍然是字段名
2比较运算符就是常规的 > >= < <= = <>
3列子查询也可以是标量子查询,都表示"若干个数据值"
含义:
表示该操作数的值只要跟列子查询的任意一个值满足给定的比较运算,就算满足了条件——就是只要有一个成就成
考察一个特定情况:

  where  操作数  =  any ( 列子查询 );

则其完全相当于:

  where  操作数  in  ( 列子查询 );

需求:
找出所有带"43"字的人的班级

 select *from class where class_id =any(select class_id from user where name like "%43%");

3.使用all子查询
使用形式:
where 操作数 比较运算符 all ( 列子查询 );
说明:
1操作数通常仍然是字段名
2比较运算符就是常规的 > >= < <= = <>
3列子查询也可以是标量子查询,都表示"若干个数据值"
含义:
表示该操作数的值必须跟列子查询的所有值都满足给定的比较运算,才算满足了条件
需求:
找出学生中,年龄最大的
方法一:

   select *from user where age >=all (select age from user);
  方法二:
   select *from user where age = (select max(age) from user);

4.使用exists的子查询
以前所学:
if exist
或者:
if not exists
以前其含义通常是:存在某数据(通常是一个表)

现在,该词也同样用于子查询,表示同样的含义"存在"

形式:

  where  exists  (子查询);

含义:
如果该子查询有结果数据(无论什么数,只要大于等于1行),则就是true,否则为false

例子:找出有学生的班级

select *from class where exists (select *from user where user.class_id = class.class_id);

4.使用not exists子查询
含义跟exists子查询相反
举例:
找出还没有在售商品的类别

select *from class where not exists (select *from user where user.class_id = class.class_id);

/********联合查询*******/

  1. 联合查询的关键字是: union
    连接查询的关键字: join
    但,在mysql手册中,join这个连接查询,往往都翻译为'联合查询'
    但在绝大多数的中文书籍和文章中,join被翻译为'连接查询'

基本含义
联合查询就是将两个select语句的查询结果'层叠'到一起成为一个'大结果'
两个查询结果的能够进行'联合'的先觉条件是:结果字段数相等

  select id, name ,age from user union (select ta_id,name,age_num from ta1);

2.联合查询的排序等操作

语法形式:

select 语句1
union  [ALL | DISTINCT]
select 语句2;

说明:
1.两个select语句的输出段(结果字段)一样数目一样,应用中通常类型一样才有意义
2.结果集中的字段以第一个select语句的字段为准
3.第一个select语句的字段可以做别名,但如果做别名,则后续的where,group,order等子句应该用该别名
4.联合查询默认是会消除重复项的(DISTINCT),要想不消除,则必须明确些"ALL"
5.如果要对整个联合结果进行排序或limit,则应该对各自的select语句加括号:

(select 语句1)
union
(select 语句2)
order  by .....  limit ....;
例子:
(select id, name ,age from user) union (select ta_id,name,age_num from ta1) order by age;

(select id, name ,age from user) union (select ta_id,name,age_num from ta1) order by age limit 0,4;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,186评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,858评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,620评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,888评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,009评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,149评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,204评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,956评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,385评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,698评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,863评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,544评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,185评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,899评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,141评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,684评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,750评论 2 351

推荐阅读更多精彩内容