首页 > 数据库 >SQL基础总结(三):从表中检索数据

SQL基础总结(三):从表中检索数据

时间:2023-09-14 14:08:18浏览次数:40  
标签:检索 LIKE 从表中 SQL 空值 子句 排序 WHERE ORDER


本系列blog源自前年写的SQL学习笔记,汇总一下发上来。

---------------------------------------------------------------

使用DISTINCT消除重复的行。

虽然空值是未知的,但彼此绝不相等,但DISTINCT认为空值是彼此相等的。

对于DISTINCT操作,DBMS执行内部排序去识别并消除重复的行。排序是需要大量计算开销的,除非不得不用,否则不要使用DISTINCT。

行首先按sortcolumn1排序,然后对sortcolumn1中值相等的行再按sortcolumn2排序。

可以按字符串特定的部分对结果排序:ORDER BY substr(phone,length(phone)-1);

允许在ORDER BY中指定列的相对位置编号而不是列名。位置编号引用的是结果的列,而不是原始表中的列。

 

由DBMS决定空值是大于还是小于所有非空值。

 

影响排序速度的3个因素:

<!--[if !supportLists]-->1.  <!--[endif]-->选择的行的数量。

<!--[if !supportLists]-->2.  <!--[endif]-->ORDER BY 子句中列的数量。

<!--[if !supportLists]-->3.  <!--[endif]-->ORDER BY 子句中列数据类型的长度。

 

可以在ORDER BY中用列的别名替代列名。

ORDER BY列不能在结果中唯一标示每一行,有重复值的行将以任意顺序列出。

对ORDER BY子句增加CASE子句,可支持逻辑条件排序。

可以为经常排序的列创建索引。

 

空值表示未知,不和任何内容值匹配。

一般而言,最快的比较是相等,然后是不相等(>,<,>=,<=),最慢的是不等于。

不能在WHERE子句中使用COUNT、SUM这样的聚集函数。

 

在SELECT中定义的列别名,不能在WHERE子句中引用它。可以改成使用在WHERE子句之前计算的FROM子句的子查询:

SELECT * FROM (SELECT SALES AS SOLD FROM TITLES) ta WHERE SOLD>1000;

 

AND、OR、NOT是逻辑操作符。逻辑操作符,即布尔操作符,被设计为处理真值:真、假、未知。

NOT不能连接两个条件,而是否定一个条件。

将NOT放在列名表达式之前:WHERE NOT state=’RUN’ 等价于WHERE state <> ’RUN’。

 

查询条件只包含AND操作符,首先放置为真可能性最小的条件,查询将会变快。因为DBMS优化器是从左到右读取WHERE子句的(大多数情况)。Oracle基于开销的优化器从右到左读取。

 

某些DBMS支持异或逻辑操作符,当且仅当一个操作数为真时结果为真。

 

LIKE只对字符串起作用,对数字、日期不起作用。

NOT LIKE用于否定LIKE。

操作符%:匹配0个或多个字符。

操作符_:下划线匹配任意一个字符。

按照字面量方式查找%或_:使用转义符!

如:’100!%’  查找的字符串为100%。

 

通配符查找很耗时,特别是使用以%开头的模式。

在模式不包含通配符的情况下,LIKE像=一样比较,NOT LIKE像<>一样比较。=通常比LIKE快。

 

BETWEEN适用于字符串、数字、日期。BETWEEN语句可以用AND语句改写。

NOT BETWEEN否定BETWEEN条件。

 

用IN确定给定值是否匹配指定列表。

IN可以处理字符串、数字、日期。

 

NOT IN用于否定IN。

IN通常要比多个OR运行的快。为了加快速度,首先列出最可能的值。空值表示缺失或者未知的值。LIKE、BETWEEN、IN和其它WHERE子句条件不能发现空值。

 

IS NULL可以应用于任意数据类型的列。

用IS NOT NULL否定IS NULL。

 

如果包含空值的列是WHERE条件中的列,空值行将被排除在结果之外。因为空值不能和任何值比较。

标签:检索,LIKE,从表中,SQL,空值,子句,排序,WHERE,ORDER
From: https://blog.51cto.com/u_6978506/7469655

