1. 程式人生 > >MySQL入門(參考官網)

MySQL入門(參考官網)

目錄

一、登陸和退出

1. 遠端主機

shell> mysql -h host -u user -p
Enter password: ********
Welcome to the MySQL monitor.  Commands end with ; or \g.

mysql>

2. 登陸本機

shell> mysql -u user -p

3. 退出mysql

mysql> QUIT

二、輸入查詢

查詢版本號和當前日期

mysql> SELECT VERSION(), CURRENT_DATE;
+-----------+--------------+
| VERSION() | CURRENT_DATE |
+-----------+--------------+
| 5.7.24    | 2018-11-12   |
+-----------+--------------+
1 row in set (0.01 sec)

mysql>

大小寫不敏感

把mysql當計算器用

mysql> SELECT SIN(PI()/4), (4+1)*5;
+--------------------+---------+
| SIN(PI()/4)        | (4+1)*5 |
+--------------------+---------+
| 0.7071067811865476 |      25 |
+--------------------+---------+
1 row in set (0.01 sec)

在一行上輸入多個語句。分號結束每一個命令:

mysql> SELECT VERSION(); SELECT NOW();
+-----------+
| VERSION() |
+-----------+
| 5.7.24    |
+-----------+
1 row in set (0.00 sec)

+---------------------+
| NOW()               |
+---------------------+
| 2018-11-13 00:10:14 |
+---------------------+
1 row in set (0.00 sec)

mysql 通過 查詢終止分號;來確定語句的結束位置

mysql> SELECT
    -> USER()
    -> ,
    -> CURRENT_DATE;
+----------------+--------------+
| USER()         | CURRENT_DATE |
+----------------+--------------+
| [email protected] | 2018-11-13   |
+----------------+--------------+
1 row in set (0.00 sec)

mysql> SELECT USER(),CURRENT_DATE;
+----------------+--------------+
| USER()         | CURRENT_DATE |
+----------------+--------------+
| [email protected] | 2018-11-13   |
+----------------+--------------+
1 row in set (0.00 sec)

通過鍵入以下內容取消該查詢:\c

mysql> SELECT
    -> USER()
    -> \c

三、建立和使用資料庫

展示存在的資料庫

mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| falcon             |
| mysql              |
| performance_schema |
| sys                |
+--------------------+

使用資料庫

mysql> USE test
Database changed
shell> mysql -h host -u user -p menagerie
Enter password: ********

3.1 建立和選擇資料庫

mysql> CREATE DATABASE menagerie;
mysql> USE menagerie
Database changed

3.2 建立表

mysql> SHOW TABLES;
Empty set (0.00 sec)

建立表

mysql> CREATE TABLE pet (name VARCHAR(20), owner VARCHAR(20),
    -> species VARCHAR(20), sex CHAR(1), birth DATE, death DATE);

展示表單:

mysql> SHOW TABLES;
+---------------------+
| Tables_in_menagerie |
+---------------------+
| pet                 |
+---------------------+
1 row in set (0.00 sec)

描述表單

mysql> DESCRIBE pet;
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| name    | varchar(20) | YES  |     | NULL    |       |
| owner   | varchar(20) | YES  |     | NULL    |       |
| species | varchar(20) | YES  |     | NULL    |       |
| sex     | char(1)     | YES  |     | NULL    |       |
| birth   | date        | YES  |     | NULL    |       |
| death   | date        | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+
6 rows in set (0.01 sec)

3.3 將資料載入到表中

建立表格以後需要:

name owner species sex birth death
Fluffy Harold cat f 1993-02-04
Claws Gwen cat m 1994-03-17
Buffy Harold dog f 1989-05-13
Fang Benny dog m 1990-08-27
Bowser Diane dog m 1979-08-31 1995-07-29
Chirpy Gwen bird f 1998-09-11
Whistler Gwen bird 1997-12-09
Slim Benny snake m 1996-04-29

儲存為pet.txt

