热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

数据库的检索语句

1、SELECT基本用法1.1简单的数据检索1.1.1检索出需要的列只要执行SELECT*FROM名即可。SELECT*FROMT_Employee。SELECT*FROMT_Employee语句会把数据库的所有列的信息从数据库中读出来,缓存到内存中。检索出所有的列的SQL语句为SELECT*FROM

1、SELECT 基本用法 1.1简单的数据检索 1.1.1检索出需要的列 只要执行SELECT * FROM 名即可。SELECT * FROM T_Employee 。SELECT * FROM T_Employee语句会把数据库的所有列的信息从数据库中读出来,缓存到内存中。检索出所有的列的 SQL 语句为SELECT * FROM

1、SELECT 基本用法

1.1简单的数据检索

1.1.1检索出需要的列

只要执行“SELECT * FROM 名”即可。SELECT * FROM T_Employee 。SELECT * FROM T_Employee语句会把数据库的所有列的信息从数据库中读出来,缓存到内存中。检索出所有的列的 SQL 语句为“SELECT * FROM T_Employee” ,其中的星号“*”就意味着“所有列” ,那么我们只要将星号 “*”替换成我们要检索的列名就可以了。如SELECT FNumber FROM T_Employee 。只要在 SELECT 语句后列出各个列的列名就可以了,需要注意的就是各个列之间要用半角的逗号“,”分隔开。比如我们执行下面的 SQL 语句:SELECT FName,FAge FROM T_Employee 。

1.1.2列别名

别名的定义格式为 “列名 AS 别名” , 比如我们要为 FNumber 字段取别名为 Number14
,FName 字段取别名为 Name、FAge 字段取别名为 Age、为 FSalary字段取别名为 Salary,那么编写下面的 SQL 即可:SELECT FNumber AS Number1,FName AS Name,FAge AS Age,FSalary AS Salary FROM
T_Employee 。定义别名的时候“AS”不是必须的,是可以省略的,比如下面的 SQL 也是正确的:
SELECT FNumber Number1,FName Name,FAge Age,FSalary Salary FROM T_Employee 。

1.1.3按条件过滤

由于将表中所有的数据都从数据库中检索出来,所以会有非常大的内存消耗以及网络资源消耗。 需要逐条检索每条数据是否符合过滤条件,所以检索速度非常慢,当数据量大的时候这种速度是让人无法忍受的。无法实现复杂的过滤条件。SELECT FName FROM T_Employee WHERE FSalary<5000 。SELECT * FROM T_Employee WHERE FSalary<5000 OR FAge>25 。使用 WHERE 子句只需指定过滤条件就可以,我们无需关心数据库系统是如果进行查找的,数据库会采用适当的优化算法进行查询,大大降低了 CPU 资源的占用。

SQL 标准中规定了下面几种聚合函数:

\

这几个聚合函数都有一个参数,这个参数表示要统计的字段名。 第一个例子是查询年龄大于 25 岁的员工的最高工资,执行下面的 SQL:
SELECT MAX(FSalary) FROM T_Employee WHERE FAge>25 。

为了方面的引用查询的结果, 也可以为聚合函数的计算结果指定一个别名, 执行下面的 SQL:

SELECT MAX(FSalary) as MAX_SALARY FROM T_Employee WHERE FAge>25 。

SELECT AVG(FAge) FROM T_Employee WHERE FSalary>3800 。

SELECT SUM(FSalary) FROM T_Employee 。

SELECT MIN(FSalary),MAX(FSalary) FROM T_Employee 。

最后一个介绍的函数就是统计记录数量的 COUNT,这个函数有一特别,因为它的即可以像其他聚合函数一样使用字段名做参数, 也可以使用星号 “*” 做为参数。 我们执行下面的 SQL:
SELECT COUNT(*),COUNT(FNumber) FROM T_Employee 。

COUNT(*)统计的是结果集的总条数,而COUNT(FName)统计的则是除了结果集中 FName 不为空值(也就是不等于 NULL)的记录的总条数。

1.1.4排序

SELECT 语句允许使用 ORDER BY 子句来执行结果集的排序方式。ORDER BY 子句位于 SELECT 语句的末尾,它允许指定按照一个列或者多个列进行排序,还可以指定排序方式是升序(从小到大排列)还是降序(从大到小排列)。比如下面的 SQL 语句演示了按照年龄排序所有员工信息的列表:
SELECT * FROM T_EmployeeORDER BY FAge ASC 。

ASC 代表升序,升序是默认的排序方式。SELECT * FROM T_Employee ORDER BY FAge 。

