数据库的检索语句

数据库的检索语句

大家好,又见面了,我是全栈君。

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 keyword,是一个二元操作符, 左表达式为待匹配的字段。 而右表达式为待匹配的通配符表达式

1.2.1.1单字符匹配

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

SELECT * FROM T_Employee WHERE FName LIKE ‘_erry’  。

SELECT * FROM T_Employee WHERE FName LIKE ‘__n_’ 。

1.2.1.2多字符匹配

进行多字符匹配的通配符为半角百分号“%” ,它匹配随意次数(零或多个)出现的随意字符。

比方通配符表达式“k%”匹配以“k”开头、随意长度的字符串。

SELECT * FROM T_Employee WHERE FName LIKE ‘T%’ 。

SELECT * FROM T_Employee WHERE FName LIKE ‘%n%’。


字符匹配和多字符匹配还能够一起使用。SELECT * FROM T_Employee WHERE FName LIKE ‘%n_’ 。


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 = ‘Beijing’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中提供了LIMITkeyword用来限制返回的结果集。 LIMIT放在SELECT语句的最后位置,语法为 “LIMIT  首行行号,要返回的结果集的最大数目” 。

比方以下的SQL语句将返回依照工资降序排列的从第二行開始(行号从0開始)的最多五条记录:SELECT * FROM T_Employee ORDER BY FSalary DESC LIMIT 2,5 。



 DISTINCTkeyword是用来进行反复数据抑制的最简单的功能。并且全部的数据库系统都支持DISTINCT,DISTINCT的使用也很easy。仅仅要在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仍然有两个主要的原则须要遵守:一是每一个结果集必须有同样的列数; 二是每一个结果集的列必须类型相容。



版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/116639.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号