热门标签 | 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仍然有两个基本的原则需要遵守:一是每个结果集必须有相同的列数; 二是每个结果集的列必须类型相容。


推荐阅读
  • 本文深入探讨了MySQL中常见的面试问题,包括事务隔离级别、存储引擎选择、索引结构及优化等关键知识点。通过详细解析,帮助读者在面对BAT等大厂面试时更加从容。 ... [详细]
  • 版本控制工具——Git常用操作(下)
    本文由云+社区发表作者:工程师小熊摘要:上一集我们一起入门学习了git的基本概念和git常用的操作,包括提交和同步代码、使用分支、出现代码冲突的解决办法、紧急保存现场和恢复 ... [详细]
  • 1.介绍有时候我们需要一些模拟数据来进行测试,今天简单记录下如何用存储过程生成一些随机数据。2.建表我们新建一张学生表和教师表如下:CREATETABLEstudent(idINT ... [详细]
  • 本文详细介绍了MySQL数据库中的Bin Log和Redo Log,阐述了它们在日志记录机制、应用场景以及数据恢复方面的区别。通过对比分析,帮助读者更好地理解这两种日志文件的作用和特性。 ... [详细]
  • 优化Flask应用的并发处理:解决Mysql连接过多问题
    本文探讨了在Flask应用中通过优化后端架构来应对高并发请求,特别是针对Mysql 'too many connections' 错误的解决方案。我们将介绍如何利用Redis缓存、Gunicorn多进程和Celery异步任务队列来提升系统的性能和稳定性。 ... [详细]
  • 本文详细介绍了如何解决 Microsoft SQL Server 中用户 'sa' 登录失败的问题。错误代码为 18470,提示该帐户已被禁用。我们将通过 Windows 身份验证方式登录,并启用 'sa' 帐户以恢复其访问权限。 ... [详细]
  • 本文详细介绍如何使用 Apache Spark 执行基本任务,包括启动 Spark Shell、运行示例程序以及编写简单的 WordCount 程序。同时提供了参数配置的注意事项和优化建议。 ... [详细]
  • docker镜像重启_docker怎么启动镜像dock ... [详细]
  • Python Django大学生心理健康管理系统开发(含源码、文档)
    本项目包含完整的源代码、设计文档、数据库结构以及详细的安装指南,旨在为计算机专业的学生提供一个全面的心理健康管理系统解决方案。 ... [详细]
  • 本文详细介绍了在 Windows 7 系统中配置 Nginx 1.10.3 和 PHP 7.1.1 NTS 的步骤,包括修改 PHP 配置文件、处理依赖项以及创建批处理脚本启动和停止服务。重点解释了如何解决常见的运行时错误。 ... [详细]
  • 本文详细介绍了一种通过MySQL弱口令漏洞在Windows操作系统上获取SYSTEM权限的方法。该方法涉及使用自定义UDF DLL文件来执行任意命令,从而实现对远程服务器的完全控制。 ... [详细]
  • MySQL 基础操作与优化
    本文详细介绍了 MySQL 的基础连接、数据库及表的操作,涵盖创建、修改、删除等常用命令,并深入解析了数据类型、列属性、索引、外键和存储引擎等内容。 ... [详细]
  • 在Fedora 31上部署PostgreSQL 12
    本文详细介绍如何在Fedora 31操作系统上安装和配置PostgreSQL 12数据库。包括环境准备、安装步骤、配置优化以及安全设置,确保数据库能够稳定运行并提供高效的性能。 ... [详细]
  • 智能投顾机器人:创业者如何应对新挑战?
    随着智能投顾技术在二级市场的兴起,针对一级市场的智能投顾也逐渐崭露头角。近日,一款名为阿尔妮塔的人工智能创投机器人正式发布,它将如何改变投资人的工作方式和创业者的融资策略? ... [详细]
  • 投资是一场长期的博弈,需要耐心和策略。每个人的投资决策都基于自身的经历和判断,他人的建议仅供参考,最终的选择应由自己权衡。本文将从基本面和技术面两方面对当前的数字货币市场进行分析,并提供相应的操作建议。 ... [详细]
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社区 版权所有