從excel中直接複製到pet.txt,空值用\N 表示

Whistler        Gwen    bird    \N      1997-12-09      \N

3.3.1 匯入資料

LOAD DATA LOCAL INFILE 'D:/Temp/pet.txt' INTO TABLE pet;

win編輯器

mysql> LOAD DATA LOCAL INFILE '/path/pet.txt' INTO TABLE pet
    -> LINES TERMINATED BY '\r\n';

在執行 os x 的 apple 計算機上, 您可能想要使用。LINES TERMINATED BY '\r'

3.3.2 插入語句

mysql> INSERT INTO pet
    -> VALUES ('Puffball','Diane','hamster','f','1999-03-30',NULL);

3.4 操作表格

SELECT 語法:

SELECT what_to_select
FROM which_table
WHERE conditions_to_satisfy;

3.4.1 查詢所有資料

mysql> SELECT * FROM pet;
+----------+--------+---------+------+------------+------------+
| name     | owner  | species | sex  | birth      | death      |
+----------+--------+---------+------+------------+------------+
| 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       |
| Whistler | Gwen   | bird    | NULL | 1997-12-09 | NULL       |
| Slim     | Benny  | snake   | m    | 1996-04-29 | NULL       |
| Puffball | Diane  | hamster | f    | 1999-03-30 | NULL       |
+----------+--------+---------+------+------------+------------+

update 語句修復錯誤記錄 :

mysql> UPDATE pet SET birth = '1989-08-31' WHERE name = 'Bowser';

3.4.2 查詢某行

選擇特定行:

mysql> SELECT * FROM pet WHERE name = 'Bowser';
+--------+-------+---------+------+------------+------------+
| name   | owner | species | sex  | birth      | death      |
+--------+-------+---------+------+------------+------------+
| Bowser | Diane | dog     | m    | 1989-08-31 | 1995-07-29 |
+--------+-------+---------+------+------------+------------+

選擇特定條件:

mysql>  SELECT * FROM pet WHERE birth >= '1998-1-1';
+----------+-------+---------+------+------------+------------+
| name     | owner | species | sex  | birth      | death      |
+----------+-------+---------+------+------------+------------+
| Chirpy   | Gwen  | bird    | f    | 1998-09-11 | 0000-00-00 |
| Puffball | Diane | hamster | f    | 1999-03-30 | NULL       |
+----------+-------+---------+------+------------+------------+

條件and:

mysql> SELECT * FROM pet WHERE species = 'dog' AND sex = 'f';
+-------+--------+---------+------+------------+------------+
| name  | owner  | species | sex  | birth      | death      |
+-------+--------+---------+------+------------+------------+
| Buffy | Harold | dog     | f    | 1989-05-13 | 0000-00-00 |
+-------+--------+---------+------+------------+------------+

條件or:

mysql> SELECT * FROM pet WHERE species = 'snake' OR species = 'bird';
+----------+-------+---------+------+------------+------------+
| name     | owner | species | sex  | birth      | death      |
+----------+-------+---------+------+------------+------------+
| Chirpy   | Gwen  | bird    | f    | 1998-09-11 | 0000-00-00 |
| Whistler | Gwen  | bird    |      | 1997-12-09 | 0000-00-00 |
| Slim     | Benny | snake   | m    | 1996-04-29 | 0000-00-00 |
+----------+-------+---------+------+------------+------------+

and 、 or 混合使用:

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 | 0000-00-00 |
| Buffy | Harold | dog     | f    | 1989-05-13 | 0000-00-00 |
+-------+--------+---------+------+------------+------------+

3.4.3 查詢某列

選擇某列,按照 ,分隔

mysql> SELECT name`,` birth FROM pet;
+----------+------------+   
| name     | birth      |
+----------+------------+
| name     | 0000-00-00 |
| Fluffy   | 1993-02-04 |
| Claws    | 1994-03-17 |
| Buffy    | 1989-05-13 |
| Fang     | 1990-08-27 |
| Bowser   | 1989-08-31 |
| Chirpy   | 1998-09-11 |
| Whistler | 1997-12-09 |
| Slim     | 1996-04-29 |
| Puffball | 1999-03-30 |
+----------+------------+

