SQL检索数据

如何检索数据

SELECT 从一个或多个表中检索需要的数据行 
INSERT 插入
DELETE 删除
UPDATE 更新

使用别名方便检索

SELECT name AS n,attack AS a FROM person
对原有名称进行简化,让SQL语句看起来简单,包括表名的别名,常用于多表连接查询

查询常数

SELECT查询结果中,增加一个固定的常数列,而不是从数据表中动态取出的。整合不同的数据源,用常数列作为这个表的标记,就需要查询常数。
单引号说明引号中的字符是常数,否则SQL会把王者荣耀当成列名进行查询。
SELECT '常数列' as platform,name FROM taA;
SELECT 'ABCDE' as platform,name FROM taA;
SELECT 123456 as platform,name FROM taA;

去除重复行

从结果中去掉重复的行 DISTINCT
DISTINCT 需要放到所有列名的最前面
DISTINCT 对后面所有的列名的组合进行去重,给谁去重就仅仅搜索谁就好了
SELECT DISTINCT name FROM taA;

排序检索数据

有时候需要按照某种进行结果的返回,使用ORDER BY字句处理
列名的排序 ORDER BY后面可以是一个或多个列名,如果是多个列名,先按照第一列排序,第一列值相同,使用第二列进行排序。

排序的顺序 ORDER BY后面可以注明排序规则,ASC递增,DESC递减。默认是ASC,如果排序字段类型为文本数据,参考数据库设置方式,MySQL 在创建字段的时候设置为 BINARY 属性,就代表区分大小写

非选择列排序,ORDER BY可以使用非选择列进行排序,SELECT后面没有这个列名,同样可以放到ORDER BY后面排序

ORDER BY位置 通常位于SELECT语句的最后一条字句,否则会报错

约束返回结果的数量

LIMIT 约束返回结果的数量
只返回五条记录
MySQL/PostgreSQL/MariaDB/SQLite/
SELECT name FROM taA ORDER BY id DESC LIMIT 5
SQL Server/Access
SELECT TOP 5 name FROM taA ORDER BY id DESC
DB2
SELECT name FROM taA ORDER BY id DESC FETCH FIRST 5 ROW ONLY
Oracle
SELECT name FROM taA WHERE ROWNUM <= 5 ORDER BY id hp_max id DESC

约束返回结果的数量可以减少数据表的网络传输量,也可以提升查询效率。如果我们知道返回结果只有一条,,就可以使用LIMIT 1,告诉SELECT语句只需要返回一条记录。这样的好处就是SELECT不需要扫描完整的表,只需要检索到1条符合条件的记录即可返回。

SELECT的执行顺序

查询RDBMS中最频繁的操作,我们在理解SELECT语法的时候,还需要了解SELECT执行时的底层原理。

执行顺序=底层运行原理
1.关键字的顺序是不能颠倒的:
SELECT...FROM...WHERE...GROUP BY...HAVING...ORDER BY...
2.SELECT语句的执行顺序
FROM>WHERE>GROUP BY>HAVING>SELECT的字段>DISTINCT>ORDER BY>LIMIT
3.关键字顺序和执行顺序
SELECT DISTINCT id,count(*) as num #5
FROM taA JOIN team ON a.id=b.id #1
WHERE height > 1.80 #2
GROUP BY a.id #3
HAVING num > 2 #4
ORDER BY num DESC #6
LIMIT 2 #7
在SELECT语句执行的时候,每一步都会产生一个虚拟表,然后将这个虚拟表传入下一个步骤作为输入。需要注意的是,这些步骤含在SQL的执行过程中,对于开发者来说是不可见的。 
1.SELECT是先执行FROM这一步的,如果是多张表联查,会出现以下步骤

	首先先通过 CROSS JOIN 求笛卡尔积,相当于得到虚拟表 vt(virtual table)1-1;
	通过 ON 进行筛选,在虚拟表 vt1-1 的基础上进行筛选,得到虚拟表 vt1-2;
	添加外部行。如果我们使用的是左连接、右链接或者全连接,就会涉及到外部行,也就是在虚拟表 vt1-2 的基础上增加外部行,得到虚拟表 vt1-3。
	处理是两张以上的表,还会重复上面的步骤,直到所有表都被处理完为止。这个过程得到是我们的原始数据
	查询数据表的原始数据也就是最终的虚拟表 vt1,就可以在此基础上再进行 WHERE 阶段。在这个阶段中,会根据 vt1 表的结果进行筛选过滤,得到虚拟表 vt2
	第三步和第四步,也就是 GROUP 和 HAVING 阶段。在这个阶段中,实际上是在虚拟表 vt2 的基础上进行分组和分组过滤,得到中间的虚拟表 vt3 和 vt4。
	筛选表中提取的字段,也就是进入到 SELECT 和 DISTINCT 阶段
	在 SELECT 阶段会提取想要的字段,然后在 DISTINCT 阶段过滤掉重复的行,分别得到中间的虚拟表 vt5-1 和 vt5-2
	提取了想要的字段数据之后,就可以按照指定的字段进行排序,也就是 ORDER BY 阶段,得到虚拟表 vt6
	取出指定行的记录,也就是 LIMIT 阶段,得到最终的结果,对应的是虚拟表 vt7

请添加图片描述

SELECT*使用条件,如何提升SELECT查询效率

	不需要把所有列都检索出来,先指定出所需的列名,因为写清列名,可以减少数据表查询的网络传输量.
	生产环境下,不推荐直接使用SELECT *进行查询。

对COUNT()效率得考虑

SELECT COUNT(*) > SELECT COUNT(1) > SELECT COUNT(具体字段)

	InnoDB *和1没有区别,复杂度都是O(N),全表扫描,进行循环+计数得方式统计。尽量使用二级索引,非聚簇索引
	MyISAM 数据表都有一个meta信息存储了row_count值,由一致性表级锁保证。InnoDB支持事务,采用行级锁和MVCC机制,必须使用上文得技术。
	如果要统计COUNT(*),尽量在数据表上建立二级索引,系统会自动采用key_len小的二级索引进行扫描,这样当我们使用SELECT COUNT(*)的时候效率就会提升,有时候提升几倍甚至更高都是有可能的。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值