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

来源:互联网 发布:维旺迪收购育碧 知乎 编辑:程序博客网 时间:2024/06/10 16:08

第五章 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, namefrom

在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 clausegroup by clause having clauseorder 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()从文本字段中提取字符

0 0