如果需要按照降序排列,那么只要将 ASC 替换为 DESC 即可,其中 DESC 代表降序。执行下面的 SQL 语句:SELECT * FROM T_Employee ORDER BY FAge DESC 。

因为 ORDER BY语句允许指定多个排序列,各个列之间使用逗号隔开即可。执行下面的 SQL 语句:
SELECT * FROM T_Employee ORDER BY FAge DESC,FSalary DESC 。 可以看到年龄相同的记录按照工资从高到低的顺序排列了。对于多个排序规则,数据库系统会按照优先级进行处理。数据库系统首先按照第一个排序规则进行排序; 如果按照第一个排序规则无法区分两条记录的顺序, 则按照第二个排序规则进行排序; 如果按照第二个排序规则无法区分两条记录的顺序, 则按照第三个排序规则进行排序; ……以此类推。ORDER BY 子句完全可以与 WHERE 子句一起使用,唯一需要注意的就是 ORDER BY 子句要放到 WHERE 子句之后,不能颠倒它们的顺序。SELECT * FROM T_Employee WHERE FAge>23 ORDER BY FAge DESC,FSalary DESC 。

1.2高级过滤功能

高级数据过滤技巧几乎同样适用于 Update 语句和 Delete 语句中的Where 子句。

1.2.1通配符过滤

SQL 中的通配符过滤使用 LIKE 关键字,是一个二元操作符, 左表达式为待匹配的字段, 而右表达式为待匹配的通配符表达式。

1.2.1.1单字符匹配

“b_d” 匹配第一个字符为 b、第二个字符为任意字符、第三个字符为 d 的字符串。通配符表达式“_oo_”匹配第一个字符为任意字符、第二个字符为 o、第三个字符为 o、第四个字符为任意字符的字符串。

SELECT * FROM T_Employee WHERE FName LIKE &#39;_erry&#39; 。

SELECT * FROM T_Employee WHERE FName LIKE &#39;__n_&#39; 。

1.2.1.2多字符匹配

进行多字符匹配的通配符为半角百分号“%” ,它匹配任意次数(零或多个)出现的任意字符。比如通配符表达式“k%”匹配以“k”开头、任意长度的字符串。SELECT * FROM T_Employee WHERE FName LIKE &#39;T%&#39; 。

SELECT * FROM T_Employee WHERE FName LIKE &#39;%n%&#39;。

字符匹配和多字符匹配还可以一起使用。SELECT * FROM T_Employee WHERE FName LIKE &#39;%n_&#39; 。

1.2.2空值检测

没有添加非空约束列是可以为空值的(也就是 NULL)。待检测字段名IS NULL”,比如要查询所有姓名未知的员工信息,则运行下面的SQL语句:SELECT * FROM T_Employee WHERE FNAME IS NULL 。

如果要检测“字段不为空”,则要使用IS NOT NULL,使用方法为“待检测字段名IS NOT NULL”,比如要查询所有姓名已知的员工信息,则运行下面的SQL语句:SELECT * FROM T_Employee WHERE FNAME IS NOT NULL 。

SELECT * FROM T_Employee WHERE FNAME IS NOT NULL AND FSalary<5000。

1.2.3反义运算符

同时SQL提供了通用的表示 “不等于” 的运算符 “<>” , 这样 “不等于”、“不大于”和“不小于”就分别可以表示成“<>”、“<=”和“>=”。检索所有年龄不等于22岁并且工资不小于2000元”,我们可以编写下面的SQL语
句:SELECT * FROM T_Employee WHERE FAge<>22 AND FSALARY>=2000 。

因此要完成下面的功能“检索所有年龄不等于22岁并且工资不小于2000元”,我们可以编写下面的SQL语句:
SELECT * FROM T_Employee WHERE NOT(FAge=22) AND NOT(FSALARY<2000) 。

1.2.4多值检测

可以使用OR语句来连接多个等于判断。SQL语句如下:SELECT FAge,FNumber,FName FROM T_EmployeeWHERE FAge=23 OR FAge=25 OR FAge=28 。

SELECT FAge,FNumber,FName FROM T_Employee WHERE FAge IN(23,25,28) 。

1.2.5范围检测

检索所有年龄介于23岁到27岁之间的员工信息” ,可以使用下面的SQL语
句:SELECT * FROM T_Employee WHERE FAGE>=23 AND FAGE <=27 。SQL提供了一个专门用语范围值检
测的语句“BETTWEEN AND”,它可以用来检测一个值是否处于某个范围中(包括范围的边界值,也就是闭区间)。使用方法如下“字段名 BETTWEEN 左范围值 AND 右范围值”。SELECT * FROM T_Employee
WHERE FAGE BETWEEN 23 AND 27 。

