主要包含以下内容:

单表查询、子查询、多表查询(左连接右连接等)、合并查询

单表查询:

基础查询语句:

  select 列名

  from 表名

  where 条件

  group by 列名

  order by 列名

  having   //查询第二条件,常跟group by 配合使用

  limit 个数

where子句比较运算符:

  =     !=     <>    >     <      >=       <=  (不等于!=和<>均可)

  like   not like

  is null

  between...and...

  in(值1,值2)

通配符:

  • %     一个或多个字符
  • _      单个字符

  如果需要查询包含%或_(即%和_不作为通配符),使用escape,例如:

  select * from tb1 where addr like '%/%g%' escape '/'  查找包含%g的(escape后的/也可以换成其他字符)

  select * from tb1 where addr like '%a%g%' escape 'a' (a后的%不作为通配符)

group by:

  按列不同值分组,常与avg、sum等聚合函数一起使用

order by:

  对查询结果排序,默认升序。

  desc降序 (null值在最后)

  asc升序(null值在最前)

distinct:

  查询出所选列中,值不同的行

  select distinct 列1,列2 from 表名  //distinct对后面的列1,列2均有效

  select 列1,列2,列3 from 表名 group by 列1,列2,列3

  In most cases, a DISTINCT clause can be considered as a special case of GROUP BY. For example, the following two queries are equivalent: (distinct子句是group by的特例,以下两个语句等效)

  select distinct c1, c2, c3 from t1

  select c1, c2, c3 from t1 group by c1, c2, c3

having:
  第二查询条件,可以和sum,avg等函数一起使用,(从聚合函数计算后的结果中筛选)
  例如:

  select stu_name, sum(score) from tb1 group by stu_name having sum(score) > 60

 limit:
  限定查询结果个数
  limit n; 取前n条数据
  limit n1, n2  // n1表示开始读取的第一条记录的编号(从0开始),n2表示要查询的记录个数
 
  例如:取查询结果的前10条记录
  limit 10;  
  limit 0,10;

where和having: 

  •   where无法跟合计函数一起使用,如:

        where sum(cnt) > 3   错误

        having sum(cnt) > 3  正确

  •   where作用于视图和表,having作用于组
  •   where在分组和聚集之前,选取输入行(它控制哪些行进入聚集运算);having在分组和聚集之后,选择分组的行
  •   having一般跟在group by之后,执行记录组选择的一部分来工作的,where则是执行所有数据来工作的

子查询:

  一个查询结果可以作为另一个查询的条件 

  例1:查询book表中的记录,其中用户在user表中有登记的 select * from tb_books where user in (select user from tb_user)

  

  例2:有多个相同的最小值,要求查询出所有最小值的行   select * from tb1 where age in (select min(age) from tb1)

  

多表查询:

  多表查询有以下几种:

  • 内连接 inner join = join = from tb1, tb2  返回右表中和左表匹配的行(交集)
  • 左连接 left join = left outer join  返回左表所有的行,若右表没有匹配则补空行
  • 右连接 right join = right outer join  返回右表所有的行,若左表没有匹配则补空行
  • 全连接 full join = full outer join  返回所有行(笛卡尔积)

  注:

  1. 左连接的工作模式:从左表读出一条,选出所有与on匹配的右表记录(n条)进行连接,形成n条记录(包括重复的行);如果右表没有与on条件匹配的表,那么连接的字段都是null,然后继续下一条

  2. 内连接和多表条件查询等价(inner join和,(逗号)在语义上是等价的),以下两句等价;

  select 列名 from 表1 inner join 表2 on 条件

  select 列名 from 表1,表2 where 条件

  3. 当连接中on条件后为1=1,则为全连接。此时使用left join和right join效果相同,查询结果为左表中每一行和右表中每一行匹配,个数为左表的个数*右表的个数

  

  例如:两张原始表如下(人员表和订单表)

      

内连接

  列出所有人的订购(显示有订购的人和订购量)

select p.id_person, p.name, o.order_num
from tb_person p, tb_order o
where p.id_person = o.id_person (多表查询)
select p.id_person, p.`name`, o.order_num
from tb_person p inner join tb_order o on p.id_person = o.id_person (内连接)

  

左连接

  列出所有的人,以及他们的订购(如果有订购的话)

select p.id_person, p.`name`, o.order_num
from tb_person p left join tb_order o on p.id_person = o.id_person

  

右连接

  列出所有的订单,以及订购的人(如果有人订购的话)

select p.id_person, p.`name`, o.order_num
from tb_person p right join tb_order o on p.id_person = o.id_person

  

外连接

  列出所有的人以及他们的订单,和所有的订单以及订购他们的人

  ps:Oracle支持full join,mysql不支持full join,但仍可以通过left join + union + right join来实现

select p.id_person, p.`name`, o.order_num
from tb_person p left join tb_order o on p.id_person = o.id_person
union
select p.id_person, p.`name`, o.order_num
from tb_person p right join tb_order o on p.id_person = o.id_person

  

合并查询:

  合并两个或多个查询结果

  • union      会去重
  • union all 不去重,全部数据

  注:union内部的select语句必须拥有相同数量的列,且各列拥有相似的数据类型

练习题:

  以下两张表,tb_message文章表,tb_comment评论表。要求查找出所有文章的评论数,并按从大到小的顺序排序,若无评论,则为0

    

