Mysql学习笔记005,mysql学习笔记

Mysql学习笔记007,mysql学习笔记

Mysql 学习笔记(一),mysql学习笔记

   
 最近从在学习MySQL数据库,遇到一些问题,有些解决了,有些还未找到答案,本篇作为学习笔记,未解决的问题等后续有答案再补充,也请走过路过的大牛们指点一二;

 

   
问题一:Java程序查询MySQL表数据,由于MySQL默认将查询结果全部加载到内存中,数据量比较大时,会报OOM,以下是解决这个问题过程中在网上找到的三种常见解决方案:

方案1)

图片 1

1 setFetchSize(Integer.MIN_VALUE);

View Code

方案2)

图片 2

1 conn = DriverManager.getConnection("jdbc:mysql://localhost/?useCursorFetch=true", "user", "password");
2 stmt = conn.createStatement();
3 stmt.setFetchSize(100);

View Code

方案3)分页查询,由于某些比较囧的原因,我最终选取了这个方案;

图片 3

1 --分页查询语句示例
2 select * from tablename order by col limit offset, pagesize;

View Code

当offset比较大的时候,查询效率很低,以下是网上查到的两种解决办法

图片 4

1 --1
2 select * from tablename where col1 > (select col1 from tablename order by col1 limit (&page-1)*&pagesize,1) order by col1 limit &pagesize;
3 
4 --2
5 select t1.* from tablename as t1 join (select col1 from tablename order by col1 limit (&page-1)*&pagesize,1) as t2 where t1.col1 >= t2.col1 order by t1.col1 limit &pagesize;
6 
7 --语句2对于当表的主键是复合字段的时候比较容易扩展,可以写成
8 select t1.* from tablename as t1 join (select col1, col2 from tablename order by col1, col2 limit (&page-1)*&pagesize,1) as t2 where t1.col1 > t2.col1 or (t1.col1 = t2.col1 and t1.col2 >= t2.col2) order by t1.col1, t1.col2 limit &pagesize;

View Code

用来排序的col1,
col2字段是查询的表的主键字段,一般来说,使用分页查询,表最好是有一个自增的数值型的主键会比较好,查询效率比较高,如果主键是多个字段,可以看出来查询的SQL会写得非常复杂,效率也很低。

我的测试数据是500w,pagesize是50,当表里面的主键是两个字段时,翻第二页的时间用了50+秒,可见效率有多低……只能看看还有没有优化办法,其实我的需求是扫全表,因此只要每次翻页的时候把上一页查到的最后一条记录

主键值传给下一个查询语句就可以优化不少时间,最终的方案如下:

图片 5

 1     String sqltext = "select col1, col2 from tablename where col1 > ? or (col1 = ? and col2 > ?) order by col1, col2 limit &pagesize";
 2 
 3     PreparedStatement prepStmt = null;
 4     ResultSet rs = null;
 5     prepStmt = conn.prepareStatement(sqltext);
 6 
 7     String iCol1 = "";
 8     String iCol2 = "";
 9 
10     while(true)
11     {
12          prepStmt.setString(1,iCol1);
13          prepStmt.setString(2,iCol1);
14          prepStmt.setString(3,iCol2);
15          rs = prepStmt.executeQuery();
16          int rsCnt = 0;
17          while(rs.next())
18          {
19             rsCnt++;
20             if(rsCnt == PAGESIZE) 
21             {
22                 iCol1 = rs.getString("col1");
23                 iCol2 = rs.getString("col2");
24             }
25           }
26           if(rsCnt == PAGESIZE) break;
27     }

View Code

     问题二(未解决),MySQL 存储过程,使用insert ignore
语句新增表记录,程序中断重提没有新增成功(实际表里面没有该记录),去掉ignore就成功新增了,不清楚中间发生了什么事?单独调研存储过程insert
ignore没问题。在Java程序中调用出现这种情况。

   
 问题三(未解决),向MySQL中新增10G左右的数据(执行好几次),MySQL生成150G左右的二进制日志,我需要继续学下MySQL二进制日志文件的相关内容,じゃ~また

 

学习笔记(一),mysql学习笔记
最近从在学习MySQL数据库,遇到一些问题,有些解决了,有些还未找到答案,本篇作为学习笔记,未解…

