(二)SQL -- 查询
主要包含以下内容:
单表查询、子查询、多表查询(左连接右连接等)、合并查询
单表查询:
基础查询语句:
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
select stu_name, sum(score) from tb1 group by stu_name having sum(score) > 60
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 -- 查询的更多相关文章
- [SQL] SQL 基础知识梳理(二) - 查询基础
SQL 基础知识梳理(二) - 查询基础 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5904824.html 序 这是<SQL 基础知识梳理( ...
- SQL基础--查询之二--连接查询
SQL基础--查询之二--连接查询
- FreeSql (二十七)将已写好的 SQL 语句,与实体类映射进行二次查询
有时候,我们希望将写好的 sql 语句,甚至是存储过程进行查询,虽然效率不高(有时候并不是效率至上). 巧用AsTable var sql = fsql.Select<UserX>() . ...
- SQL Server-聚焦深入理解动态SQL查询(三十二)
前言 之前有园友一直关注着我快点出SQL Server性能优化系列,博主我也对性能优化系列也有点小期待,本来打算利用周末写死锁以及避免死锁系列的接着进入SQL Server优化系列,但是在工作中长时间 ...
- Oracle常用SQL查询(2)
三.查看数据库的SQL 1 .查看表空间的名称及大小 select t.tablespace_name, round ( sum (bytes / ( 1024 * 1024 )), 0 ) ts ...
- Thinkphp查询 1.查询方式 2.表达式查询 3.快捷查询 4.区间查询 5.组合查询 6.统计查询 7.动态查询 8.SQL 查询
1.使用字符串作为条件查询 $user = M('User'); var_dump($user->where('id=1 AND user="蜡笔小新"')->sele ...
- ThinkPHP(3)SQL查询语句
ThinkPHP中对查询语句,包含了基本的查询方式.表达方式.快速查询.区间查询.组合查询.SQL查询.动态查询和子查询. 一.查询方式 ThinkPHP提供了三种基本的查询方式:字符串条件查询.索引 ...
- Hibernate SQL查询 addScalar()或addEntity()
本文完全引用自: http://www.cnblogs.com/chenyixue/p/5601285.html Hibernate除了支持HQL查询外,还支持原生SQL查询. 对原 ...
- SQL 查询性能优化----解决书签查找
先来看看什么是书签查找: 当优化器所选择的非聚簇索引只包含查询请求的一部分字段时,就需要一个查找(lookup)来检索其他字段来满足请求.对一个有聚簇索引的表来说是一个键查找(key lookup), ...
- 【T-SQL基础】01.单表查询-几道sql查询题
概述: 本系列[T-SQL基础]主要是针对T-SQL基础的总结. [T-SQL基础]01.单表查询-几道sql查询题 [T-SQL基础]02.联接查询 [T-SQL基础]03.子查询 [T-SQL基础 ...
随机推荐
- 小白学习django第三站-自定义过滤器及标签
要使用自定义过滤器和标签,首先要设置好目录结构 现在项目目录下建立common的python包 再将common加入到setting.py中的INSTALLED_APP列表中 在common创建目录t ...
- python中魔法方法__str__与__repr__的区别
提出问题 当我们自定义一个类时,打印这个类对象或者在交互模式下直接输入这个类对象按回车,默认显示出来的信息好像用处不大.如下所示 In [1]: class People: ...: def __in ...
- 缓存---CDN(内容分发网络)
4.CDN 内容分发网络(content distribution network,CDN)是一种互联的网络系统,它利用更靠近用户的服务器从而更快更可靠的将静态资源分发给用户. cdn主要有以下优 ...
- 082、数据收集利器 cAdvisor (2019-04-30 周二)
参考https://www.cnblogs.com/CloudMan6/p/7683190.html cAdvisor 是google 开发的容器监控工具,下面我们开始安装和体验 cAdvisor ...
- 手把手教你如何安装使用webpack vue cli
1.安装node.js:https://nodejs.org/en/download/(看电脑的系统是多少位下载相应版本) 我下载的是Windows Installer(.msi) x64 2.打开c ...
- stars-one的原创工具——星之小说下载器(JavaFx应用 )
星之小说下载器Kotlin版 基于星之小说下载器Java版重构的Kotlin版本 github地址 使用说明 确保电脑有jdk8+以上的环境,双击即可运行(win10系统),win7则需要输入命令ja ...
- java软件设计模式只单例设计模式
概述 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计 ...
- CDN学习记录
0x00 简介 CDN的全称是Content Delivery Network,即内容分发网络.CDN是构建在现有网络基础之上的智能虚拟网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡.内容分 ...
- BZOJ[3252]攻略(长链剖分)
BZOJ[3252]攻略 Description 题目简述:树版[k取方格数] 众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏.今天他得到了一款新游戏<XX半岛> ...
- Linux 安装 nginx 安装PCRE库
PCRE(Perl Compatible Regular Expressions)是一个Perl库,包括 perl 兼容的正则表达式库.这些在执行正规表达式模式匹配时用与Perl 5同样的语法和语义是 ...