检索所有工资介于2000元到3000元之间以及5000元到8000元的员工信息” ,可以使用下面的SQL语句:
SELECT * FROM T_Employee WHERE (FSalary BETWEEN 2000 AND 3000)OR (FSalary BETWEEN 5000 AND 8000) 。

数据库系统对“BETTWEEN AND”进行了查询优化,使用它进行范围值检测将会得到比其他方式更好的性能,因此在进行范围值检测的时候应该优先使用“BETTWEEN AND”。需要注意的就是“BETTWEEN AND”在进行检测的时候是包括了范围的边界值的(也就是闭区间),如果需要进行开区间或者半开半闭区间的范围值检测的话就必须使用其他的解决方案了。

1.2.6低效的where 1=1

因为使用添加了 “1=1”的过滤条件以后数据库系统就无法使用索引等查询优化策略,数据库系统将会被迫对每行数据进行扫描 (也就是全表扫描) 以比较此行是否满足过滤条件, 当表中数据量比较大的时候查询速度会非常慢。 因此如果数据检索对性能有比较高的要求就不要使用这种 “简便” 的方式。

1.3数据分组

SQL语句中使用GROUP BY子句进行分组,使用方式为“GROUP BY 分组字段”。分组语句必须和聚合函数一
起使用,GROUP BY子句负责将数据分成逻辑组,而聚合函数则对每一个组进行统计计算。

SELECT FAge FROM T_Employee GROUP BY FAge。 GROUP BY子句将检索结果划分为多个组,每个组是所有记录的一个子集。GROUP BY子句必须放到SELECT语句的之后,如果SELECT语句有WHERE子句,则GROUPBY子句必须放到WHERE语句的之后。

SELECT FAge FROM T_Employee WHERE FSubCompany = &#39;Beijing&#39;GROUP BY FAge 需要分组的所有列都必须位于GROUP BY子句的列名列表中,也就是没有出现在GROUP BY子句中的列(聚合函数除外)是不能放到SELECT语句后的列名列表中的。

SELECT FAge,AVG(FSalary) FROM T_Employee GROUP BY FAge 。GROUP BY子句中可以指定多个列,只需要将多个列的列名用逗号隔开即可。指定多个分组规则以后, 数据库系统将按照定义的分组顺序来对数据进行逐层分组, 首先按照第一个分组列进行分组,然后在每个小组内按照第二个分组列进行再次分组……逐层分组,从而实现“组中组”的效果, 而查询的结果集是以最末一级分组来进行输出的。

SELECT FSubCompany,FDepartment FROM T_Employee GROUP BY FSubCompany,FDepartment 。

SELECT FAge,COUNT(*) AS CountOfThisAge FROM T_Employee GROUP BY FAge 。

SELECT FSubCompany,FAge,COUNT(*) AS CountOfThisSubCompAge FROM T_Employee GROUP BY FSubCompany,FAge 。

SELECT FSubCompany,FAge,COUNT(*) AS CountOfThisSubCompAge FROM T_Employee GROUP BY FSubCompany,FAge ORDER BY FSubCompany 。

“COUNT(*)”对每一个分组统计总数,这样就可以统计出每个公司每个年龄段的员工的人数了。SUM、AVG、MIN、MAX也可以在分组中使用。比如下面的SQL可以统计每个公司中的工资
的总值:SELECT FSubCompany,SUM(FSalary) AS FSalarySUM FROM T_Employee GROUP BY FSubCompany 。

1.3.1having子句

有的时候需要对部分分组进行过滤,可以在数据库系统中执行下面的SQL的时候, 数据库系统会提示语法错误, 这是因为聚合函数不能在WHERE语句中使用,必须使用HAVING子句来代替,比如:SELECT FAge,COUNT(*) AS CountOfThisAge FROM T_Employee GROUP BY FAge HAVING COUNT(*)>1 。

HAVING语句中也可以像WHERE语句一样使用复杂的过滤条件,比如下面的SQL用来检索人数为1个或者3个的年龄段,可以使用下面的SQL:SELECT FAge,COUNT(*) AS CountOfThisAge FROM T_Employee
GROUP BY FAge HAVING COUNT(*)=1 OR COUNT(*)=3 。

MYSQL中提供了LIMIT关键字用来限制返回的结果集, LIMIT放在SELECT语句的最后位置,语法为 “LIMIT 首行行号,要返回的结果集的最大数目” 。比如下面的SQL语句将返回按照工资降序排列的从第二行开始(行号从0开始)的最多五条记录:SELECT * FROM T_Employee ORDER BY FSalary DESC LIMIT 2,5 。