Mysql学习笔记004,mysql学习笔记

  接着前面的写

Mysql学习笔记003,mysql学习笔记

Mysql学习笔记005,mysql学习笔记

 计数行

直接上栗子:客户想要知道有多少pet了,
肿么办?(需要用到一个COUNT(*)的函数)

操作如下:

SELECT COUNT(*) FROM pet;

mysql> SELECT COUNT(*) FROM pet;
+———-+
| COUNT(*) |
+———-+
| 9 |
+———-+
1 row in set (0.09 sec)

mysql>

 

栗子:现在客户知道了有多少pet, 客户有想知道有多少人养这些pets。

操作如下:

SELECT owner, COUNT(*) FROM pet GROUP BY owner;

mysql> SELECT owner, COUNT(*) FROM pet GROUP BY owner;
+——–+———-+
| owner | COUNT(*) |
+——–+———-+
| Benny | 2 |
| Diane | 2 |
| Gwen | 3 |
| Harold | 2 |
+——–+———-+
4 rows in set (0.00 sec)

mysql>

 

NOTE:使用GROUP BY 对每一个owner进行了分组,没有她,你自己看着办吧。

mysql> SELECT owner, COUNT(*) FROM pet;
ERROR 1140 (42000): In aggregated query without GROUP BY, expression #1
of SELECT list con
tains nonaggregated column ‘test.pet.owner’; this is incompatible with
sql_mode=only_full_
group_by
mysql>

我的Mysql报的是这个错。、。、

图片 6

报出的错误都是错的、、、、

 

 

继续举栗子(为了加深印象):每种动物的数量

操作如下:

SELECT species, COUNT(*) FROM pet GROUP BY species;

mysql> SELECT species, COUNT(*)
-> FROM pet
-> GROUP BY species;
+———+———-+
| species | COUNT(*) |
+———+———-+
| bird | 2 |
| cat | 2 |
| dog | 3 |
| hamster | 1 |
| snake | 1 |
+———+———-+
5 rows in set (0.20 sec)

mysql>

 

 

栗子:每种性别的数量

操作如下:

SELECT sex, COUNT(*) FROM pet GROUP BY sex;

mysql> SELECT sex, COUNT(*)
-> FROM pet
-> GROUP BY sex;
+——+———-+
| sex | COUNT(*) |
+——+———-+
| NULL | 1 |
| f | 4 |
| m | 4 |
+——+———-+
3 rows in set (0.00 sec)

mysql>

 

栗子:按种类和性别查看数量

操作如下:

SELECT species, sex, COUNT(*) FROM pet GROUP BY species, sex;

mysql> SELECT species, sex, COUNT(*)
-> FROM pet
-> GROUP BY species, sex;
+———+——+———-+
| species | sex | COUNT(*) |
+———+——+———-+
| bird | NULL | 1 |
| bird | f | 1 |
| cat | f | 1 |
| cat | m | 1 |
| dog | f | 1 |
| dog | m | 2 |
| hamster | f | 1 |
| snake | m | 1 |
+———+——+———-+
8 rows in set (0.00 sec)

mysql>

 

我的现在的理解是先分组(GROUP BY)再计数(COUNT(*))嘛

 

栗子:只看猫狗的性别计数

操作如下:

SELECT species, sex, COUNT(*) FROM pet WHERE species = ‘dog’ OR species
= ‘cat’ GROUP BY species, sex;

mysql> SELECT species, sex, COUNT(*)
-> FROM pet
-> WHERE species = ‘dog’ OR species = ‘cat’
-> GROUP BY species, sex;
+———+——+———-+
| species | sex | COUNT(*) |
+———+——+———-+
| cat | f | 1 |
| cat | m | 1 |
| dog | f | 1 |
| dog | m | 2 |
+———+——+———-+
4 rows in set (0.00 sec)

mysql>

 

 

本小节最后一个栗子在举就JJ痛:我想知道有性别的动物的种和性别计数

操作如下:

SELECT species, sex, COUNT(*) FROM pet WHERE sex IS NOT NULL GROUP BY
species, sex;

