《SQL必知必会》学习笔记(一)

时间:2022-06-01 20:51:12

这两天看了《SQL必知必会》第四版这本书,并照着书上做了不少实验,也对以前的概念有得新的认识,也发现以前自己有得地方理解错了。我采用的数据库是SQL Server2012.数据库中有一张比赛成绩表,表里有四个字段。下面变列出我新学到的知识。

这个是数据库的全部记录

《SQL必知必会》学习笔记(一)

1.order by  

语句:   select * from Scores order by name , Score desc

执行结果:

《SQL必知必会》学习笔记(一)

①order by在执行排序功能时,会先对排序字段按abcd这样的顺序进行,汉字的话是按拼音的首字母,默认是正序。

②例子中先按name字段进行正序排序,当name相同时,又按score倒叙排,例如拜仁两条数据,胜的开头字母是s,负的是f,因为是倒叙,所以胜的那条数据排在前面。

2.通配符 _ 和 %

  通配符 _表示的是匹配单个字符,而%则是匹配多个字符。具体写法两者无差别。

 select * from Scores where name like '拜_'
select * from Scores where name like '拜%'

注意:①通配符%看起来像是可以匹配任何东西, 但有个例外, 这就是NULL。 子句where name like '%' 不会匹配产品名称为NULL的行。
        ②不要过度使用通配符。 如果其他操作符能达到相同的目的,应该使用其他操作符。
在确实需要使用通配符时, 也尽量不要把它们用在搜索模式的开始处。 把通配符置于开始处, 搜索起来是最慢的。

3.拼接字段 +

语句: select  name+ '('+ Score +')' as ac from Scores 

执行结果:

《SQL必知必会》学习笔记(一)

拼接字段就算把两个字段合成一个字段的查询出来。

4.文本处理函数

①SQL中有很多内置函数,这个表是常用的文本处理函数。

《SQL必知必会》学习笔记(一)

语句:  select upper(name) from Scores
select len(name) from Scores
select left(name,1) from Scores

执行结果:

《SQL必知必会》学习笔记(一)     《SQL必知必会》学习笔记(一)     《SQL必知必会》学习笔记(一)

②其中对于SOUNDEX()解释一下,SOUNDEX是一个将任何文本串 转换为描述其语音表示的字母数字模式的算法。

  select soundex(date) from Scores

《SQL必知必会》学习笔记(一)

select * from Scores where  soundex(name) =soundex('张三')

《SQL必知必会》学习笔记(一)

5.日期和时间处理函数

  日期和时间采用相应的数据类型存储在表中,每种DBMS都有自己的特殊形式。 日期和时间值以特殊的格式存储,以便能快速和有效地排序或过滤,并且节省物理存储空间。

语句:  select date,name from Scores where DATEPART(DD,Date)=10 --查询10号的数据

执行结果:

《SQL必知必会》学习笔记(一)

6.聚合函数

  聚合函数是对某些行进行函数运算,并返回一个值,下图是常用的聚合函数。

《SQL必知必会》学习笔记(一)

说明:①五个函数都忽略列值为NULL的行。

   ②使用COUNT(*)对表中行的数目进行计数,不管表列中包含的是空值(NULL)还是非空值,都会计算到总数中。

   ③使用COUNT(column) 对特定列中具有值的行进行计数, 忽略NULL值。

7.分组函数Group By和having

 ① 当需要统计球队的胜场次数时,这个时候就需要用到分组函数Group By,用到Group By之后,过滤条件就不能用where了,而要用到having。

语句:  select name,COUNT(*) as 场次 from Scores group by name    --查询球队名和比赛场次信息

结果:

《SQL必知必会》学习笔记(一)

语句:select name,COUNT(*)  as 场次 from Scores group by name having COUNT(*)>1   --查询球队名和比赛场次大于1场的信息

结果:

《SQL必知必会》学习笔记(一)

注意:分组查询中,slect的内容必须是group by的字段或聚合函数,不能是其他。例如将date字段放在select中,便出现错误。

《SQL必知必会》学习笔记(一)

②where和having 差别是:where过滤行, 而having过滤分组。

这里有另一种理解方法, WHERE在数据分组前进行过滤, HAVING在数据分组后进行过滤。 这是一个重要的区别, WHERE排除的行不包括在分组
中。 这可能会改变计算值, 从而影响HAVING子句中基于这些值过滤掉的分组。

语句: select name,COUNT(*)  as 场次 from Scores where id<4 group by name having COUNT(*)>1 --在id小于4的数据中查询出球队名和比赛场次大于1场的信息

结果:

《SQL必知必会》学习笔记(一)

8.SELECT子句顺序
《SQL必知必会》学习笔记(一)

SQL 语句的执行顺序跟其语句的语法顺序并不一致,上图是SQL语句的语法顺序。而执行顺序确是:From----->Where----->Group By---->Having----->Select----->Order By

①From 才是 SQL 语句执行的第一步,并非 Select 。数据库在执行 SQL 语句的第一步是将数据从硬盘加载到数据缓冲区中,以便对这些数据进行操作。

② Select 是在大部分语句执行了之后才执行的,严格的说是在 From 和 Group By 之后执行的。理解这一点是非常重要的,这就是你不能在 Where中使用在 Select 中设定别名的字段作为判断条件的原因。