《读书笔记》系列4:MySQL开发者SQL权威指南

第五章 select常用元素

(1) 使用select A as B 时,B可以出现在select语句的其他子句中,除了From和Where子句之外。即select A as B from C where B…是错误的,只能只用select A as B from C where A…。原因是B这个列名并不属于这个表,只是在select语句块的结果。
(2) 使用SET来设置用户变量,用户变量可以在select语句中使用。SET @playno=7, select @playno
(3) Case表达式,相当于C++中的switch。

Select playno,
case sex 
when ‘F’ then ‘Female’  
when ‘T’ then ‘TEST’
else ‘Male’ 
end as sex, name
from

在case表达式中,如果else省略了,并且sex的值不等于when的值,将会返回空值。
(4) 类型转换,CAST(‘123’as SIGNED INTEGER),将‘123’转换成整数。CAST(‘1997-05-05’ as DATE),将‘1997-05-05’转换成日期。
(5) 聚合函数和标量函数的区别。标量函数最多在带有值的一行上执行,例如col*20;而聚合函数总是作为输入的一组行上执行。Mysql支持的聚合函数有:

  • avg
  • count
  • max
  • min
  • sum
  • BIT_OR 按位或
  • group_concat 将结果生成列表
  • stddev 标准差
  • ……

(6) 插入多行:

Insert into tab values1,‘a’),
(2,‘b’),
(3,‘c’)

上面这条语句保证了要么3条语句都被添加,要么什么也不添加,可以看成一个“原子插入”。

第六章 select语句、子查询

(1) select语句的定义:

select clause from clause where clause
group by clause having clause
order by clause limit clause

注意group by,having要出现在order by,limit的前面,使用having前必须使用group by。

Group by根据列中的相等的值来对行分组,having选择满足条件的组。Order by根据列对行进行排序,limit根据行的排列序号来删除行。

(2) 找到至少引发两次多于25美元的罚款的每个球员的号码,根据球员号码排序。

select playno from penalties where amount>25 group by playno having count(*)>1 order by playno.

(3) 什么是子查询?在一个表表达式中调用另一个表表达式。这个被调用的表表达式叫做子查询。通俗的说,就是一个select语句中调用另一个select语句,被调用的select语句就是子查询。

Select playerno fromselect playerno, sex from players where playerno<10as players10 where sex =‘M’

第七章 from子句

(1) 如果一个表表达式包含一个from子句,处理过程从这个from子句开始。
(2) 显示联接。一般在from子句中,有多个表,没有写出join表示用的是隐式的内联接。
(3) 左外联接。对于所有球员,获取球员号码、名字和他所引起的罚款;结果按照球员号码排序。很多错误的写法是:

Select players.playerno,name,amount from players,penalties where players.playerno=penalties.playerno order by players.playerno

原因是得到的结果是不完整的,因为所有那些没有罚款的球员被漏掉了。这个问题的本意是要获取结果中的所有球员。为了让漏掉的球员也出现在结果中,必须指定一个左外联接。正确的写法是:

Select players.playerno,name,amount from players left outer join penalties on players.playerno = penalties.playerno order by players.playerno

(4) 右外联接是左外联接的对应影射。使用左外联接,左表的所有连接都出现在from子句的中间结果中;使用右外联接,这一情况使用于右表。

(5) 使用自然联接,可以缩短select语句。使用自然联接时,后台会自动寻找两个表中相同的列名进行内联。例如:

Select players.plaerno,name,amount from players inner join penalties on players。Playerno = penalties.playerno where birth_date>’1920-06-20’ ;

可以修改成使用自然联接:

Select players.playerno,name,amount from players natural join penalties where birth_date >‘1920-06-20’;

第八章 where子句

(1) where中子查询的比较运算 where playerno =(select playerno from…)。这里要求select playerno from的结果中只有一个值,否则mysql会不处理。
(2) like的使用。获取名字字母%e作为名字的倒数第二个字母的每个球员的号码。
Select name,playerno from players where name like ‘%e_’
(3) where子句中使用正则表达式,使用regexp运算符。可以使用match单词匹配运算符。
(4) where子句中还可以用all、any、exists、in等运算符。

第九章 聚合函数

(1) select子句加上distinct关键字时,mysql会从中间结果中移除重复的行。Distinct是针对整个行,而不只是针对在语句中紧跟在distinct后面的表达式。
(2) 聚合函数不允许嵌套,例如不能使用count(max(…))
(3) Count(col)用来计算col列中为非空值的数目,而不是计算中间结果中的行数。
(4) 在town列中,有多少不同的城市名?select count(distinct town)from players。在当前列中指定了distinct,所有重复的值都首先移除,然后执行count。

第十章 group by子句

(1) 获取每个不同的罚款额,后边跟着该罚款额出现在penalties表中的次数以及罚款额乘以次数的结果。Select amount,count(*),sum(amount)from penalties group by amount。
(2) Order by子句中的列指定和group by子句中的列是相同的。Group by要出现在order by前面。
(3) 一个稍微复杂的例子。居住在city1和city2的球员的罚款额总数的平均值是多少?使用子查询及聚合函数:

select avg(total)
fromselect playerno, sum(amount) as total from penalties group by playerno)as totals 
where playerno inselect playerno from players where town=’city1’ and town=’city2’)

第十一章 having子句

(1) 一个having子句的目的和where子句类似,不同在于,where子句用来在from子句处理之后选择一行,而having子句用来在group by子句执行以后选择一行。一个having子句可以单独使用,而不使用group by子句。
(2) 获取哪些引起多于一次罚款的每个球员的号码。Select playerno from penalties group by playerno having count(*)> 1。
(3) Having子句的规则:having子句中的所有列必须出现在一个聚合函数中,或者出现在group by子句指定的列表中。如下的语句是不正确的,因为birth_date列出现在having子句中,但是没有出现在一个聚合函数中,或者出现在执行分组所根据的列的列表中。Select town, count(*) from players group by town having birth_date >’1970-01-01’;

第十二章 order by子句

第十三章 limit子句

(1) limit子句是一个选择语句块的最后一个子句,它选取了行的一个子集。
(2) 如果根据一列对空值排序,空值被看作是最小的值。
(3) 带有偏移量的limit:使用offset关键字指定偏移量。Select playerno,name from players order by playerno asc limit 5 offset 3.

第十八章 载入和卸载数据

(1) 卸载数据到文件:
select * from team into outfile ‘C:/team.txt’ fields terminated by ‘,’ lines terminated by ‘?’;
(2) 从文件载入数据:
load data infile ‘C:/team.txt’ replace into table teams fields terminated by ‘,’ lines terminated by ‘?’;
(3) 卸载数据用select子句,加载数据使用load子句

其他

(1) Select distinct 列名称 。。。返回的值是唯一的,不重复的
(2) SELECT AVG(column_name) FROM table_name求平均值
(3) Select count(?)
(4) Select mid()从文本字段中提取字符

猜你喜欢

转载自blog.csdn.net/qguanri/article/details/50054231