mysql> SELECT species, sex, COUNT(*)
-> FROM pet
-> WHERE sex IS NOT NULL
-> GROUP BY species, sex;
+———+——+———-+
| species | sex | COUNT(*) |
+———+——+———-+
| bird | f | 1 |
| cat | f | 1 |
| cat | m | 1 |
| dog | f | 1 |
| dog | m | 2 |
| hamster | f | 1 |
| snake | m | 1 |
+———+——+———-+
7 rows in set (0.00 sec)

mysql>

 

图片 7

 

 

 

 

 

选择特殊的列

举个栗子:我想给这些pet们过身日,我就要知道pet们的名字和他们的生日。我该怎么办?

操作如下:

SELECT name, birth FROM pet;

mysql> SELECT name, birth
-> FROM pet;
+———-+————+
| name | birth |
+———-+————+
| Whistler | 1997-12-09 |
| Puffball | 1999-03-30 |
| Fluffy | 1993-02-04 |
| Claws | 1994-03-17 |
| Buffy | 1989-05-13 |
| Fang | 1990-08-27 |
| Bowser | 1989-08-31 |
| Chirpy | 1998-09-11 |
| Slim | 1996-04-29 |
+———-+————+
9 rows in set (0.00 sec)

mysql>

这样我就可以给这些pet们过生日了。

 

再举一个栗子:没有故事,我就是想看一看这些小天使们的主人都有谁?

操作如下:

SELECT owner FROM pet;

mysql> SELECT owner
-> FROM pet;
+——–+
| owner |
+——–+
| Gwen |
| Diane |
| Harold |
| Gwen |
| Harold |
| Benny |
| Diane |
| Gwen |
| Benny |
+——–+
9 rows in set (0.00 sec)

mysql>

you会发现you查询到的 owner 中有好多是重复的诶,这好烦啊。

为了让他们值出现一次 ,加一个关键字 DISTINCT

SELECT DISTINCT owner FROM pet;

mysql> SELECT DISTINCT owner
-> FROM pet;
+——–+
| owner |
+——–+
| Gwen |
| Diane |
| Harold |
| Benny |
+——–+
4 rows in set (0.00 sec)

mysql>

这下子看着舒服多了

 

再带条件举一个栗子:要想查询狗和猫的出生日期 

操作如下:

SELECT name, species, birth FROM pet WHERE species = ‘dog’ OR species =
‘cat’;

mysql> SELECT name, species, birth
-> FROM pet
-> WHERE species = ‘dog’ OR species = ‘cat’;
+——–+———+————+
| name | species | birth |
+——–+———+————+
| Fluffy | cat | 1993-02-04 |
| Claws | cat | 1994-03-17 |
| Buffy | dog | 1989-05-13 |
| Fang | dog | 1990-08-27 |
| Bowser | dog | 1989-08-31 |
+——–+———+————+
5 rows in set (0.00 sec)

mysql>

 

从表检索信息

  在前面,我, 创建了一个数据库test 进入数据库 创建了一个表pet
插入了一些数据。那么问题来了,我要是想要瞅一瞅我的表中的数据肿么办呢?莫着急,待我一一道来

日期计算

MySQL提供了几个函数, 可以用来计算日期。巴拉拉拉。。。。

举个例子:我想要确定pet们有多大,
可以计算当前日期的年和出生日期之间的差。

操作如下:

SELECT name, birth, YEAR(CURRENT_DATE()) – YEAR(birth) AS age FROM pet;

mysql> SELECT name, birth, YEAR(CURRENT_DATE()) – YEAR(birth) AS age
FROM pet;
+———-+————+——+
| name | birth | age |
+———-+————+——+
| Whistler | 1997-12-09 | 20 |
| Puffball | 1999-03-30 | 18 |
| Fluffy | 1993-02-04 | 24 |
| Claws | 1994-03-17 | 23 |
| Buffy | 1989-05-13 | 28 |
| Fang | 1990-08-27 | 27 |
| Bowser | 1989-08-31 | 28 |
| Chirpy | 1998-09-11 | 19 |
| Slim | 1996-04-29 | 21 |
+———-+————+——+
9 rows in set (0.00 sec)

mysql>

YEAR() 取得是年份,没毛病。

使用一个以上的表 