選擇動物主人:

mysql> SELECT owner FROM pet;
+--------+
| owner  |
+--------+
| owner  |
| Harold |
| Gwen   |
| Harold |
| Benny  |
| Diane  |
| Gwen   |
| Gwen   |
| Benny  |
| Diane  |
+--------+

使用DISTINCT去重

mysql> SELECT DISTINCT owner FROM pet;
+--------+
| owner  |
+--------+
| owner  |
| Harold |
| Gwen   |
| Benny  |
| Diane  |
+--------+

使用WHERE條件查詢

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 |
+--------+---------+------------+

3.4.4 排序行

使用ORDER BY ,預設升序

mysql>  SELECT name, birth FROM pet ORDER BY birth;
+----------+------------+
| name     | birth      |
+----------+------------+
| name     | 0000-00-00 |
| 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 |
+----------+------------+

預設不區分大小寫排序,如果要區分使用:

ORDER BY BINARY col_name

BINARY:轉換為二進位制字元,方便排序

使用ORDER BY ,預設升序,如果降序,新增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 |
| name     | 0000-00-00 |
+----------+------------+

多個列排序:

先按照動物種類升序,然後按照出生日期降序

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 |
| name     | species | 0000-00-00 |
+----------+---------+------------+

3.4.5 ‎日期計算

TIMESTAMPDIFF():時間差函式

mysql> SELECT TIMESTAMPDIFF(YEAR,'1989-08-31',CURDATE());
+--------------------------------------------+
| TIMESTAMPDIFF(YEAR,'1989-08-31',CURDATE()) |
+--------------------------------------------+
|                                         29 |
+--------------------------------------------+

常用時間函式:

mysql> SELECT NOW(),CURDATE(),CURTIME();
+---------------------+------------+-----------+
| NOW()               | CURDATE()  | CURTIME() |
+---------------------+------------+-----------+
| 2018-11-13 10:21:28 | 2018-11-13 | 10:21:28  |
+---------------------+------------+-----------+

查詢顯示每個寵物的出生日期、當前日期,用age做別名

mysql> SELECT name, birth, CURDATE(),
    -> TIMESTAMPDIFF(YEAR,birth,CURDATE()) AS age
    -> FROM pet;
+----------+------------+------------+------+
| name     | birth      | CURDATE()  | age  |
+----------+------------+------------+------+
| Fluffy   | 1993-02-04 | 2018-11-13 |   25 |
| Claws    | 1994-03-17 | 2018-11-13 |   24 |
| Buffy    | 1989-05-13 | 2018-11-13 |   29 |
| Fang     | 1990-08-27 | 2018-11-13 |   28 |
| Bowser   | 1989-08-31 | 2018-11-13 |   29 |
| Chirpy   | 1998-09-11 | 2018-11-13 |   20 |
| Whistler | 1997-12-09 | 2018-11-13 |   20 |
| Slim     | 1996-04-29 | 2018-11-13 |   22 |
| Puffball | 1999-03-30 | 2018-11-13 |   19 |
+----------+------------+------------+------+

查詢同時 按照姓名排序

mysql> SELECT name, birth, CURDATE(),
    -> TIMESTAMPDIFF(YEAR,birth,CURDATE()) AS age
    -> FROM pet ORDER BY name;
+----------+------------+------------+------+
| name     | birth      | CURDATE()  | age  |
+----------+------------+------------+------+
| Bowser   | 1989-08-31 | 2018-11-13 |   29 |
| Buffy    | 1989-05-13 | 2018-11-13 |   29 |
| Chirpy   | 1998-09-11 | 2018-11-13 |   20 |
| Claws    | 1994-03-17 | 2018-11-13 |   24 |
| Fang     | 1990-08-27 | 2018-11-13 |   28 |
| Fluffy   | 1993-02-04 | 2018-11-13 |   25 |
| Puffball | 1999-03-30 | 2018-11-13 |   19 |
| Slim     | 1996-04-29 | 2018-11-13 |   22 |
| Whistler | 1997-12-09 | 2018-11-13 |   20 |
+----------+------------+------------+------+

