SQL查询语句是啥?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL查询语句是啥?相关的知识,希望对你有一定的参考价值。
SQL查询语句是什么?
SQL 一词实际上是 "Structured Query Language" 结构式查询语言的缩写,是用于对存放在计算机数据库中的数据进行组织、管理和检索的一种工具;是一种特定类型的数据库 -- 关系数据库。而控制这种数据库的计算机程序就是我们常说的 DBMS-- 数据库管理系统。譬如:SQL Server、Oracle、Sybase、DB2 等等。当用户想要检索数据库中的数据时,就通过 SQL 语言发出请求,接着 DBMS 对该 SQL 请求进行处理并检索所要求的数据,最后将其返回给用户,此过程被称作为数据库查询,这也就是数据库查询语言这一名称的由来。SQL 并不是象 C、COBOL 和 Fortran 语言那样的完整的计算机语言。SQL 没有用于条件测试的 IF 语句,也没有用于程序分支的 Goto 语句以及循环语句 For 或 Do。确切的讲,SQL 是一种数据库子语言,SQL 语句可以被嵌入到另一种语言中,从而使其具有数据库存取功能。SQL 也非严格的结构式语言,它的句法更接近英语语句,因此易于理解,大多数 SQL 语句都是直述其意,读起来就象自然语言一样明了。SQL 还是一种交互式查询语言,允许用户直接查询存储数据,利用这一交互特性,用户可以在很短的时间内回答相当复杂的问题,而同样问题若让程序员编写相应的报表程序则可能要用几个星期甚至更长时间。
参考资料:http://edu.itsun.com/html/2005/135.htm
参考技术A SQL全称是“结构化查询语言(Structured Query Language)”,最早的是IBM的圣约瑟研究实验室为其关系数据库管理系统SYSTEM R开发的一种查询语言,它的前身是SQUARE语言。SQL语言结构简洁,功能强大,简单易学,所以自从IBM公司1981年推出以来,SQL语言,得到了广泛的应用。如今无论是像Oracle ,Sybase,Informix,SQL server这些大型的数据库管理系统,还是像Visual Foxporo,PowerBuilder这些微机上常用的数据库开发系统,都支持SQL语言作为查询语言。Structured Query Language包含4个部分:
数据查询语言DQL-Data Query Language SELECT
数据操纵语言DQL-Data Manipulation Language INSERT, UPDATE, DELETE
数据定义语言DQL-Data Definition Language CREATE, ALTER, DROP
数据控制语言DQL-Data Control Language COMMIT WORK, ROLLBACK WORK
SQL的历史
在70年代初,E.E.Codd首先提出了关系模型。70年代中期,IBM公司在研制 SYSTEM R关系数据库管理系统中研制了SQL语言,最早的SQL语言(叫SEQUEL2)是在1976 年 11 月的IBM Journal of R&D上公布的。
1979年ORACLE公司首先提供商用的SQL,IBM公司在DB2 和SQL/DS数据库系统中也实现了SQL。
1986年10月,美国ANSI采用SQL作为关系数据库管理系统的标准语言(ANSI X3. 135-1986),后为国际标准化组织(ISO)采纳为国际标准。
1989年,美国ANSI采纳在ANSI X3.135-1989报告中定义的关系数据库管理系统的SQL标准语言,称为ANSI SQL 89, 该标准替代ANSI X3.135-1986版本。该标准为下列组织所采纳:
● 国际标准化组织(ISO),为ISO 9075-1989报告“Database Language SQL With Integrity Enhancement”
● 美国联邦政府,发布在The Federal Information Processing Standard Publication(FIPS PUB)127
目前,所有主要的关系数据库管理系统支持某些形式的SQL语言, 大部分数据库打算遵守ANSI SQL89标准。
SQL的优点
SQL广泛地被采用正说明了它的优点。它使全部用户,包括应用程序员、DBA管理员和终端用户受益非浅。
(1) 非过程化语言
SQL是一个非过程化的语言,因为它一次处理一个记录,对数据提供自动导航。SQL允许用户在高层的数据结构上工作,而不对单个记录进行操作,可操作记录集。所有SQL 语句接受集合作为输入,返回集合作为输出。SQL的集合特性允许一条SQL语句的结果作为另一条SQL语句的输入。 SQL不要求用户指定对数据的存放方法。 这种特性使用户更易集中精力于要得到的结果。所有SQL语句使用查询优化器,它是RDBMS的一部分,由它决定对指定数据存取的最快速度的手段。查询优化器知道存在什么索引,哪儿使用合适,而用户从不需要知道表是否有索引,表有什么类型的索引。
(2) 统一的语言
SQL可用于所有用户的DB活动模型,包括系统管理员、数据库管理员、 应用程序员、决策支持系统人员及许多其它类型的终端用户。基本的SQL 命令只需很少时间就能学会,最高级的命令在几天内便可掌握。 SQL为许多任务提供了命令,包括:
● 查询数据
● 在表中插入、修改和删除记录
● 建立、修改和删除数据对象
● 控制对数据和数据对象的存取
● 保证数据库一致性和完整性
以前的数据库管理系统为上述各类操作提供单独的语言,而SQL 将全部任务统一在一种语言中。
(3) 是所有关系数据库的公共语言
由于所有主要的关系数据库管理系统都支持SQL语言,用户可将使用SQL的技能从一个RDBMS转到另一个。所有用SQL编写的程序都是可以移植的。 参考技术B SELECT表达式
接着,让我们看看SELECT表达式,SELECT用来在表中寻找符合特定条件的记录,语法如下:
SELECT [关键字] * | 表名称.* | [表名称.]字段名称1 [AS 别名1] [, [表名称.] 字段名称2 [AS 别名2] [, ...]]
FROM 表运算式 [, ...] [IN 外部表]
[WHERE... ]
[GROUP BY... ]
[HAVING... ]
[ORDER BY... ]
[WITH OWNERACCESS OPTION]
关键字:可以用来限制返回之记录的数量,可以设定为ALL、DISTINCT、DISTINCTROW 、或TOP。如果没有指定述语,缺省值为 ALL。
*:选取全部的字段。
别名:代替在表中原有的字段名称。
表运算式:一个或多个以逗号分隔的表名称。
外部表:如果表不存在目前的表当中,须设定包含表运算式中表的表名称。
执行SELECT 表达式,并不会改变表之中现有的资料。
一个 SELECT 表达式的最基本语法是:
SELECT * FROM 表运算式
您可以使用星号(*)来选取表的全部字段。譬如下例选取 [产品] 表中的全部字段:
SELECT * FROM 产品
字段名称包含空格或标点符号时,须使用括号[ ]将它括在其中。例如:
SELECT [电脑 的产品]
如果在FROM子句中的字段名称中,包含多个的表中时,需在字段名称前加上表名称和点(.)运算子,即 表名称.字段名称。譬如下例选取 [产品] 表的 [价格] 字段和 [订单] 表的 [数量] 字段:
SELECT 产品.价格, 订单.数量
FROM 产品, 订单
WHERE 产品.代号 = 订单.代号
当您使用Recordset 对象时,Recordset并不认得rs(表名称.字段名称) 格式,即rs(“产品.价格”)会发生错误,您必须使用AS来设定字段名称的别名。譬如:
SELECT 产品.价格 AS 价格, 订单.数量AS 数量
FROM 产品, 订单
WHERE 产品.代号 = 订单.代号
如此就可以使用rs(“价格”) 和rs(“数量”),来读取其字段的资料。
与SELECT表达式相关的语法:
关键字:ALL/ DISTINCT/ DISTINCTROW/ TOP。
WHERE:寻找FROM中的表符合特定条件的资料记录。WHERE 可以使用下面的BETWEEN、LIKE、IN运算子:
Between...And:判断表达式的值是否落在指定的范围之中。
Like:寻找相符合的关键字。
IN运算式:限定范围。
NOT IN运算式:表示不属于所指定的范围。
ORDER BY子句:可以设定排序的字段。
GROUP BY子句:将查询的结果做统计。
HAVING子句:使用在SELECT 表达式中,筛选已经GROUP BY统计的记录。
Union:可以合并多组查询的结果。
JOIN:连接组合两个表中的字段记录。
子查询(sub query):表达式中,可以包括SELECT表达式。
Select...Into:将查询的结果,建立一个产生的表。
详细介绍如下:
ALL/DISTINCT/DISTINCTROW/TOP关键字
使用SELECT查询时,可以加上关键字,以选取所查询的记录。如下:
ALL:返回所有的记录。
DISTINCT:指定字段中的记录有重复时只返回一条记录,记录不重复。
DISTINCTROW:指定字段中的记录有重复时都不返回。
TOP:返回前面几个记录或几个百分比的记录。
语法如下:
SELECT [ALL | DISTINCT | DISTINCTROW | [TOP n [PERCENT]]]
FROM 表
ALL返回所有的记录。不加关键字时,与加ALL的意义相同,将返回所有的记录。譬如下列两个例子的执行结果相同,都从产品表中返回所有的记录:
SELECT ALL * FROM 产品
与以下的执行结果相同:
SELECT * FROM 产品
DISTINCT不选取指定字段之中的重复资料。使用DISTINCT后,查询的结果,列在SELECT DISTINCT后的每个字段的资料值,若相同则只取一条记录,换句话说,指定字段的资料不会有重复的现象。例如,在产品表之中有一些产品名称相同的产品,加上DISTINCT的SQL表达式只会返回一条记录字段为产品名称资料相同的记录:
SELECT DISTINCT 产品名称 FROM 产品
如果您不加上DISTINCT,上例查询将返回数个包含相同产品名称的记录。
如果SELECT DISTINCT子句后指定数个字段,查询的结果,所有字段的组合值不会有重复的现象。
DISTINCTROW则不返回指定字段所有重复的记录。
TOP n [PERCENT] ,返回前面几条记录或几个百分比的记录。排列的顺序可以使用ORDER BY子句来指定。譬如找到成绩前10名的学生姓名:
SELECT TOP 10 姓名
FROM 学生
ORDER BY 成绩
如果您没有包含ORDER BY子句,查询将由学生表返回任意的10个记录。
TOP不在相同值间作选择,如果第10及第11的成绩是相同的,查询将返回11个记录。
您可使用PERCENT来设定前面几个百分比的记录,譬如譬如找到成绩前10%的学生姓名:
SELECT TOP 10 PERCENT 姓名
FROM 学生
ORDER BY 成绩 参考技术C select * from 表名 where 要查询的字段名 order by 按某个字段排序的字段名 desc/asc是按降序还升序 参考技术D select * from 表名 where条件
经常看到SQL语句中的where 1=1是啥意思?
参考技术A 这时我们的查询语句就是 select * from table where starttime =2015-04-05 and endtime = 2015-04-07,查询语句正确但是如果条件都不满足的话,语句就变成了 select * from table where ,这时候查询就会报错。
当两个条件成立的时候 select * from table where 1=1 and starttime =2015-04-05 and endtime = 2015-04-07, 语句正确
当两个条件不满足时 select * from table where 1=1 ,语句正确,会返回table表的所有数据
mybatis动态拼接条件的技巧 where 1=1 或者where标签
<select id="selectByStudentSelective" resultMap="BaseResultMap" parameterType="com.homejim.mybatis.entity.Student">
select
<include refid="Base_Column_List" />
from student
where 1=1
<if test="name != null and name !=''">
and name like concat('%', #name, '%')
</if>
<if test="sex != null">
and sex=#sex
</if>
</select>
mybatis动态拼接条件的技巧:
技巧一:where 1=1 ,此时,就可以根据name,sex是否为空就可以查询了
技巧二:放在where标签里面
<select id="selectByStudentSelective" resultMap="BaseResultMap" parameterType="com.homejim.mybatis.entity.Student">
select
<include refid="Base_Column_List" />
from student
< where>
<if test="name != null and name !=''">
and name like concat('%', #name, '%')
</if>
<if test="sex != null">
and sex=#sex
</if>
</where>
</select>
参考1
参考2
以上是关于SQL查询语句是啥?的主要内容,如果未能解决你的问题,请参考以下文章
oracle 查询的sql语句特别慢,是啥原因,是or特别慢吗,用啥优化,急急急!!!