现在test数据路中只用一个pet表, 但是啊pets孤单寂寞啊,
他们需要另一张表来陪伴他们。这是脑残的客户们就有要求了。他们需要一张表记录pets的时间(event表)。要搞事情!!!

 图片 8

 

 

创建(create)一张表(event)
需要有petの名字(name)、事情发生的日期(date)、事情描述(remark)、事情的类型(type)。

操作如下:

CREATE TABLE event(name VARCHAR(20), date DATE, type VARCHAR(15), remark
VARCHAR(255));

mysql> CREATE TABLE event(
-> name VARCHAR(20),
-> date DATE,
-> type VARCHAR(15),
-> remark VARCHAR(255));
Query OK, 0 rows affected (0.74 sec)

mysql>

 

然后就要插入一些数据了如图:

图片 9

原谅我的鼠标吧

 

 

INSERT INTO event VALUES(‘Fluffy’,’1995-05-15′,’litter’,’4 kittens, 3
female, 1 mal
e’);

INSERT INTO event VALUES
(‘Buffy’,’1993-06-23′,’litter’,’5 puppies, 2 female, 3 male’),
(‘Buffy’,’1994-06-19′,’litter’,’3 puppies, 3 female’);

INSERT INTO event VALUES
(‘Chirpy’,’1999-03-21′,’vet’,’needed beak straightened’),
(‘Slim’,’1997-08-03′,’vet’,’broken rib’),
(‘Bowser’,’1991-10-12′,’kennel’,NULL),
(‘Fang’,’1991-10-12′,’kennel’,NULL),
(‘Fang’,’1998-08-28′,’birthday’,’Gave him a new chew toy’),
(‘Claws’,’1998-03-17′,’birthday’,’Gave him a new flea collar’),
(‘Whistler’,’1998-12-09′,’birthday’,’Fitst birthday’);

为了方便,我把我写的插入语句贴在上面了。(上面的洋文,我一个都不认识不知道敲的对不对)

 

 

 

不多墨迹了直接上操作:

SELECT pet.name, (YEAR(date) – YEAR(birth)) – (RIGHT(date,
5)<RIGHT(birth,5)) AS age, remark FROM pet, event WHERE pet.name =
event.name AND event.type = ‘litter’;

mysql> SELECT pet.name,
-> (YEAR(date) – YEAR(birth)) – (RIGHT(date,5)<RIGHT(birth,5)) AS
age,
-> remark
-> FROM pet, event
-> WHERE pet.name = event.name AND event.type = ‘litter’;
+——–+——+—————————–+
| name | age | remark |
+——–+——+—————————–+
| Fluffy | 2 | 4 kittens, 3 female, 1 male |
| Buffy | 4 | 5 puppies, 2 female, 3 male |
| Buffy | 5 | 3 puppies, 3 female |
+——–+——+—————————–+
3 rows in set (0.13 sec)

mysql>

 

反正就是pets几岁的时候当的母亲,生了啥啥啥之类的。

NOTE:对于两个表中有相同名字的字段要写成   表明.字段名(pet.name  
event.name);两个表的连接是靠pet.name = event.name
连接的。(后面会有高级的操作的这里就不多说)

 

还有一种操作就是将一个表分成两个表。。。。。

直接上栗子:pets交配, 同种,一公一母。

操作如下:

SELECT p1.name, p1.sex, p2.name, p2.sex, p1.species FROM pet AS p1, pet
AS p2 WHERE p1.species = p2.species AND p1.sex = ‘f’ AND p2.sex = ‘m’;

mysql> SELECT p1.name, p1.sex, p2.name, p2.sex, p1.species
-> FROM pet AS p1, pet AS p2
-> WHERE p1.species = p2.species AND p1.sex = ‘f’ AND p2.sex = ‘m’;
+——–+——+——–+——+———+
| name | sex | name | sex | species |
+——–+——+——–+——+———+
| Fluffy | f | Claws | m | cat |
| Buffy | f | Fang | m | dog |
| Buffy | f | Bowser | m | dog |
+——–+——+——–+——+———+
3 rows in set (0.00 sec)

mysql>

 

总感觉这个方法比直接找更麻烦呢(* ̄rǒ ̄)

 

to be continued

图片 10