select m.id_message, m.title, count(c.content) n
from tb_message m left join tb_comment c on m.id_message = c.id_message
group by c.id_message
order by n desc

  

(二)SQL -- 查询的更多相关文章

  1. [SQL] SQL 基础知识梳理(二) - 查询基础

    SQL 基础知识梳理(二) - 查询基础 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5904824.html 序 这是<SQL 基础知识梳理( ...

  2. SQL基础--查询之二--连接查询

    SQL基础--查询之二--连接查询

  3. FreeSql (二十七)将已写好的 SQL 语句,与实体类映射进行二次查询

    有时候,我们希望将写好的 sql 语句,甚至是存储过程进行查询,虽然效率不高(有时候并不是效率至上). 巧用AsTable var sql = fsql.Select<UserX>() . ...

  4. SQL Server-聚焦深入理解动态SQL查询(三十二)

    前言 之前有园友一直关注着我快点出SQL Server性能优化系列,博主我也对性能优化系列也有点小期待,本来打算利用周末写死锁以及避免死锁系列的接着进入SQL Server优化系列,但是在工作中长时间 ...

  5. Oracle常用SQL查询(2)

    三.查看数据库的SQL 1 .查看表空间的名称及大小 select  t.tablespace_name,  round ( sum (bytes / ( 1024 * 1024 )), 0 ) ts ...

  6. Thinkphp查询 1.查询方式 2.表达式查询 3.快捷查询 4.区间查询 5.组合查询 6.统计查询 7.动态查询 8.SQL 查询

    1.使用字符串作为条件查询 $user = M('User'); var_dump($user->where('id=1 AND user="蜡笔小新"')->sele ...

  7. ThinkPHP(3)SQL查询语句

    ThinkPHP中对查询语句,包含了基本的查询方式.表达方式.快速查询.区间查询.组合查询.SQL查询.动态查询和子查询. 一.查询方式 ThinkPHP提供了三种基本的查询方式:字符串条件查询.索引 ...

  8. Hibernate SQL查询 addScalar()或addEntity()

    本文完全引用自: http://www.cnblogs.com/chenyixue/p/5601285.html Hibernate除了支持HQL查询外,还支持原生SQL查询.          对原 ...

  9. SQL 查询性能优化----解决书签查找

    先来看看什么是书签查找: 当优化器所选择的非聚簇索引只包含查询请求的一部分字段时,就需要一个查找(lookup)来检索其他字段来满足请求.对一个有聚簇索引的表来说是一个键查找(key lookup), ...

  10. 【T-SQL基础】01.单表查询-几道sql查询题

    概述: 本系列[T-SQL基础]主要是针对T-SQL基础的总结. [T-SQL基础]01.单表查询-几道sql查询题 [T-SQL基础]02.联接查询 [T-SQL基础]03.子查询 [T-SQL基础 ...

随机推荐

  1. 图片水印处理-temp

    /media/watermark 简要描述: 用户注册接口 应用场景:比较复杂的水印处理,如需要多次添加水印,或者水印图片本身也需要处理,如果处理相对简单,java项目可以通过dubbo接口Image ...

  2. PyQt5_主要的类库

    1.PyQt5包括的主要模块如下. QtCore模块——涵盖了包的核心的非GUI功能,此模块被用于处理程序中涉及的时间.文件.目录.数据类型.文本流.链接.QMimeData.线程或进程等对象. Qt ...

  3. 在Vue项目中加载krpano全景图

    在Vue-cli项目中做krpano全景图编辑器的时候,由于js插件的路径是动态的,做的过程中遇到了加载不到资源的难题,在网上搜索了好久也没找到合适的办法,最后想到了可能是JS加载的问题,于是解决了问 ...

  4. Jquery复习(九)之noConflict()

    如何在页面上同时使用 jQuery 和其他框架? jQuery 和其他 JavaScript 框架 正如您已经了解到的,jQuery 使用 $ 符号作为 jQuery 的简写. 如果其他 JavaSc ...

  5. Delphi 常用系统函数与过程

  6. 使用switchshow/supportshow命令确认Brocade交换机型号(转载)

    switchshow命令(或supportshow日志)中的switchType是以数字来代表不同的交换机型号,完整的对应表格如下: Switchtype EMC / Brocade名称 / 端口 / ...

  7. mariadb读写分离

    mycat maraidb主从架构,是主负责写,从负责读,但前端如果没有调度器的话,是无法实现读写分离的.这就涉及到了中间站,它就是mycat.一定要在主从架构的基础之上实现读写分离. 配置三台的主从 ...

  8. 认识 android-job

    简评: Android 实现后台任务的最佳实践. 对于现在的应用来说,在应用生命周期之外运行一些后台任务可以说已经是一项必不可少的需求了.这些任务可能是在某个时间点提醒用户什么事情或同步本地数据到服务 ...

  9. throttle和debounce函数

    控制耗性能的函数,避免浏览器卡死

  10. VirtualBox导入VmWare生成的.vmdk格式虚拟机镜像

    VmWare默认的镜像格式是.vmdk格式的,VirtualBox则默认是.vdi格式的.其实这在VirtualBox新建虚拟机的过程中是可选的. 导入.vmdk格式的镜像到VirtualBox只需要 ...