DQL:data query language用来查询数据库表中的数据
对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
如果没有查询条件,则每次查询所有的行。实际应用中,一般要指定查询的条件。对记录进行过滤。
查询的语法:
select
字段列表
from
表名列表
where
条件列表
group by
分组字段
having
分组之后的条件
order by
排序
limit
分页限定
1、基础查询
SELECT * FROM 表名;
Select的优化:
任何地方都不要使用 select * from t ,用具体的字段列表代替“*”,不要返回用不到的任何字段。学习阶段偷懒才写*号。
2、where条件查询
SELECT 字段名 FROM 表名 WHERE 条件;
注意:
*尽量将表字段定义为not null约束,这样不需要判断是否为null,如:int not null default -1,这是由于在mysql中含有空值的列很难进行查询优化,null值会使索引以及索引的统计信息变得很复杂。
*通常使用特殊的数据进行占位,如:int not null default 0,String not null default ‘’,但是会产生歧义,如果数据恰好是一个空字符串,就会和默认值空字符串一样,如果数据恰好是0的话也是一样的,尽量使用不会出现在常规业务逻辑行中的数据作为默认,表示null数据,如用:int not null default -1,如年龄的话,可能有0,所以不用0来表示默认,而用-1,因为年龄不会出现-1。
*应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:select id from t where num is null, 可以在num上设置默认值-1,确保表中num列没有null值,然后这样查询:select id from t where num=-1
*尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,可以使用union all.如果使用Or,则要保证两边的条件都有索引可以用。如:select id from t where num=10 or num=20,可以这样查询:
select id from t where num=10 union all select id from t where num=20
*in 和 not in 也要慎用,否则会导致全表扫描,如:select id from t where num in(1,2,3);
状态值即使在字段上增加了索引,往往索引不能起作用,如:gender 0,1,2表示男、女、保密,select * from student where gender in (1,2)。故状态值一般不使用索引,因为使用状态值时会导致一个状态值同时能够匹配到大量的记录;对于大量的记录,mysql有时会认为使用索引的开销比全表扫描还要大,从而主动放弃索引。即当你的条件容易匹配大量数据时,索引不一定能用得上。 对于连续的数值,能用 between 就不要用 in 了
*Like查询不能以通配符开头,如:user like ‘马%’,否则索引不会被使用。字符串比较时,不能使用包含逻辑,如:subject like ‘%PHP%’,因为这将导致全表扫描,效率太低了,若要提高效率,可以考虑全文检索。Mysql中全文索引不支持中文,用第三方提供的全文索引。
3、分组查询
语法:group by 分组字段
注意:分组之后查询的字段,要么是分组字段,要么是聚合函数,不能写其他字段,因为写其他字段没有任何意义,我们现在把男生或女生当成一个整体看,故不应该出现个人的信息,而应该是整体的共性内容。
分组之前的条件用where,分组之后的条件用having。
Where和having的区别:
1、 where在分组之前进行限定,如果不满足条件,则不参与分组。Having是在分组之后进行限定,如果不满足结果就不会被查询出来。
2、 where后不可以进行聚合函数的判断,而having可以进行聚合函数的判断。我们可以给聚合函数取别名,having后进行判断时使用别名进行判断。
4、排序查询
语法:order by 排序字段1 排序方式1,排序字段2 排序方式2…
经常作为查询条件在where或order by 语句中出现的列要建立索引。
当使用两个排序条件时,只要当第一排序条件一样时,才会使用第二排序条件。每一个排序条件都可以指定不同的排序方式。
5、分页查询
语法:limit 开始的索引 每页查询的条数
分页查询:limit 起始值从 0 开始, 长度