计数行
直接上栗子:客户想要知道有多少pet了,
肿么办?(需要用到一个COUNT(*)的函数) 操作如下: SELECT…

分类行

 
年轻人,你可能注意到了,前面的栗子中的结果,是没有排好序的。这要是给你的老坂看的话,是要挨批的(虽然你愚蠢的老坂可能看不懂)。所以,就有了ORDER
BY 这个关键字

举个栗子:给pet们的出生日期排序。 不要问为什么,无聊。

操作如下:

SELECT name, birth FROM pet ORDER BY birth;

mysql> SELECT name, birth
-> FROM pet
-> ORDER BY birth;
+———-+————+
| name | birth |
+———-+————+
| Buffy | 1989-05-13 |
| Bowser | 1989-08-31 |
| Fang | 1990-08-27 |
| Fluffy | 1993-02-04 |
| Claws | 1994-03-17 |
| Slim | 1996-04-29 |
| Whistler | 1997-12-09 |
| Chirpy | 1998-09-11 |
| Puffball | 1999-03-30 |
+———-+————+
9 rows in set (0.18 sec)

mysql>

这样看起来就better了呢(然并卵)。

 顺便多一句嘴,有一个ORDER BY BINARY col_name 自己百度自己查

默认的排序是升序,最小的值在第一行。 