查詢同時 按照年齡排序

mysql> SELECT name, birth, CURDATE(),
    -> TIMESTAMPDIFF(YEAR,birth,CURDATE()) AS age
    -> FROM pet ORDER BY age;
+----------+------------+------------+------+
| name     | birth      | CURDATE()  | age  |
+----------+------------+------------+------+
| Puffball | 1999-03-30 | 2018-11-13 |   19 |
| Chirpy   | 1998-09-11 | 2018-11-13 |   20 |
| Whistler | 1997-12-09 | 2018-11-13 |   20 |
| Slim     | 1996-04-29 | 2018-11-13 |   22 |
| Claws    | 1994-03-17 | 2018-11-13 |   24 |
| Fluffy   | 1993-02-04 | 2018-11-13 |   25 |
| Fang     | 1990-08-27 | 2018-11-13 |   28 |
| Buffy    | 1989-05-13 | 2018-11-13 |   29 |
| Bowser   | 1989-08-31 | 2018-11-13 |   29 |
+----------+------------+------------+------+

查詢已經死亡的寵物

把預設匯入的數值從'0000-00-00' 改成'NUll'

關於NULL

UPDATE pet SET death = NULL WHERE death= 0000-00-00;
mysql> SELECT name, birth, death,
    -> TIMESTAMPDIFF(YEAR,birth,death) AS age
    -> FROM pet WHERE death IS NOT NULL ORDER BY age;
+--------+------------+------------+------+
| name   | birth      | death      | age  |
+--------+------------+------------+------+
| Bowser | 1989-08-31 | 1995-07-29 |    5 |
+--------+------------+------------+------+

MySQL 的一些日期函式:

mysql> SELECT YEAR('1987-01-01');
+--------------------+
| YEAR('1987-01-01') |
+--------------------+
|               1987 |
+--------------------+
mysql> SELECT MONTH('2008-02-03');
+---------------------+
| MONTH('2008-02-03') |
+---------------------+
|                   2 |
+---------------------+
mysql> SELECT MONTHNAME('2008-02-03');
+-------------------------+
| MONTHNAME('2008-02-03') |
+-------------------------+
| February                |
+-------------------------+

現在是今年的 多少天 多少周

mysql> SELECT DAYOFYEAR(now()),WEEKOFYEAR(now());
+------------------+-------------------+
| DAYOFYEAR(now()) | WEEKOFYEAR(now()) |
+------------------+-------------------+
|              317 |                46 |
+------------------+-------------------+

2008-01-03第多少天,多少周

mysql> SELECT DAYOFYEAR('2008-01-03'),WEEKOFYEAR('2008-01-03');
+-------------------------+--------------------------+
| DAYOFYEAR('2008-01-03') | WEEKOFYEAR('2008-01-03') |
+-------------------------+--------------------------+
|                       3 |                        1 |
+-------------------------+--------------------------+

查詢寵物出生月

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

查詢5月出生的寵物

mysql> SELECT name, birth FROM pet WHERE MONTH(birth) = 5;
+-------+------------+
| name  | birth      |
+-------+------------+
| Buffy | 1989-05-13 |
+-------+------------+

2018-05-01 新增1天

mysql> SELECT DATE_ADD('2018-05-01',INTERVAL 1 DAY);
+---------------------------------------+
| DATE_ADD('2018-05-01',INTERVAL 1 DAY) |
+---------------------------------------+
| 2018-05-02                            |
+---------------------------------------+

查詢下個月是哪個月

