• 售前

  • 售后

热门帖子
入门百科

SQL查询入门(上篇) 推荐收藏

[复制链接]
螃蟹357 显示全部楼层 发表于 2021-10-26 13:44:49 |阅读模式 打印 上一主题 下一主题
SQL语言是一门简单易学却又功能强大的语言,它能让你快速上手并写出比较复杂的查询语句。但对于大多数开辟者来说,使用SQL查询数据库并没有一个抽象的过程和一个公道的步骤,这很可能会使在写一些特定的SQL查询语句来办理特定问题时被”卡”住,本系列文章重要讲述SQL查询时一些根本的理论,以及写查询语句的抽象思绪。

SQL查询简介
SQL语言起源于1970年E.J.Codd发表的关系数据库理论,所以SQL是为关系数据库服务的。而对于SQL查询,是指从数据库中取得数据的子集,这句话貌似听着有些晦涩是吧,下面通过几张图片简单阐明一下:
假如一个数据库中只有一个表,再假如所有数据如下图(取自AdventureWork示例数据库):
  [img=668 border=0,359 alt=1 src=]https://www.caogenba.net/[/img]

     而对于子集的概念,look下图:

[img=668 border=0,359 alt=2 src=]https://www.caogenba.net/[/img]        
     末了,子集如下:

[img=350 border=0,144 alt=3 src=]https://www.caogenba.net/[/img]
    实在,SQL中无论多复杂的查询,都可以抽象成如上面的过程.
正确查询的前置条件
对于正确取得所需要的数据子集.除了需要思绪正确并将思绪正确转变为对应SQL查询语句之外。还有很重要的一点是需要数据库有着良好的设计.这里的良好设计我所指的是数据库的设计符合业务逻辑并至少实现第三范式,对于实现第三范式,这只是我个人观点,对于范式的简单介绍,请看我的博客:数据库范式那些事.假如数据库设计很糟糕,存在很多冗余,数据库中信息存在大量非常,则即使SQL写的正确,也无法取得正确的效果。
两种方式,同一种效果
在SQL中,取得雷同的数据子集可以用不同的思绪或不同的SQL语句,由于SQL源于关系数据库理论,而关系数据库理论又源于数学,思索如何构建查询语句时,都可以抽象为两种方法:
1.关系代数法
关系代数法的思绪是对数据库举行分步操纵,末了取得想要的效果.
比如如下语句:
复制代码 代码如下:
Select Name,Department,Age
From Employee
where Age>20

关系代数的思绪形貌上面语句为:对表Employee表举行投影(选择列)操纵,然后对效果举行筛选,只取得年岁大于20的效果.
2.关系演算法
相比较关系代数法而言,关系演算法更多关注的是取得数据所满意的条件.上面SQL可以用关系演算法被形貌为:我想得到所有年岁大于20的员工的姓名,部分和年岁。
为什么需要两种方法
对于简单的查询语句来说,上面两种方法都不需要.用脚就可以想出来了。问题在于很多查询语句都会非常复杂。对于关系演算法来说更多的是关注的是所取出信息所满意的条件,而对于关系代数法来说,更多关注的是如何取出特定的信息.简单的说,关系演算法表现的是”what”,而关系代数法表达的是”how”.SQL语句中所透漏的思绪,有些时间是关系代数法,有些时间是关系演算法,还有些是两种思绪的混淆.
对于某些查询情况,关系代数法可能会更简单,而对于另外一些情况,关系演算法则会显得更直接.还有一些情况.我们需要混淆两种思绪。所以这两种思维方式在写SQL查询时都是必须的.
单表查询
单表查询是所有查询的中心状态,既是多个表的复杂查询在终极举行这种连接后都可以或许被抽象成单表查询。所以先从单表查询开始。
选择列的子集
根据上面数据子集的说法,选择列是通过在select语句反面添加所要选择的列名实现的:
比如下面数据库中通过在select反面选择相应的列名实现选择列的子集.

    [img=668 border=0,359 alt=5 src=]https://www.caogenba.net/[/img]
   相应sql语句如下:
复制代码 代码如下:
SELECT [Name]
,[GroupName]
FROM [AdventureWorks].[HumanResources].[Department]

选择行的子集
选择行的子集是在Sql语句的where子句反面加上相应的限制条件,当where子句反面的表达式为“真”时,也就是满意所谓的“条件”时,相应的行的子集被返回。

where子句反面的运算符分为两类,分别是比较运算符和逻辑运算符.

比较运算符是将两个雷同类型的数据举行比较,进而返回布尔类型(bool)的运算符,在SQL中,比较运算符一共有六种,分别为等于(=),小于(<),大于(>),小于或等于(<=),大于或等于(>=)以及不等于(<>),此中小于或等于和大于或等于可以看成是比较运算符和逻辑运算符的联合体。

