数据库的检索语句

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

时间: 2024-10-27 10:00:48

数据库的检索语句的相关文章

Oracle - SQL语句实现数据库快速检索

SQL语句实现数据库快速检索 有时候在数据库Debug过程中,需要快速查找某个关键字. 1:使用PLSQL Dev自带的查找数据库对象,进行对象查找 缺点:查找慢.耗时. 2:使用SQL语句对数据库对象进行查找 查找数据库一般对象 1 SELECT * FROM DBA_SOURCE T WHERE UPPER(T.TEXT) LIKE '%关键字%' 查找数据库脚本 1 SELECT * FROM DBA_JOBS T WHERE UPPER(T.WHAT) LIKE '%关键字%'; 原文地

JDBC : 数据库的分页语句 &amp;&amp; 调用函数和存储过程

一.数据库的分页语句 在编写Web应用程序等系统时,会涉及到与数据库的交互,如果数据库中数据量很大的话,一次检索所有的记录,会占用系统很大的资源,因此常常采用分页语句:需要多少数据就只从数据库中取多少条记录.以下是Sql Server,Oracle和MySQL的分页语句(从数据库表中的第M条数据开始取N条记录): SQL Server  从数据库表中的第M条记录开始取N条记录,利用Top关键字(如果Select语句中既有top,又有order by,则是从排序好的结果集中选择): SELECT

在线数据库表(sql语句)生成java实体类工具

相信每个做java开发的读者,都接触过SQL建表语句,尤其是在项目开发初期,因为数据库是项目的基石. 在现代项目开发中,出现了许多ORM框架,通过简单的实体映射,即可实现与数据库的交互,然而我们最初设计的一定是数据库表结构,而不是实体类.实体类仅仅是对底层数据结构的有损压缩,它仅仅是数据载体,不具备数据归档能力. 因此,很多时候,我们需要将原始的SQL建表语句转换成java实体类,这项工作看似简单,但若人工完成,工作量也是相当可观的,而且难免会出现差错. 到目前为止,笔者还没有发现比较靠谱的此类

Oracle数据库,查询语句、内置函数

一.数据库的查询语句: 1.查询整个表: select * from 表名 例: 2.通过条件查询某一行数据: select * from 表名 where 字段名 例: 3.某一列数据去重查询: select distinct 字段名 from 表名 例: 4.查询的结果按某个字段升序或倒序排列:  select * from 表名 order by 字段名;                  在字段名的后面加desc为降序顺序排列 例: 5.查询某一列在某个范围内的数据: select *

图解MYSQL JOIN ON,SQL JOIN 详解,数据库sql join语句

对于SQL的Join,在学习起来可能是比较乱的.我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对于Select出来的结果集是什么样子有点不是很清楚.Coding Horror上有一篇文章(实在不清楚为什么Coding Horror也被墙)通过 文氏图 Venn diagrams 解释了SQL的Join.我觉得清楚易懂,转过来. 假设我们有两张表. Table A 是左边的表. Table B 是右边的表. 其各有四条记录,其中有两条记录是相同的,如下所示

SQL Server 【附】创建&quot;商品管理数据库&quot;、&quot;学生选课数据库&quot;的SQL语句

附:(创建“商品管理数据库”的SQL语句) --建立"商品管理数据库"数据库-- create database 商品管理数据库 on(name='商品管理数据库_m', filename='D:\商品管理系统\商品管理数据库_m.mdf', size=6mb,filegrowth=1mb,maxsize=unlimited) log on(name='商品管理数据库_l', filename='D:\商品管理系统\商品管理数据库_l.ldf', size=1,filegrowth=1

数据库中删除语句Drop、Delete、Truncate的相同点和不同点的比较

数据库中删除语句Drop.Delete.Truncate的相同点和不同点的比较(举例说明) 数据库删除语句的分别介绍:Delete:用于删除表中的行(注:可以删除某一行:也可以在不删除表的情况下(即意味着表的结构.属性.索引完整)删除所有行)                语法:删除某一行:Delete From 表名称  Where 列名称=值              删除所有行: Delete From 表名称       或     Delete *  From  表名称   Drop:

php中对MYSQL操作之预处理技术(2)数据库dql查询语句

<?php //预处理技术 //创建一个mysqli对象 $mysqli = new MySQLi("主机名","mysql用户名","密码","数据库名"); //判断是否链接成功 if($mysqli->connect_error){ die($mysqli->connect_error); } //创建预编译对象 $sql = "select id,name,age,qq from 表名 wh

CAD.Net中访问数据库的关键语句之一

.Net中所有对CAD数据库的处理都是通过“事务处理”来进行的,所以所有涉及访问CAD中对象的语句必须在下面的语句括号中执行. using (Transaction trans = db.TransactionManager.StartTransaction()) { 语句…… } CAD.Net中访问数据库的关键语句之一