相关文章

  • mysql事务回滚
    前几天发现程序有个Bug:使用JPA已经设置了回滚,但抛出异常后,提交的事务并没有回滚。刚开始以为是JPA使用问题,debug了近2个多小时竟然找不到原因。后来上网查了一下,才发现不是程序问题(坑爹啊,看来自己对mysql还是不熟),是数据库表问题(JPA自动建表)。原因如下:mysql建表时如果指定ENG......
  • SQL基础总结(四):操作符和函数
    本系列blog源自前年写的SQL学习笔记,汇总一下发上来。(1月份发了前三篇笔记,原以为后面的笔记误操作删了,今天在硬盘里又找到了,一起发上来)--------------------------------派生列是一个计算结果。派生列不会成为表中的永久列,他们用于显示或者报表目的。 包含空值的任何算数运算的......
  • SQL基础总结(六):联结
    本系列blog源自前年写的SQL学习笔记,汇总一下发上来。(1月份发了前三篇笔记,原以为后面的笔记误操作删了,今天在硬盘里又找到了,一起发上来)--------------------------------限定名称是一个表名后跟一个点号和表中的列名。限定名称可以在整个数据库中唯一的标识出某个列。如:table.colu......
  • SQL基础总结(七):子查询
    本系列blog源自前年写的SQL学习笔记,汇总一下发上来。(1月份发了前三篇笔记,原以为后面的笔记误操作删了,今天在硬盘里又找到了,一起发上来)--------------------------------不要在子查询中使用ORDERBY子句,子查询返回的中间结果是看不到的,对子查询排序没有意义。子查询是单个SELECT......
  • SQL基础总结(五):汇总和分组数据
    本系列blog源自前年写的SQL学习笔记,汇总一下发上来。(1月份发了前三篇笔记,原以为后面的笔记误操作删了,今天在硬盘里又找到了,一起发上来)-------------------------只对单个值进行操作的是标量函数。对一组值进行操作以产生一个汇总值的是SQL聚合函数或集合函数。可以对行的集合进行......
  • SQL基础总结(十一):视图
      本系列blog源自前年写的SQL学习笔记,汇总一下发上来。(1月份发了前三篇笔记,原以为后面的笔记误操作删了,今天在硬盘里又找到了,一起发上来)--------------------------------除了ORDERBY子句通常是被禁止的,几乎所有有效的SELECT语句都可以定义视图。可以嵌套视图,视图的SELECT语句......
  • SQL基础总结(九):插入更新删除行及创建更新删除表
    本系列blog源自前年写的SQL学习笔记,汇总一下发上来。(1月份发了前三篇笔记,原以为后面的笔记误操作删了,今天在硬盘里又找到了,一起发上来)--------------------------------插入更新删除行 使用INSERT插入行INSERTINTOtableVALUES(value1,value2,value3…);INSERTINTOtable(col......
  • SQL基础总结(八):集合操作
    本系列blog源自前年写的SQL学习笔记,汇总一下发上来。(1月份发了前三篇笔记,原以为后面的笔记误操作删了,今天在硬盘里又找到了,一起发上来)--------------------------------使用UNION合并行UNION操作将两个查询返回的结果合并成一个结果。UNION从结果中去掉重复的行,UNIONALL不去掉重......
  • SQL基础总结(十):索引
      本系列blog源自前年写的SQL学习笔记,汇总一下发上来。(1月份发了前三篇笔记,原以为后面的笔记误操作删了,今天在硬盘里又找到了,一起发上来)--------------------------------对于以下列创建索引是恰当的,这些列经常被:查询、排序、分组、联结、用来计算顺序统计(MIN、MAX或中值)。对于......
  • MySQL篇:bug2_ Navicate无法添加或更新子行-外键约束失败
    问题产生原因Mysql中如果表和表之间建立的外键约束,则无法删除表及修改表结构。解决办法解决方法是在Mysql中取消外键约束:SETFOREIGN_KEY_CHECKS=0;再添加值,然后再设置外键约束:SETFOREIGN_KEY_CHECKS=1;查看当前FOREIGN_KEY_CHECKS的值可用如下命令:SELECT@@FOR......