而逻辑运算符是将两个布尔类型举行连接,并返回一个新的布尔类型的运算符,在SQL中,逻辑运算符通常是将比较运算符返回的布尔类型相连接以终极确定where子句反面满意条件的真假。逻辑运算符一种有三种,与(AND),或(OR),非(NOT).
   [img=668 border=0,359 alt=6 src=]https://www.caogenba.net/[/img]
   比如上面,我想选择第二条和第六条,为了阐明比较运算符和逻辑运算符,可以使用如下Sql语句:
复制代码 代码如下:
SELECT [Name]
,[GroupName]
FROM [AdventureWorks].[HumanResources].[Department]
WHERE DepartmentID>1 and DepartmentID<3 or DepartmentID>5 and DepartmentID<7

由此我们可以看出,这几种运算符是有优先级的,优先级由大到小分列是比较运算符>于(And)>非(Or)
   固然,运算符也可以通过小括号来改变优先级,对于上面谁人表
   [img=642 border=0,359 alt=8 src=]https://www.caogenba.net/[/img]
   对于不加括号时:
复制代码 代码如下:
SELECT *
FROM [AdventureWorks].[HumanResources].[Department]
WHERE DepartmentID>=1 and DepartmentID<=3 and DepartmentID>=5 or DepartmentID<=7

[img=597 border=0,359 alt=9 src=]https://www.caogenba.net/[/img]
加了括号改变运算序次后:
复制代码 代码如下:
SELECT *
FROM [AdventureWorks].[HumanResources].[Department]
WHERE DepartmentID>=1 and DepartmentID<=3 and (DepartmentID>=5 or DepartmentID<=7)

[img=597 border=0,302 alt=10 src=]https://www.caogenba.net/[/img]
很特殊的NULL
假如在一个用户注册的表中,一些选填信息并不需要用户必须填写,则在数据库中生存为null,这些null值在利用上面where子句后的运算符时,有可能造成数据丢失,比如一个选填信息是性别(Gender),假设下面两条条件子句:
复制代码 代码如下:
where Gender="M"
where NOT (Gender="M")

由于null值的存在,这两条语句返回的数据行加起来并不是整个表中的所有数据。所以,当将null值考虑在内时,where反面的条件子句拥有可能的值从真和假,增长为真,假,以及未知(null)。这些是我们在实际天下中想一些问题的时间可能的答案--真的,假的,我不知道。

所以我们如何在这种情况下不丢失数据呢,对于上面的例子来说,如何才气让整个表的数据不被丢失呢,这里必须将除了“真”,“假”以外的“未知”这个选项包罗在内,SQL提供了IS NULL来表明未知这个选项:
where Gender IS NULL 将上面语句加入进去,则不会再丢失数据。

排序效果
上面的那些方法都是关于取出数据,而下面是关于将取出的子集举行排序。SQL通过Order by子句来举行排序,Order by子句是Sql查询语句的末了一个子句,也就是说Order by子句之后不能再加任何的子句了。

Order By子句分为升序(ASC)和降序(DESC),假如不指定升序大概降序,则默以为升序(由小到大),而Order by是根据排序依据的数据类型决定,分别为3种数据类型可以举行排序:
字符
数字
时间日期
字符按照字母表举行排序,数字根据数字巨细排序,时间日期根据时间的先后举行排序。

其它一些有关的
视图
视图可以看作是一个生存的假造表,也可以简单看做是生存的一个查询语句。视图的利益是视图可以根据视图所查询表的内容的改变而改变,打个比方来理解这句话是:
[img=505 border=0,285 alt=12 src=]https://www.caogenba.net/[/img]
     使用视图的长处是可以对查询举行加密以及便于管理,听说还可以优化性能(我不认可这点).
防止重复
偶然候我们对于取出的数据子集不想重复,比如你想知道一些特定的员工一共属于几个部分
复制代码 代码如下:
SELECT [EmployeeID]
,[DepartmentID]
FROM [AdventureWorks].[HumanResources].[EmployeeDepartmentHistory]


[img=339 border=0,359 alt=15 src=]https://www.caogenba.net/[/img]
这样的效果是没故意义的,SQL提供了Distinct关键字来实现这点:
复制代码 代码如下:
SELECT distinct DepartmentID
FROM [AdventureWorks].[HumanResources].[EmployeeDepartmentHistory]

[img=247 border=0,359 alt=16 src=]https://www.caogenba.net/[/img]
聚合函数
所谓聚合函数,是为了一些特定目标,将同一列多个值聚合为一个,比如我想知道一群人中最大年岁是多少可以利用MAX(Age),比如我想知道一个班级平均测验效果是多少可以用AVG(Result)……
总结
文章简单概述了SQL查询的原理以及简单的单表查询,这些都是数据库查询的底子概念,对于举行复杂查询来说,弄明白这些概念是必不可少的。

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作