跟我一起学习MySQL技术内幕(第五版):(第一章学习日记6)

1.4.9检索信息

1.4.9.6
处理日期

select * from grade_event where date='2012-10-01';



select last_name,first_name,death from president where death>='1970' and death < '1980-01-01' select last_name,first_name,birth from president where monthname(birth)='March';


select last_name,first_name,birth from president where month(birth)= 3 and dayofmonth(birth) = 29;

这几个示例主要介绍了几个处理日期常用的函数
year(), month(), dayofmonth() ,monthname(),
很简单的几个函数,完全可以通过单词的字面意思理解函数的具体意义



select last_name,first_name,birth from president where month(birth)=month(curdate()) and dayofmonth(birth)=dayofmonth(curdate()) select last_name,first_name,birth,death, timestampdiff(year,birth,death)as age from president where death is not null order by age desc limit 5; select last_name,frst_namae,expiration from member where (to_days(expiration)-to_days(curdate()))<60;

curdate()函数,返回值为当前日期,(系统的日期)
timtstampdiff()函数,日期相减函数,这个函数里的参数(year,birth,death)
第一个参数名表示将要进行减法的是year,后边两个参数即为将要进行相减的两个参数
如果第一个参数名是day,我们就可以表示求相差的日期了,就相当于todays()函数了
to_days()函数用法见上。

select date_add('1970-1-1',interval 10 year);
select date_sub('1970-1-1',interval 10 year);

year 在这里是关键字啊,也可以是月份,天数,不要手快加个s ,(我承认你英语学的好)
data_add(),date_sub(),一加一减。
下边还有一个具体事例,选取那些逝世于二十世纪七十年代的总统

select last_name,first_name,death from president where death>='1970-1-1' and death<date_add('1970-1-1',interval 10 year);

1.4.9.7
模式匹配

select last_name,first_name from president where last_name = 'w%';


select last_name,first_name from president where last_name like 'w%';

两个命令 你会发现第一个是等于w% 第二个是“像”w%
like就是表达的模式匹配,like ‘w%’表示匹配含有w或者W的last-name
如果引号中间是若干个空格,则表示匹配含有若干个(等于空格数)字符的last_name

not like 顾名思义就是“不像”,即返回除了匹配上的想的所有项,和上边的结果完全互补。

1.4.9.8
设置和使用自定义变量

select @ Jackson_birth :=birth from president where last_name='Jackson' and first_name='Andrew'select last_name,first_name,birth from president where birth <@jackson_birth order by birth;

自定义变量的用法是 @变量名:=值
上边的第一个查询主要是把总统的出生日期查询出来,并把它赋给一个变量,这时候这条查询仍然会显示出这一条结果,第二个查询会引用该变量,并在president表中找出所欲birth值小于该变量值的那些行。
如果我觉得自定义变量的时候不想显示自己的设置,可以不用select这种方法,可以使用set这种设置

set @today=curdates();
set @one_week_ago:=date_sub(@today , interval 7 days);

set 语句赋值运算符 “ := ”和“ = ”都可以
还有注意自定义变量的时候名称前要加一个@

1.4.9.9
生成统计信息

这一小节主要的内容就是基于select语句的一系列的统计操作,因为基本的select格式基本没差别,所以这里介绍这一节出现的一些关键字,函数,

select distinct from table;


select count(*) from tableselect count(*),count(email),count(expiration) from member;


select count (distinct state) from president;

distinct 关键字表示”不同“,每次查询时相同的元素将会只被计数一次,返回一次,
count ()函数,计数函数,括号里面是‘*’的话,将表示计数行数,count(column)表示计数这一列不同
值一共有多少个。



 select sex,count(*) from student group by sex; select state,count(*)as count from president group by state order bycount desc; 

即对目标先进行分组,再进行计数,这样的组合有很多优点:
1.不用事先知道被统计的表里有些什么值
2.只需一个查询语句。
3。可以对输出进行排序(添加一个order by)
注意:
如果用于排序的列是由某个函数汇总产生的,那么不能直接在order by子句里直接引用该函数。应该先取一个别名,然后把别名作为 order by的目标。

select month(birth) as Month,monthname(birth) as Name, count(*) as count from president group by name order by Month;

我们知道用order by的时候 可以通过limit来选择输出行的数量,
现在我们一起认识 having子句

select state,count(*) as count from president group by state order by count desc limit 4;



select state,count(*) as count from president group by state having count>1 order by count desc;

这个查询会告诉你 哪些州曾经出现过两位及以上的总统。
除了count()以外,还有其他几个汇总函数。min(),max(),sum(),avg()分别表示最小值,最大值,总计和平均值。以后这些都是做查询的时候经常用到的,应该牢记在心。

这一小节最后还介绍了with rollup子句,这个子句的意义在于对查询统计的结果再进行一次统计
这里有个简单的示例

select sex,count(*)from student group by sex with rollup ;

结果将会在男女分类,人数统计的基础上再汇总所有的人数,sex列显示null,count(*)列显示男女人数和总人数

除此之外,with rollup还会可以产生一个额外的超集行:
示例如下

id   minimun   maximum   span   total   average   count
 1     9        10        12     439     15.1379   29
 2     8        19        12     425     14.1667   30
 NUll  8        19        24     864     14.6523   59

很简单吧 ,意思很好理解 ,就是在对这一列默认的操作在进行一次操作。
出现上边结果的代码如下

select event_id,min(score) as minimum,max(score) as maximum, max(score)-min(score) as span,sum(score) as total, avg(score) as average, count(score) as count, from score group by event_id with rollup; 

1.4.9.10
从多个表里检索信息
DBMS的威力在于他们可以把源自多个表的信息结合起来,从而捷达单个表无法解决的问题

select student_id,date,score,catogory from grade_event inner join score on grade_event.event_id=score.event_id where date ='2012-09-23' 

from:指定了多个表名,因为需要从多个表里检索信息
on:指定了 grade_event和score的连接条件,即这两个表的event_id值必须相互匹配
(这里建议on里边的两个表名写出来,不只是写两个列的名字,再有就是这种查询方式下所有列的表名全部都写上包括第一行所有列)

这一节内容很多,但多数是对具体情况的具体分析,(有提到left join)我计划在下一章的时候再具体提及,这一小结可以作为查询的逻辑思维的试炼,建议自己读,认真体会

1.4.9到这里就结束了,第一章也即将结束,相信对数据库有了进一步的体会与了解。在接下来的学习中也一定轻车熟路~
十二点多开始写~三点了~今天有点晚~但我坚持下来了~加油!

你可能感兴趣的:(mysql)