第一个参数注意是开始的索引,不是当前页。
开始的索引 = (当前页码-1)*每页显示的条数
limit是一个“方言”,limit关键字只能在mysql中使用。
LIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数。LIMIT 接受一个或两个数字参数。
SELECT * FROM table LIMIT 5,10; // 检索记录行 6-15
如果只给定一个参数,它表示返回最大的记录行数目,换句话说,LIMIT n 等价于 LIMIT 0,n。
mysql> SELECT * FROM table LIMIT 5; //检索前 5 个记录行
DQL:data query language用来查询数据库表中的数据的更多相关文章
- SQL语句的使用,SELECT - 从数据库表中获取数据 UPDATE - 更新数据库表中的数据 DELETE - 从数据库表中删除数据 INSERT INTO - 向数据库表中插入数据
SQL DML 和 DDL 可以把 SQL 分为两个部分:数据操作语言 (DML) 和 数据定义语言 (DDL). SQL (结构化查询语言)是用于执行查询的语法. 但是 SQL 语言也包含用于更新. ...
- EF Core中,通过实体类向SQL Server数据库表中插入数据后,实体对象是如何得到数据库表中的默认值的
我们使用EF Core的实体类向SQL Server数据库表中插入数据后,如果数据库表中有自增列或默认值列,那么EF Core的实体对象也会返回插入到数据库表中的默认值. 下面我们通过例子来展示,EF ...
- MySQL 两个数据库表中合并数据
两个数据库表中合并数据 如果有 t1 和 t2 两个数据库表格,它们两个对应的字段是相同的.如何将 t2 的数据插入到t1中去呢? insert into t1 select * from t2 ...
- 针对Oracle数据库表中的数据的常见操作
1.查询表中所有数据 select * from 表名; 例:select * from stu; 2.查询的同时修改表中数据 select * from 表名 for update; 例:sele ...
- sql查询数据库表中重复记录方法
1.查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断 代码如下: select * from people where peopleId in (select peopleId ...
- 在 SQL Server 中查询EXCEL 表中的数据遇到的各种问题
SELECT * FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0','Data Source="D:\KK.xls";User ID=A ...
- 在PHP中遍历数据库表中的数据
数据库中的数据: //1.分别将每一行的每一列遍历出来 //mysql_fetch_row()函数在每一次遍历后会将指针向后自动移动一个单位 while($row=mysql_fetch_row($r ...
- 【Sqlserver】修改数据库表中的数据:对缺失的数据根据已有的数据进行修补
1 --查询时间范围内的数据 select * from dbo.point where wtime >'2014-05-01 23:59:59' and wtime< '2014-05- ...
- 在向"带有自增字段的数据库表"中插入数据时,自定义"该自增字段"的数据
在设计数据库表的时候,经常会使用自增主键或其他自增字段.比如: DB_UserGroups表中GroupID为该表主键,并为自增字段. 但在将某字段设置自增后,想在插入数据时,人为指定自增字段的数据内 ...
随机推荐
- 文本处理三剑客简介(grep、awk、sed)
本章内容: 命令 描述 awk 支持所有的正则表达式 sed 默认不支持扩展表达式,加-r 选项开启 ERE,如果不加-r 使用花括号要加转义符\{\} grep 默认不支持扩展表达式,加-E 选项开 ...
- Linux系统磁盘管理(lvm逻辑卷管理)
linux系统用户常遇到的一个问题就是如何精准的评估分区的大小,已分配合适的磁盘空间:普通的磁盘分区管理方式在逻辑分区划分好之后就无法改变其大小,当一个逻辑分区存放不下某个文件时,这个文件因为受上层文 ...
- (3)UNIX/Linux系统结构
UNIX/Linux 系统可以粗糙地抽象为 3 个层次,如图所示.底层是 UNIX/Linux 操作系统,即系统内核(Kernel):中间层是Shell层,即命令解释层:高层则是应用层. 1) 内核层 ...
- php之在admin的目录下的php文件里加上JSON的报头,运行php文件会提示下载
去掉报头就正常,但在前端引用数据时要加上JSON.parse,不然读不出数据. $.get("fetchUpLast.php",{ rd:new Date().getTime()} ...
- nginx反向代理signalr
asp.net core应用常常要通过nginx来反向代理, 普通的web api配置asp.net core反向代理比较常见, 如果在应用中集成了signalr, 如何使用nginx来反代呢? ng ...
- jmespath(1)基础语法
前言 JMESPath是JSON的查询语言.您可以从JSON文档中提取和转换元素 官方文档:https://jmespath.org/tutorial.html 基本表达式 JMESPath用的最多的 ...
- 2019牛客暑期多校训练营(第三场)G.Removing Stones(ST+分治)
题意:给你n堆石子 每堆有ai个 现在问你有多少个连续的区间保证最大值小于等于该区间和的两倍 思路:我们可以考虑每个区间的分割点 总是该区间的最大值 所以我们只要ST找到该区间的最大值 然后每次都枚举 ...
- zjnu1730 PIRAMIDA(字符串,模拟)
Description Sample Input 6 JANJETINA 5 1 J 1 A 6 N 6 I 5 E Sample Output 1 0 2 1 1 题意:给你一个长度小于等于10^6 ...
- Kuroni and the Punishment CodeForces - 1305F 随机函数mt19937 + 质因子分解
题意: 给你n个数,你每次操作可以对一个数加1或者减1,让你求你最少需要操作多少次可以使这n个数的公因子大于1 题解: 正常方法就是枚举质因子(假设质因子为x),然后对于这个数组中的数a[i],让a[ ...
- Eclipse无法打开提示could not open jvm.cfg错误
先言:我的问题只是出在之前我的java_jdk原来安装在F:\Temp这里,但是我之后在整理文件的时候把这个文件夹改成了F:\java_jdk.所以导致了错误的出现 解决方法1: 因为我的只是目录名称 ...