mysql> SELECT  MONTH(DATE_ADD(CURDATE(),INTERVAL 1 MONTH));
+---------------------------------------------+
| MONTH(DATE_ADD(CURDATE(),INTERVAL 1 MONTH)) |
+---------------------------------------------+
|                                          12 |
+---------------------------------------------+

查詢即將生日的寵物,距離目前最近的一個月

  • 方法1:當前月份+1個月
mysql> SELECT name, birth FROM pet
    ->  WHERE MONTH(birth) = MONTH(DATE_ADD(CURDATE(),INTERVAL 1 MONTH));
+----------+------------+
| name     | birth      |
+----------+------------+
| Whistler | 1997-12-09 |
+----------+------------+
  • 方法2:當前月份取餘+1
mysql> SELECT name, birth FROM pet
    -> WHERE MONTH(birth) = MOD(MONTH(CURDATE()), 12) + 1;
+----------+------------+
| name     | birth      |
+----------+------------+
| Whistler | 1997-12-09 |
+----------+------------+
  • MOD(12, 5)
mysql> SELECT MOD(12, 5);
+------------+
| MOD(12, 5) |
+------------+
|          2 |
+------------+

3.4.6 使用空值

NULL value :a missing unknown value,要和其他值區別對待

測試NULL,使用

mysql> SELECT 1 IS NULL, 1 IS NOT NULL;
+-----------+---------------+
| 1 IS NULL | 1 IS NOT NULL |
+-----------+---------------+
|         0 |             1 |
+-----------+---------------+
mysql> SELECT 0 IS NULL, 0 IS NOT NULL, '' IS NULL, '' IS NOT NULL;
+-----------+---------------+------------+----------------+
| 0 IS NULL | 0 IS NOT NULL | '' IS NULL | '' IS NOT NULL |
+-----------+---------------+------------+----------------+
|         0 |             1 |          0 |              1 |
+-----------+---------------+------------+----------------+

不能使用算術筆記用算符判斷null

=, <, or <>

3.4.7 匹配方式

  1. 標準的 sql 模式匹配
  2. 正則表示式的模式匹配
  3. 預設不區分大小寫

標準匹配

使用:

查詢b開頭的名字:

mysql> SELECT * FROM pet WHERE name LIKE 'b%';
+--------+--------+---------+------+------------+------------+
| name   | owner  | species | sex  | birth      | death      |
+--------+--------+---------+------+------------+------------+
| Buffy  | Harold | dog     | f    | 1989-05-13 | NULL       |
| Bowser | Diane  | dog     | m    | 1989-08-31 | 1995-07-29 |
+--------+--------+---------+------+------------+------------+

查詢fy結尾的名字:

mysql> SELECT * FROM pet WHERE name LIKE '%fy';
+--------+--------+---------+------+------------+-------+
| name   | owner  | species | sex  | birth      | death |
+--------+--------+---------+------+------------+-------+
| Fluffy | Harold | cat     | f    | 1993-02-04 | NULL  |
| Buffy  | Harold | dog     | f    | 1989-05-13 | NULL  |

查詢名字包含一個w:

mysql> SELECT * FROM pet WHERE name LIKE '%w%';
+----------+-------+---------+------+------------+------------+
| name     | owner | species | sex  | birth      | death      |
+----------+-------+---------+------+------------+------------+
| Claws    | Gwen  | cat     | m    | 1994-03-17 | NULL       |
| Bowser   | Diane | dog     | m    | 1989-08-31 | 1995-07-29 |
| Whistler | Gwen  | bird    | NULL | 1997-12-09 | NULL       |
+----------+-------+---------+------+------------+------------+

查詢名字是5個字元的:

mysql> SELECT * FROM pet WHERE name LIKE '_____';
+-------+--------+---------+------+------------+-------+
| name  | owner  | species | sex  | birth      | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen   | cat     | m    | 1994-03-17 | NULL  |
| Buffy | Harold | dog     | f    | 1989-05-13 | NULL  |
+-------+--------+---------+------+------------+-------+