if(想要以降序排列){

    在排序的列名上增加DESC(降序)关键字

操作如下:

SELECT name, birth FROM pet ORDER BY birth DESC;

mysql> SELECT name, birth
-> FROM pet
-> ORDER BY birth DESC;
+———-+————+
| name | birth |
+———-+————+
| Puffball | 1999-03-30 |
| Chirpy | 1998-09-11 |
| Whistler | 1997-12-09 |
| Slim | 1996-04-29 |
| Claws | 1994-03-17 |
| Fluffy | 1993-02-04 |
| Fang | 1990-08-27 |
| Bowser | 1989-08-31 |
| Buffy | 1989-05-13 |
+———-+————+
9 rows in set (0.00 sec)

mysql>

 

还可以对多个列进行排序,
并且可以按不同的方向对不同的列进行排序。(书上写的好复杂啊)

举个例子:按升序对动物的种类进行排序,然后按降序根据生日对各动物种类进行排序(最年轻的动物在最前面)

操作如下:

SELECT name, species, birth FROM pet ORDER BY species, birth DESC;

mysql> SELECT name, species, birth
-> FROM pet
-> ORDER BY species, birth DESC;
+———-+———+————+
| name | species | birth |
+———-+———+————+
| Chirpy | bird | 1998-09-11 |
| Whistler | bird | 1997-12-09 |
| Claws | cat | 1994-03-17 |
| Fluffy | cat | 1993-02-04 |
| Fang | dog | 1990-08-27 |
| Bowser | dog | 1989-08-31 |
| Buffy | dog | 1989-05-13 |
| Puffball | hamster | 1999-03-30 |
| Slim | snake | 1996-04-29 |
+———-+———+————+
9 rows in set (0.08 sec)

mysql>

我的理解:二级排序,升序排动物五中,降序排年龄。

注意:(书真是为了你们操碎了心)DESC 关键字, 只影响了birth,
不影响species。

 

先写到这里吧。ヾ(≧O≦)〃嗷~

图片 11

 

接着前面的写
选择特殊的列
举个栗子:我想给这些pet们过身日,我就要知道pet们的名字和他们的生日。我该…

SELECT语句

语句的一般格式:

SELECT what_to_select

FROM which_table

WHERE conditions_to_satisfy;

这是一个简单的SELECT语句的基本格式了,详细复杂的以后再说。

插一个千年虫问题

温馨提示:这里很有可能遇到一个很经典的问题,叫千年虫问题。

SELECT YEAR(’89-01-01′);这个处理得到的是1989

mysql> select year(’89-01-01′);
+——————+
| year(’89-01-01′) |
+——————+
| 1989 |
+——————+
1 row in set (0.00 sec)

mysql>

 SELECT YEAR(’03-01-01′);这个得到的是2003

mysql> SELECT YEAR(’03-01-01′);
+——————+
| YEAR(’03-01-01′) |
+——————+
| 2003 |
+——————+
1 row in set (0.00 sec)

mysql>

 还有上古程序员跟我说个69 70 是个坎我试了一下

mysql> select year(’69-01-01′);
+——————+
| year(’69-01-01′) |
+——————+
| 2069 |
+——————+
1 row in set (0.00 sec)

mysql> select year(’70-01-01′);
+——————+
| year(’70-01-01′) |
+——————+
| 1970 |
+——————+
1 row in set (0.00 sec)

mysql>

 还真是。我的想法是计算机世界的第一天是:1970-01-01嘛。所以就有了这么一个坎。现在Java是可以到达1970-01-01之前的天数的,在这里不多说了。

 

 

好,书归正传。刚才我们给宠物们计算出了age
,然而一个懂Mysql的客户看到了很不满意。宠物的年龄应该按照过了生日计算(生下来算0岁)。

操作如下:

SELECT name, birth, CURDATE(), (YEAR(CURDATE()) – YEAR(birth)) –
(RIGHT(CURDATE(), 5) < RIGHT(birth, 5)) AS age FROM pet;

mysql> SELECT name, birth, CURDATE(),
-> (YEAR(CURDATE()) – YEAR(birth)) –
-> (RIGHT(CURDATE(), 5) < RIGHT(birth, 5)) AS age
-> FROM pet;
+———-+————+————+——+
| name | birth | CURDATE() | age |
+———-+————+————+——+
| Whistler | 1997-12-09 | 2017-05-26 | 19 |
| Puffball | 1999-03-30 | 2017-05-26 | 18 |
| Fluffy | 1993-02-04 | 2017-05-26 | 24 |
| Claws | 1994-03-17 | 2017-05-26 | 23 |
| Buffy | 1989-05-13 | 2017-05-26 | 28 |
| Fang | 1990-08-27 | 2017-05-26 | 26 |
| Bowser | 1989-08-31 | 2017-05-26 | 27 |
| Chirpy | 1998-09-11 | 2017-05-26 | 18 |
| Slim | 1996-04-29 | 2017-05-26 | 21 |
+———-+————+————+——+
9 rows in set (0.00 sec)

mysql>

 RIGHT(birth, 5)就是取到了生日的日期。

我这里又有一个大胆的想法:Mysql是C/C++开发的嘛
我就猜Mysql的运算中bool类型也是可以和int运算的。

 

又是一个栗子:其实还有一个漏洞,你没有注意到。有一个pet已经死了。死了怎么可能还有age呢?我们先查一下死去的pet有哪些。

操作如下:

SELECT name, birth, death,(YEAR(death)-YEAR(birth)) – (RIGHT(death,5)
< RIGHT(birth,5)) AS age FROM pet WHERE death IS NOT NULL;

mysql> SELECT name,birth,death,
-> (YEAR(death)-YEAR(birth)) –
-> (RIGHT(death,5)<RIGHT(birth,5)) AS age
-> FROM pet
-> WHERE death IS NOT NULL;
+——–+————+————+——+
| name | birth | death | age |
+——–+————+————+——+
| Bowser | 1989-08-31 | 1995-07-29 | 5 |
+——–+————+————+——+
1 row in set (0.00 sec)

mysql>

注意:NULL是特殊的值, 不能用普通的比较符比较

mysql> SELECT name,birth,death,
-> (YEAR(death)-YEAR(birth)) –
-> (RIGHT(death,5)<RIGHT(birth,5)) AS age
-> FROM pet
-> WHERE death != NULL;
Empty set (0.00 sec)

mysql>

 

刚才说了那么多关于YEAR()的日期提取函数, 其实还有很多 比如说 MONTH() 和
DAYOFMONTH() 这两个;

操作如下:

SELECT name, birth, MONTH(birth), DAYOFMONTH(birth) FROM pet ORDER BY
species DESC;

mysql> SELECT name, birth, MONTH(birth), DAYOFMONTH(birth)
-> FROM pet ORDER BY species DESC;
+———-+————+————–+——————-+
| name | birth | MONTH(birth) | DAYOFMONTH(birth) |
+———-+————+————–+——————-+
| Slim | 1996-04-29 | 4 | 29 |
| Puffball | 1999-03-30 | 3 | 30 |
| Buffy | 1989-05-13 | 5 | 13 |
| Fang | 1990-08-27 | 8 | 27 |
| Bowser | 1989-08-31 | 8 | 31 |
| Fluffy | 1993-02-04 | 2 | 4 |
| Claws | 1994-03-17 | 3 | 17 |
| Whistler | 1997-12-09 | 12 | 9 |
| Chirpy | 1998-09-11 | 9 | 11 |
+———-+————+————–+——————-+
9 rows in set (0.00 sec)

mysql>

 

接着往后面玩:假定当前月是4月(其实是五月),我要提前一个月准备给pet们过生日。So,我应该查找5月份过生日的pets。

操作如下:

SELECT name, birth FROM pet WHERE MONTH(birth) = 5;

mysql> SELECT name, birth
-> FROM pet
-> WHERE MONTH(birth) = 5;
+——-+————+
| name | birth |
+——-+————+
| Buffy | 1989-05-13 |
+——-+————+
1 row in set (0.22 sec)

mysql>

这时候,看喜欢套路的你肯定会知道。问题难度要小小升级一下。

 

现在我不知道现在是几月份,我就是想要小个月准备给pets过生日。What should
I do ?

操作如下:

SELECT name, birth FROM pet WHERE MONTH(birth) = MONTH(CURDATE()) + 1;

然而天天日代码的老司机们都知道!上面的操作一定是假的。这是有问题的!

当我要给一月份的pets准备生日我用上面的语句能查到吗?查不到,根本就没有0月!

 

那经验丰富的程序员们一定在心中有一个大胆的想法:Mysql中是不是有’%’啊?

没错,是有的。

操作如下:

SELECT name, birth FROM pet WHERE MONTH(birth) = MOD(MONTH(CURDATE()),
12) + 1;

mysql> SELECT name,birth
-> FROM pet
-> WHERE MONTH(birth) = MOD(MONTH(CURDATE()), 12) + 1;
Empty set (0.00 sec)

mysql> SELECT NOW();
+———————+
| NOW() |
+———————+
| 2017-05-26 16:01:09 |
+———————+
1 row in set (0.04 sec)

mysql>

 …这TM就尴尬了,没有在6月份过生日的pet.

没关系,我们的套路继续(书上的套路继续)。下面给出书上的另一种方法。

操作如下:

SELECT name, birth FROM pet WHERE MONTH(birth) =
MONTH(DATE_ADD(CURDATE(), INTERVAL 1 MONTH));

mysql> SELECT name, birth FROM pet
-> WHERE MONTH(birth) = MONTH(DATE_ADD(CURDATE(), INTERVAL 1
MONTH));
Empty set (0.10 sec)

mysql>

这里用到了一个DATE_ADD()函数,具体的讲解给大家一个传送门。如果传送门失效了,那就去百度吧骚年。

 

to be continued…

图片 12

日期计算
MySQL提供了几个函数, 可以用来计算日期。巴拉拉拉。。。。
举个例子:我想要确定pet们有多大,…

选择所有数据

SELECT最简单的形式是从一个表中检索所有记录:

mysql> SELECT * FROM pet;
+———-+——–+———+——+————+————+
| name | owner | species | sex | birth | death |
+———-+——–+———+——+————+————+
| Whistler | Gwen | bird | NULL | 1997-12-09 | NULL |
| Puffball | Diane | hamster | f | 1999-03-30 | NULL |
| Fluffy | Harold | cat | f | 1993-02-04 | NULL |
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
| Fang | Benny | dog | m | 1990-08-27 | NULL |
| Bowser | Diane | dog | m | 1979-08-31 | 1995-07-29 |
| Chirpy | Gwen | bird | f | 1998-09-11 | NULL |
| Slim | Benny | snake | m | 1996-04-29 | NULL |
+———-+——–+———+——+————+————+
9 rows in set (0.00 sec)

mysql>

没错!就是有这种操作,厉不厉害。(๑•ᴗ•๑)

 

简单讲一讲(其实没讲)UPDATE语句

现在能看见表中的所有数据了,你就何以检查表中的数据有没有错误了。

这时候你突然发现(书上提示的),Bowser的出生日期不对呀,应该是1989年出生的,而不是1979年。

So,你就想怎么更改这条数据。于是你在某一个月光下的夜晚,你悄悄的删除(DELETE)了表中的所有数据,又在pet.txt文件中更改了回来,重新将pet.txt导入(LOAD DATA)到表中。这样做显然是非常愚蠢的。

然而,在很久很久以前上神们曾经创造过这样的一个命令 UPDATE
用于更改有问题的记录用的。

mysql> UPDATE pet SET birth = ‘1989-08-31’ WHERE name = ‘Bowser’;
Query OK, 1 row affected (0.18 sec)
Rows matched: 1 Changed: 1 Warnings: 0

mysql>

这样就更改了错误的数据。

 

选择特殊行

举个栗子:刚才我用上神赐予我的UPDATE语句,更改了Bowser的生日,我想看一看有木有更改成功。

操作如下:

SELECT * FROM pet WHERE name = ‘Bowser’;

mysql> SELECT *
-> FROM pet
-> WHERE name = ‘Bowser’;
+——–+——-+———+——+————+————+
| name | owner | species | sex | birth | death |
+——–+——-+———+——+————+————+
| Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |
+——–+——-+———+——+————+————+
1 row in set (0.00 sec)

mysql>

嗯。。。看来上神没有骗我们

 

接着举个例子:我想要知道哪个动物在1998年以后出生的

操作如下:

SELECT * FROM pet WHERE birth > ‘1998-1-1’;

mysql> SELECT *
-> FROM pet
-> WHERE birth > ‘1998-01-01’;
+———-+——-+———+——+————+——-+
| name | owner | species | sex | birth | death |
+———-+——-+———+——+————+——-+
| Puffball | Diane | hamster | f | 1999-03-30 | NULL |
| Chirpy | Gwen | bird | f | 1998-09-11 | NULL |
+———-+——-+———+——+————+——-+
2 rows in set (0.14 sec)

mysql>

 

接着举个栗子:我想要给我们家李狗蛋找一个小母狗交配,我就要找一个小母狗
作为李狗蛋的交配对象。

操作如下:

SELECT * FROM pet WHERE species = ‘dog’ AND sex = ‘f’;

mysql> SELECT *
-> FROM pet
-> WHERE species = ‘dog’ AND sex = ‘f’;
+——-+——–+———+——+————+——-+
| name | owner | species | sex | birth | death |
+——-+——–+———+——+————+——-+
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+——-+——–+———+——+————+——-+
1 row in set (0.00 sec)

mysql>

很好,我们李家有后了。

 

还是一个栗子:没有故事了

操作如下:

SELECT * FROM get WHERE species = ‘snake’ OR species = ‘bird’;

mysql> SELECT *
-> FROM pet
-> WHERE species = ‘snake’ OR species = ‘bird’;
+———-+——-+———+——+————+——-+
| name | owner | species | sex | birth | death |
+———-+——-+———+——+————+——-+
| Whistler | Gwen | bird | NULL | 1997-12-09 | NULL |
| Chirpy | Gwen | bird | f | 1998-09-11 | NULL |
| Slim | Benny | snake | m | 1996-04-29 | NULL |
+———-+——-+———+——+————+——-+
3 rows in set (0.00 sec)

mysql>

 

又是一个栗子:真的没有故事了 只是想说AND 和OR 可以混用,but AND 比 OR
具有更高的优先级,So像我这样的老司机都是加括号的(为了方便愚蠢的凡人们阅读)。

操作如下:

SELECT * FROM pet WHERE (species = ‘cat’ AND sex = ‘m’) OR (species =
‘dog’ AND sex = ‘f’);

mysql> SELECT *
-> FROM pet
-> WHERE (species = ‘cat’ AND sex = ‘m’)
-> OR (species = ‘dog’ AND sex = ‘f’);
+——-+——–+———+——+————+——-+
| name | owner | species | sex | birth | death |
+——-+——–+———+——+————+——-+
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+——-+——–+———+——+————+——-+
2 rows in set (0.00 sec)

mysql>

 好气呀,后面还有很多没有讲完。

图片 13

从表检索信息
在前面,我, 创建了一个数据库test 进入数据库 创建了一个表pet
插入了一些数据。那么问题…

相关文章