DISTINCT关键字是用来进行重复数据抑制的最简单的功能,而且所有的数据库系统都支持DISTINCT,DISTINCT的使用也非常简单,只要在SELECT之后增加DISTINCT即可。 DISTINCT是对整个结果集进行数据重复抑制的, 而不是针对每一个列, 执行下面的SQL语句:SELECT DISTINCT FDepartment,FSubCompany FROM T_Employee 。DISTINCT是对整个结果集进行数据重复抑制的。

联合结果集
有的时候我们需要组合两个完全不同的查询结果集, 而这两个查询结果之间没有必然的联系,只是我们需要将他们显示在一个结果集中而已。在SQL中可以使用UNION运算符来将两个或者多个查询结果集联合为一个结果集中。

只要用UNION操作符连接这两个查询语句就可以将两个查询结果集联合为一个结果集,
SQL语句如下:
SELECT FNumber ,FName,FAge FROM T_Employee
UNION
SELECT FIdCardNumber ,FName,FAge FROM T_T empEmpl oyee 。

联合结果集的原则
联合结果集不必受被联合的多个结果集之间的关系限制,不过使用UNION仍然有两个基本的原则需要遵守:一是每个结果集必须有相同的列数; 二是每个结果集的列必须类型相容。


推荐阅读
  • 本文介绍了Paxos的世界中关于复制日志与状态机的概念和重要性。通过存储日志来实现数据的持久化,并通过日志流来记录数据的变化,而不是直接持久化数据本身。这样做的好处是简化了持久化存储的操作,并且方便多机之间的数据同步。 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 推荐一个ASP的内容管理框架(ASP Nuke)的优势和适用场景
    本文推荐了一个ASP的内容管理框架ASP Nuke,并介绍了其主要功能和特点。ASP Nuke支持文章新闻管理、投票、论坛等主要内容,并可以自定义模块。最新版本为0.8,虽然目前仍处于Alpha状态,但作者表示会继续更新完善。文章还分析了使用ASP的原因,包括ASP相对较小、易于部署和较简单等优势,适用于建立门户、网站的组织和小公司等场景。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了如何在MySQL中将零值替换为先前的非零值的方法,包括使用内联查询和更新查询。同时还提供了选择正确值的方法。 ... [详细]
  • 在数据分析工作中,我们通常会遇到这样的问题,一个业务部门由若干业务组构成,需要筛选出每个业务组里业绩前N名的业务员。这其实是一个分组排序的 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Oracle Database 10g许可授予信息及高级功能详解
    本文介绍了Oracle Database 10g许可授予信息及其中的高级功能,包括数据库优化数据包、SQL访问指导、SQL优化指导、SQL优化集和重组对象。同时提供了详细说明,指导用户在Oracle Database 10g中如何使用这些功能。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文详细介绍了MysqlDump和mysqldump进行全库备份的相关知识,包括备份命令的使用方法、my.cnf配置文件的设置、binlog日志的位置指定、增量恢复的方式以及适用于innodb引擎和myisam引擎的备份方法。对于需要进行数据库备份的用户来说,本文提供了一些有价值的参考内容。 ... [详细]
  • 本文由编程笔记小编整理,介绍了PHP中的MySQL函数库及其常用函数,包括mysql_connect、mysql_error、mysql_select_db、mysql_query、mysql_affected_row、mysql_close等。希望对读者有一定的参考价值。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 安装mysqlclient失败解决办法
    本文介绍了在MAC系统中,使用django使用mysql数据库报错的解决办法。通过源码安装mysqlclient或将mysql_config添加到系统环境变量中,可以解决安装mysqlclient失败的问题。同时,还介绍了查看mysql安装路径和使配置文件生效的方法。 ... [详细]
  • 本文介绍了PhysioNet网站提供的生理信号处理工具箱WFDB Toolbox for Matlab的安装和使用方法。通过下载并添加到Matlab路径中或直接在Matlab中输入相关内容,即可完成安装。该工具箱提供了一系列函数,可以方便地处理生理信号数据。详细的安装和使用方法可以参考本文内容。 ... [详细]
  • 本文详细介绍了相机防抖的设置方法和使用技巧,包括索尼防抖设置、VR和Stabilizer档位的选择、机身菜单设置等。同时解释了相机防抖的原理,包括电子防抖和光学防抖的区别,以及它们对画质细节的影响。此外,还提到了一些运动相机的防抖方法,如大疆的Osmo Action的Rock Steady技术。通过本文,你将更好地理解相机防抖的重要性和使用技巧,提高拍摄体验。 ... [详细]
author-avatar
肥妹---君
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有