正則匹配

使用:

RLIKE NOT RLIKE 和上述等價

查詢b開頭的名字:

mysql> SELECT * FROM pet WHERE name REGEXP '^b';
+--------+--------+---------+------+------------+------------+
| name   | owner  | species | sex  | birth      | death      |
+--------+--------+---------+------+------------+------------+
| Buffy  | Harold | dog     | f    | 1989-05-13 | NULL       |
| Bowser | Diane  | dog     | m    | 1989-08-31 | 1995-07-29 |
+--------+--------+---------+------+------------+------------+

若要強制regexp比較區分大小寫, 請使用binary關鍵字將其中一個字串設定為二進位制字串。

匹配名稱由小寫:b開頭

SELECT * FROM pet WHERE name REGEXP BINARY '^b';

查詢fy結尾的名字:

mysql> SELECT * FROM pet WHERE name REGEXP 'fy$';
+--------+--------+---------+------+------------+-------+
| name   | owner  | species | sex  | birth      | death |
+--------+--------+---------+------+------------+-------+
| Fluffy | Harold | cat     | f    | 1993-02-04 | NULL  |
| Buffy  | Harold | dog     | f    | 1989-05-13 | NULL  |
+--------+--------+---------+------+------------+-------+

查詢名字包含一個w:

mysql> SELECT * FROM pet WHERE name REGEXP 'w';
+----------+-------+---------+------+------------+------------+
| name     | owner | species | sex  | birth      | death      |
+----------+-------+---------+------+------------+------------+
| Claws    | Gwen  | cat     | m    | 1994-03-17 | NULL       |
| Bowser   | Diane | dog     | m    | 1989-08-31 | 1995-07-29 |
| Whistler | Gwen  | bird    | NULL | 1997-12-09 | NULL       |
+----------+-------+---------+------+------------+------------+

查詢名字是5個字元的

mysql> SELECT * FROM pet WHERE name REGEXP '^.....$';
+-------+--------+---------+------+------------+-------+
| name  | owner  | species | sex  | birth      | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen   | cat     | m    | 1994-03-17 | NULL  |
| Buffy | Harold | dog     | f    | 1989-05-13 | NULL  |
+-------+--------+---------+------+------------+-------+

或者^.{5}$^開頭$結尾

mysql> SELECT * FROM pet WHERE name REGEXP '^.{5}$';
+-------+--------+---------+------+------------+-------+
| name  | owner  | species | sex  | birth      | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen   | cat     | m    | 1994-03-17 | NULL  |
| Buffy | Harold | dog     | f    | 1989-05-13 | NULL  |
+-------+--------+---------+------+------------+-------+

3.4.8 統計行

COUNT(*) 統計函式

統計行數

mysql> SELECT COUNT(*) FROM pet;
+----------+
| COUNT(*) |
+----------+
|        9 |
+----------+

統計每個人有多少隻寵物

mysql>  SELECT owner, COUNT(*) FROM pet GROUP BY owner;
+--------+----------+
| owner  | COUNT(*) |
+--------+----------+
| Benny  |        2 |
| Diane  |        2 |
| Gwen   |        3 |
| Harold |        2 |
+--------+----------+

統計每種動物的數量:

mysql> SELECT species, COUNT(*) FROM pet GROUP BY species;
+---------+----------+
| species | COUNT(*) |
+---------+----------+
| bird    |        2 |
| cat     |        2 |
| dog     |        3 |
| hamster |        1 |
| snake   |        1 |

統計物種性別:

mysql> SELECT sex, COUNT(*) FROM pet GROUP BY sex;
+------+----------+
| sex  | COUNT(*) |
+------+----------+
| NULL |        1 |
| f    |        4 |
| m    |        4 |
+------+----------+

物種和性別的組合:

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 |
+---------+------+----------+

只針對某個欄位篩選,不用篩選整行

選擇cat 和 dog種類,按照性別物種組合

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 |
+---------+------+----------+

列出已知動物性別:

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 |
+---------+------+----------+

ONLY_FULL_GROUP_BY

mysql> SET sql_mode = 'ONLY_FULL_GROUP_BY';-- 啟用
mysql> SELECT owner, COUNT(*) FROM pet;
ERROR 1140 (42000):

ONLY_FULL_GROUP_BY 關閉後,結果不確定,系統隨意新增一個值,最好關閉

mysql> SET sql_mode = '';   -- 關閉
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT owner, COUNT(*) FROM pet;
+--------+----------+
| owner  | COUNT(*) |
+--------+----------+
| Harold |        9 |
+--------+----------+


mysql> SELECT owner, COUNT(*) FROM pet GROUP BY owner;
+--------+----------+
| owner  | COUNT(*) |
+--------+----------+
| Benny  |        2 |
| Diane  |        2 |
| Gwen   |        3 |
| Harold |        2 |
+--------+----------+

3.4.9 使用多個表

此表格跟蹤記錄你的寵物,當你想記錄他們的資訊,比如看獸醫、生幼崽、買玩具等事件,就需要另外一個表單記錄,需要如下資訊:

  • 寵物名稱:name
  • 事件日期:date
  • 事件型別:type
  • 事件描述:emark

CREATE ABLE

建立表一個符合上述要素的表單:

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

將下述內容儲存為event.txt

name date type remark
Fluffy 1995-05-15 litter 4 kittens, 3 female, 1 male
Buffy 1993-06-23 litter 5 puppies, 2 female, 3 male
Buffy 1994-06-19 litter 3 puppies, 3 female
Chirpy 1999-03-21 vet needed beak straightened
Slim 1997-08-03 vet broken rib
Bowser 1991-10-12 kennel
Fang 1991-10-12 kennel
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 First birthday

匯入內容到表單

mysql> LOAD DATA LOCAL INFILE 'event.txt' INTO TABLE event;

假設:想知道每個寵物下崽時的年齡,寵物媽媽下崽時間在event表單,但是,出生日期在pet表單,所以要同時查詢2個表單。

mysql> SELECT pet.name,
    -> TIMESTAMPDIFF(YEAR,birth,date) AS age,
    -> remark
    -> FROM pet INNER JOIN event
    ->   ON pet.name = event.name
    -> WHERE event.type = 'litter';
+--------+------+------------------------------+
| name   | age  | remark                       |
+--------+------+------------------------------+
 |Fluffy |    2 | 4 kittens, 3 female, 1 male
 |Buffy  |    4 | 5 puppies, 2 female, 3 male
         |    5 | 3 puppies, 3 female
+--------+------+------------------------------+

jion表單:

  • 是為從兩張表獲取資訊
  • 需要指定匹配規則,上述例子都有'name'
  • 需要指定字首ON pet.name = event.name

表的自身連線

寵物的雌雄配對:

mysql> SELECT p1.name, p1.sex, p2.name, p2.sex, p1.species
    -> FROM pet AS p1 INNER JOIN pet AS p2
    ->    ON 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.4 獲取資料庫和表的資訊

檢視目前使用的資料庫

mysql> SELECT DATABASE();
+------------+
| DATABASE() |
+------------+
| menagerie  |
+------------+

查看錶

mysql> SHOW TABLES;
+---------------------+
| Tables_in_menagerie |
+---------------------+
| event               |
| pet                 |
+---------------------+

查看錶結構

mysql> DESCRIBE pet;
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| name    | varchar(20) | YES  |     | NULL    |       |
| owner   | varchar(20) | YES  |     | NULL    |       |
| species | varchar(20) | YES  |     | NULL    |       |
| sex     | char(1)     | YES  |     | NULL    |       |
| birth   | date        | YES  |     | NULL    |       |
| death   | date        | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+

3.5 批處理模式

在mysql內執行指令碼:

mysql> source filename;
mysql> \. filename

來源MySQL官網