mysql教程


1.查看mysql幫助信息
 
C:\Users\zhangcunli>mysql --help
mysql  Ver 14.14 Distrib 5.7.9, for Win64 (x86_64)
Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.
 
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
 
Usage: mysql [OPTIONS] [database]
  -?, --help          Display this help and exit.
  -I, --help          Synonym for -?
  --auto-rehash       Enable automatic rehashing. One doesn't need to use
                      'rehash' to get table and field completion, but startup
                      and reconnecting may take a longer time. Disable with
                      --disable-auto-rehash.
 
 
2.鏈接mysql數據庫(服務)
 
方法一:
C:\Users\zhangcunli>mysql -h localhost -u cunli -p
Enter password: *****
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 12
Server version: 5.7.9-log MySQL Community Server (GPL)
 
Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.
 
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
 
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 
mysql>
 
 
方法二:
C:\Users\zhangcunli>mysql -u cunli -p
Enter password: *****
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 13
Server version: 5.7.9-log MySQL Community Server (GPL)
 
Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.
 
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
 
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 
mysql>
 
 
3.退出mysql數據庫(服務)
 
mysql> QUIT
Bye
 
4.查詢mysql當前版本和當前日期
 
mysql> SELECT VERSION(), CURRENT_DATE;
+-----------+--------------+
| VERSION() | CURRENT_DATE |
+-----------+--------------+
| 5.7.9-log | 2016-02-16   |
+-----------+--------------+
1 row in set (0.00 sec)
 
mysql>
 
5.mysql語句大小寫效果相同
 
mysql> SELECT VERSION(), CURRENT_DATE;
mysql> select version(), current_date;
mysql> SeLeCt vErSiOn(), current_DATE;
6.可以用mysql進行簡單的計算
 
mysql> SELECT SIN(PI()/4), (4+1)*5;
+--------------------+---------+
| SIN(PI()/4)        | (4+1)*5 |
+--------------------+---------+
| 0.7071067811865476 |      25 |
+--------------------+---------+
1 row in set (0.14 sec)
 
 
7.可以把多條查詢語句放在一行執行,只要每行以分號結尾。
 
mysql> SELECT VERSION(); SELECT NOW();
+-----------+
| VERSION() |
+-----------+
| 5.7.9-log |
+-----------+
1 row in set (0.00 sec)
 
+---------------------+
| NOW()               |
+---------------------+
| 2016-02-16 15:06:29 |
+---------------------+
1 row in set (0.00 sec)
 
一個簡單的多行聲明:
 
mysql> SELECT
    -> USER()
    -> ,
    -> CURRENT_DATE;
+-----------------+--------------+
| USER()          | CURRENT_DATE |
+-----------------+--------------+
cunli@localhost | 2016-02-16   |
+-----------------+--------------+
1 row in set (0.00 sec)
 
 
8.如果你不想執行一條語句,你應該以\c結尾
 
mysql> SELECT
    -> USER()
    -> \c
 
9.各種提示的意思
 
Prompt Meaning
mysql> Ready for new query
-> Waiting for next line of multiple-line query
'> Waiting for next line, waiting for completion of a string that began with a single quote (“'”)
"> Waiting for next line, waiting for completion of a string that began with a double quote (“"”)
`> Waiting for next line, waiting for completion of an identifier that began with a backtick (“`”)
/*> Waiting for next line, waiting for completion of a comment that began with /*
Prompt Meaning
mysql> 准備執行一個查詢
-> 等待多行輸入中的下一行輸入
'> 等待下一行輸入或等待輸入一個結束的單引號 (“'”)
"> 等待下一行輸入或等待輸入一個結束的雙引號  (“"”)
`> 等待下一行輸入或等待輸入這個標識符結尾 (“`”)
/*> 等待下一行輸入或等待輸入一個結束的標識符/*
下面這種情況,MySQL正等待輸入
 
mysql> SELECT USER()
    ->
 
輸入一個分號,以完成這條聲明
 
mysql> SELECT USER()
    -> ;
+-----------------+
| USER()          |
+-----------------+
+-----------------+
1 row in set (0.00 sec)
 
 
當你看見  '> 或者  "> 標記的時候,意思是提示你,應該以單引號  ’  或雙引號 “ 結尾,但是你還沒有結尾
 
mysql> SELECT * FROM my_table WHERE name='Smith AND age < 30;
    '>
 
這個時候,你該怎么辦呢?最簡單的,關閉這個查詢。但是,你不能只寫\c關閉,因為這時候,mysql會把他拆分成上個字符串的一部分。
你應該以缺少的標記 ‘  +  \c  結束( '\c ),這樣mysql就知道你要完成這個字符串。
 
mysql> SELECT * FROM my_table WHERE name='Smith AND age < 30;
    '> '\c
mysql>
 
 '\c 這個標記返回到了  mysql>, 這說明mysql准備好執行一個新的語句了。
 
 
 
創建和使用一個數據庫
 
10.用 SHOW 關鍵字找出當前mysql服務上已經存在的數據庫
 
mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| know_yourself      |
| menageria          |
| mysql              |
| performance_schema |
| sakila             |
| sys                |
| test               |
| websystique        |
| world              |
+--------------------+
10 rows in set (0.00 sec)
 
 
11.進入並使用一個數據庫
 
mysql> USE test
Database changed
mysql>
 
USE 像 LIKE 一樣,不需要分號結尾,但是USE必須在單獨一行。
 
如果你能訪問一個數據庫,你就能使用這個數據庫,但是有時候,你創建的數據庫,如果別人也能訪問,他就可以刪除它。因此,你應該向你的數據庫管理員要一個你自己的數據庫。比如你的數據庫名字叫 menagerie,數據庫管理員需要執行以下申請
 
mysql> GRANT ALL ON menagerie.* TO 'your_mysql_name'@'your_client_host';
 your_mysql_name 是訪問你數據庫的用戶名, your_client_host 是連接你數據庫服務的地址
 
 
 
創建和查詢一個數據庫
 
12.創建一個數據庫
 
mysql> CREATE DATABASE menagerie;
Query OK, 1 row affected (0.02 sec)
 
mysql>
 
 
13.選擇要使用的數據庫
mysql> USE menagerie
Database changed
 
 
14.直接進入指定的數據庫
C:\Users\zhangcunli>mysql -h localhost -u cunli -p menagerie
Enter password: *****
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 16
Server version: 5.7.9-log MySQL Community Server (GPL)
 
Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.
 
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
 
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 
mysql>
 
 
15.創建一張表
查詢當前數據中的所有表
mysql> show tables;
Empty set (0.00 sec)
 
創建一張pet表,有字段: name, owner, species, sex, birth, and death.
mysql> CREATE TABLE pet (name VARCHAR(20),owner VARCHAR(20),species VARCHAR(20),sex CHAR(1),birth DATE,death DATE);
Query OK, 0 rows affected (0.39 sec)
 
再次查看當前數據庫中的表
mysql> show tables;
+---------------------+           
| Tables_in_menagerie |
+---------------------+
| pet                 |
+---------------------+
1 row in set (0.00 sec)
 
可以用  DESCRIBE關鍵字核實你的表是否以你指定的方式創建成功。
 
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.17 sec)
 
如果你忘記了你表中的列名或類型,你可以用  DESCRIBE關鍵字查看
 
 
16.你可以用  LOAD DATA and  INSERT 關鍵字向表中添加數據
 
假設你的pet表信息如下:(注意MySQL認為日期的格式是 'YYYY-MM-DD' ,這可能和你常用的日期格式不
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
 
使用LOAD DATA 方式向表中添加數據
你應該創建一個pet.txt文件,保證每行一條數據。沒有值的字段用 \N 表示,如下:
 
Whistler        Gwen    bird    \N      1997-12-09      \N
按如下方式加載pet.txt到pet表中:
如果你是在windows系統上創建pet.txt文件,你應該在每行的結尾加上  \r\n  , 就像下面這樣:
 
mysql> LOAD DATA LOCAL INFILE 'D:/100/pets.txt' INTO TABLE pet LINES TERMINATED BY '\r\n';
Query OK, 8 rows affected, 7 warnings (0.25 sec)
Records: 8  Deleted: 0  Skipped: 0  Warnings: 7
 
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       |
+----------+--------+---------+------+------------+------------+
8 rows in set (0.00 sec)
你可以用 INSERT 關鍵字添加一條新數據,像下面這樣:
 
mysql> INSERT INTO pet VALUES ('Puffball','Diane','hamster','f','1990-03-30',NULL);
Query OK, 1 row affected (0.19 sec)
 
 
 
從一個表中檢索信息
17.SELECT 關鍵字是從一個表中檢索信息,順序是:
 
SELECT what_to_select
FROM which_table
WHERE conditions_to_satisfy;
what_to_select 是你想查詢的信息。 可以查詢其中的一列或用 * 查詢出所有的列。
查詢所有數據
18.下面這個例子使用SELECT查詢表中的所有信息
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       |
+----------+--------+---------+------+------------+------------+
8 rows in set (0.00 sec)
 
刪除表中的所有數據
mysql> DELETE FROM pet;
Query OK, 9 rows affected (0.16 sec)
 
導入pet.txt到pet表中
mysql> load data local infile 'd:/100/pets.txt' INTO TABLE pet;
Query OK, 8 rows affected, 7 warnings (0.22 sec)
Records: 8  Deleted: 0  Skipped: 0  Warnings: 7
 
用UPDATE關鍵字可以修改其中一條錯誤
 
mysql> UPDATE pet SET birth = '1989-08-31' WHERE name = 'Bowser';
Query OK, 1 row affected (0.19 sec)
Rows matched: 1  Changed: 1  Warnings: 0
 
UDPATE 關鍵字只能更該一條數據
 
19.查詢特定的 行
 
查詢名字叫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)
 
 
查詢生日大於1998-1-1的動物的信息
mysql> SELECT * FROM pet WHERE birth >= '1998-1-1';
+----------+-------+---------+------+------------+-------+
| name     | owner | species | sex  | birth      | death |
+----------+-------+---------+------+------------+-------+
| Chirpy   | Gwen  | bird    | f    | 1998-09-11 | NULL  |
| Puffball | Diane | hamster | f    | 1999-03-30 | NULL  |
+----------+-------+---------+------+------------+-------+
 
 
查詢種類是dog並且性別為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  |
+-------+--------+---------+------+------------+-------+
 
 
查詢種類是snake或者種類是bird的動物的信息
mysql> SELECT * FROM pet WHERE species = 'snake' OR species = 'bird';
+----------+-------+---------+------+------------+-------+
| name     | owner | species | sex  | birth      | death |
+----------+-------+---------+------+------------+-------+
| Chirpy   | Gwen  | bird    | f    | 1998-09-11 | NULL  |
| Whistler | Gwen  | bird    |   NULL   | 1997-12-09 | NULL  |
| Slim     | Benny | snake   | m    | 1996-04-29 | NULL  |
+----------+-------+---------+------+------------+-------+
 
 
查詢種類是cat並且性別是m或者種類是dog並且性別是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  |
+-------+--------+---------+------+------------+-------+
 
 
20.查詢特定的 列
 
查詢表中所有動物的name和birth
 
mysql> SELECT name, birth FROM pet;
+----------+------------+
| name     | birth      |
+----------+------------+
| 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  |
+--------+
| Harold |
| Gwen   |
| Harold |
| Benny  |
| Diane  |
| Gwen   |
| Gwen   |
| Benny  |
| Diane  |
+--------+
 
 
查詢所有名字不相同的動物
mysql> SELECT DISTINCT owner FROM pet;
+--------+
| owner  |
+--------+
| Harold |
| Gwen   |
| Benny  |
| Diane  |
+--------+
 
 
查詢表中所有dog或者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 |
+--------+---------+------------+
 
 

21.排序行


查詢表中所有動物的名字和生日,按生日排序
 
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 |
+----------+------------+
 
查詢表中所有動物的名字和生日,按生日  逆序排序
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 |
+----------+------------+
 
 
 
查詢表中所有動物的名字和種類,種類順序,生日逆序
 
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 |
+----------+---------+------------+
 
 
 

22.日期的計算

 
計算所有動物的年齡
 
mysql> SELECT name, birth, CURDATE(),
    -> TIMESTAMPDIFF(YEAR,birth,CURDATE()) AS age
    -> FROM pet;
+----------+------------+------------+------+
| name     | birth      | CURDATE()  | age  |
+----------+------------+------------+------+
| Fluffy   | 1993-02-04 | 2016-02-23 |   23 |
| Claws    | 1994-03-17 | 2016-02-23 |   21 |
| Buffy    | 1989-05-13 | 2016-02-23 |   26 |
| Fang     | 1990-08-27 | 2016-02-23 |   25 |
| Bowser   | 1989-08-31 | 2016-02-23 |   26 |
| Chirpy   | 1998-09-11 | 2016-02-23 |   17 |
| Whistler | 1997-12-09 | 2016-02-23 |   18 |
| Slim     | 1996-04-29 | 2016-02-23 |   19 |
| Puffball | 1999-03-30 | 2016-02-23 |   16 |
+----------+------------+------------+------+
 
 
把剛才查詢出的結果按年齡排序
 
mysql> SELECT name, birth, CURDATE(),
    -> TIMESTAMPDIFF(YEAR,birth,CURDATE()) AS age
    -> FROM pet ORDER BY age;
+----------+------------+------------+------+
| name     | birth      | CURDATE()  | age  |
+----------+------------+------------+------+
| Puffball | 1999-03-30 | 2016-02-23 |   16 |
| Chirpy   | 1998-09-11 | 2016-02-23 |   17 |
| Whistler | 1997-12-09 | 2016-02-23 |   18 |
| Slim     | 1996-04-29 | 2016-02-23 |   19 |
| Claws    | 1994-03-17 | 2016-02-23 |   21 |
| Fluffy   | 1993-02-04 | 2016-02-23 |   23 |
| Fang     | 1990-08-27 | 2016-02-23 |   25 |
| Buffy    | 1989-05-13 | 2016-02-23 |   26 |
| Bowser   | 1989-08-31 | 2016-02-23 |   26 |
+----------+------------+------------+------+
 
 
計算所有動物的年齡,並且按年齡排序,不包括沒有死亡日期的動物
 
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 |
+--------+------------+------------+------+
 
 
查看所有動物的生日是哪個月
  YEAR()MONTH(), and  DAYOFMONTH()
 
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 |
+-------+------------+
 
查看下個月過生日的動物
 
mysql> SELECT name, birth FROM pet
    -> WHERE MONTH(birth) = MONTH(DATE_ADD(CURDATE(),INTERVAL 1 MONTH));
+----------+------------+
| name     | birth      |
+----------+------------+
| Claws    | 1994-03-17 |
| Puffball | 1999-03-30 |
+----------+------------+
 
 
mysql> SELECT name, birth FROM pet
    -> WHERE MONTH(birth) = MOD(MONTH(CURDATE()), 12) + 1;
+----------+------------+
| name     | birth      |
+----------+------------+
| Claws    | 1994-03-17 |
| Puffball | 1999-03-30 |
+----------+------------+
 
MONTH( ) 返回1到12之間的一個數字;
MOD(something,12 ) 返回0到11之間的一個數字,
所有我們要加數字應該在MOD( )之后。
 
 
23.空值的處理
 
測試查看的值是否為空
 
mysql> SELECT 1 IS NULL, 1 IS NOT NULL;
+-----------+---------------+
| 1 IS NULL | 1 IS NOT NULL |
+-----------+---------------+
|         0 |             1 |
+-----------+---------------+
 
 
你不能用算術運算符操作 NULL , 請看下面的例子:
 
mysql> SELECT 1 = NULL, 1 <> NULL, 1 < NULL, 1 > NULL;
+----------+-----------+----------+----------+
| 1 = NULL | 1 <> NULL | 1 < NULL | 1 > NULL |
+----------+-----------+----------+----------+
|     NULL |      NULL |     NULL |     NULL |
+----------+-----------+----------+----------+
 
因為任何的算術運算符把NULL也當做NULL,所以你不能從這些比較重獲取任何有意義的結果。
 
In MySQL,  0 or  NULL means false and anything else means true. The default truth value from a boolean operation is  1.
在MySQL里,0或者NULL就意味着是false , 有時候也是true .默認值 truth是一個boolean類型,值為1.
 
如果你用  ORDER BY ... ASC  排序,空值會出現在最前面;或 ORDER BY ... DESC 排序,空值會出現在最后面
 
mysql> SELECT * FROM pet ORDER BY DEATH ASC;
+----------+--------+---------+------+------------+------------+
| 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       |
| Chirpy   | Gwen   | bird    | f    | 1998-09-11 | NULL       |
| Whistler | Gwen   | bird    |      | 1997-12-09 | NULL       |
| Slim     | Benny  | snake   | m    | 1996-04-29 | NULL       |
| Puffball | Diane  | hamster | f    | 1999-03-30 | NULL       |
| Bowser   | Diane  | dog     | m    | 1989-08-31 | 1995-07-29 |
+----------+--------+---------+------+------------+------------+
 
mysql> SELECT * FROM pet ORDER BY DEATH DESC;
+----------+--------+---------+------+------------+------------+
| name     | owner  | species | sex  | birth      | death      |
+----------+--------+---------+------+------------+------------+
| Bowser   | Diane  | dog     | m    | 1989-08-31 | 1995-07-29 |
| 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       |
| 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       |
+----------+--------+---------+------+------------+------------+
 
當你向表中保存0或者一個空字符串('')的時候,實際這個列不是空,你可以用 IS [NOT] NULL 測試:
 
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 |
+-----------+---------------+------------+----------------+
 
因此,你可以放入0或一個空字符串到(不能為空 )NOT NULL的列。
 
 
24.模式匹配
 
在MySQL中,SQL的模式匹配默認不區分大小寫。你可以用 “_”匹配任意單個字符,
用“%”匹配匹配任意數量的字符(包括不存在的字符)。
你不能用 = 或者 <>匹配,應該用 LIKE 或 NOT LIKE 代替。
 
 
查詢 name字段中以字母 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 |
+--------+--------+---------+------+------------+------------+
 
 
查詢 name字段中以字母 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  |
+--------+--------+---------+------+------------+-------+

查詢 name字段中包含字母 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    |      | 1997-12-09 | NULL       |
+----------+-------+---------+------+------------+------------+
 
查看名字為五個字符的動物的信息,用“_”字符匹配:
 
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  |
+-------+--------+---------+------+------------+-------+
 
MySQL其他類型的匹配,繼承正則表達式:
 
[ . . . ] 匹配任何在方括號內的字符。比如,[abc]會匹配“a”,"b" 或 "c"。
[a-z] 匹配 a到z中間的任何字母。同樣,[0-9]匹配任何數字。
* 匹配零個或更多的字符。例如,“x*”匹配任何數量的“x”字符。
[0-9]* 匹配任意數量的數字。“.*”匹配任意數量的任何字符。
 
正則表達式不像模式匹配,正則表達式是匹配任意位置,模式匹配是匹配整個值。
 
如果一個模式,你必須匹配開始和結尾,
你可以用 “^”作為匹配的開頭,用“$”作為匹配的結尾。
 
 
下面將演示如何使用正則表達式進行模式匹配。
 
找到以“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 |
+--------+--------+---------+------+------------+------------+
 
如果你要強制正則表達式區分大小寫,你可以用 BINARY 關鍵字匹配一個二進制字符串。
此查詢只匹配小寫字母"b"開頭的名稱:
mysql> SELECT * FROM pet WHERE name REGEXP BINARY '^b';
Empty set (0.00 sec)
 
 
查找以 “ 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    |      | 1997-12-09 | NULL       |
+----------+-------+---------+------+------------+------------+
 
 
查找有五個字符組成的名字,用“^”和 “$”匹配開始和結尾,用“.”匹配五個字符:
 
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  |
+-------+--------+---------+------+------------+-------+
 

你也可以寫上一個查詢中使用{n}("重復n次")運算符:


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  |
+-------+--------+---------+------+------------+-------+
 
 
 
25.   3.3.4.8 計算行
數據庫會經常回答一個問題,“表中的數據多久會發生變化?”、
例如,你可能想知道你有多少只寵物,或者你想知道每個業主有多少只寵物,
或者你想對你的動物進行各類普查。
 
計算你總共有多少只動物,同樣的問題:pet表中總共有多少行?
因為每個動物有一條記錄。用 COUNG(*)可以計算行數,
所以你可以這樣查詢並計算你的動物:
 
mysql> SELECT COUNT(*) FROM pet;
+----------+
| COUNT(*) |
+----------+
|        9 |
+----------+
 
你可以用COUNT()查看每個業主有幾只寵物:
 
mysql> SELECT owner, COUNT(*) FROM pet GROUP BY owner;
+--------+----------+
| owner  | COUNT(*) |
+--------+----------+
| Benny  |        2 |
| Diane  |        2 |
| Gwen   |        3 |
| Harold |        2 |
+--------+----------+
 
 
上面的查詢語句用了 GROUP BY 為每位業主分組,
COUNT( ) 和 GROUP BY 一起使用,可以很好的描述你每個組里面的數據。
 
下面的示例是用另一種方式進行寵物普查。
 
查看每種動物的數量:
 
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 |
+------+----------+
 
 
(在此輸出中,NULL表明,性別是未知的。)
 
每種組合的動物數量和性別
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 |
+---------+------+----------+
 
當你使用COUNT( )時,你不用檢索整個表。例如,前面的查詢,
在執行時,只對狗和貓,看起來像這樣:
 
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 |
+---------+------+----------+
 
 
如果你選擇了COUNT()列,GROUP BY 子句應存在相同名稱的列。否則,將發生一下錯誤:
 
如果 ONLY_FULL_GROUP_BY 啟用SQL模式,會發生一個錯誤:
 
mysql> SET sql_mode = 'ONLY_FULL_GROUP_BY';
Query OK, 0 rows affected, 1 warning (0.22 sec)
 
 
mysql> SELECT owner, COUNT(*) FROM pet;
ERROR 1140 (42000): In aggregated query without GROUP BY, expression #1 of SELECT list contains nonaggregated column 'menagerie.pet.owner'; this is incompatible with sql_mode=only_full_group_by
 
 
如果 ONLY_FULL_GROUP_BY 沒有啟用,查詢會作為一個單獨的組出來,
但為每個指定的列選定的值是不確定的。MYSQL服務可以自由選擇任何行中的值:
mysql> SET sql_mode = '';
Query OK, 0 rows affected (0.00 sec)
 
mysql> SELECT owner, COUNT(*) FROM pet;
+--------+----------+
| owner  | COUNT(*) |
+--------+----------+
| Harold |        9 |
+--------+----------+
 
 
 
26.  3.3.4.9 使用多個表
 
pet表會對你所擁有的動物做記錄。如果你想記錄有關他們的其他信息,
像他們的生活中看病和出生,你需要另外一張表。這個表應該是什么樣子?
它需要包含以下信息:
 
寵物名稱:方便你知道那個動物出了什么情況。
 
日期(繁殖日期):方便你知道事情發生的日期。
 
描述:記錄所發生的事情。
 
事件類型:如果你要對發生的事情進行分類。
 
 
經過上述分析,創建的event table(事件表)可能看起來像這樣:
 
mysql> CREATE TABLE event (name VARCHAR(20), date DATE,
    -> type VARCHAR(15), remark VARCHAR(255));
Query OK, 0 rows affected (1.31 sec)
 
像pet表一樣,通過創建制表符分割的文本文件,是最容易加載初始信息的方式,文本文件包含以下信息。
 
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 'd:/event.txt' INTO TABLE event;
 
 
假設您想查看每個寵物繁殖時的年齡。我們已經看到了兩個日期,但是怎樣從兩個日期中計算某只寵物繁殖時的年齡。
母親的生育日期在event表中,但是要計算他的生育時的年齡,你需要她的生日。她的生日存在pet表中。
這意味着需要查詢兩個表:
mysql> SELECT pet.name,
    -> (YEAR(date)-YEAR(birth)) - (RIGHT(date,5)<RIGHT(birth,5)) 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 |
| Buffy  |    5 | 3 puppies, 3 female         |
+--------+------+-----------------------------+
 
關於這個查詢有幾件事情需要注意:
 
From 鏈接了兩個表,因為查詢需要從兩個表中查詢信息。
 
當結合(加入)多個表的信息時,您需要指定如何將一個表中的記錄與其他中的記錄相匹配。
因為他們都有一個名稱列,這是很容易的。該查詢基於名稱的值,使用ON子句匹配兩個表中的記錄。
 
該查詢使用 INNER JOIN (內部聯接)把兩個表相結合。 INNER JOIN 內部鏈接是把符合ON條件的兩張表中的信息,
顯示在一張新表中。在這個例子中,ON子句指定名稱的寵物表中的列必須事件表中的列名稱相匹配,
如果一個名稱在兩個表中不是共有的,這個名稱將不顯示,因為ON子句中的條件失敗。
 
因為 name 列是在兩個表中,你必須明確指出你引用的是哪個表中的哪個列,所有你應該為引用的每個列添加表名。
 
 
你不需要有兩個不同的表執行一次聯結。如果你要比較同一個表中的兩條記錄,有時候聯結自己是更實用的。
例如,在你的寵物中找到繁殖的配偶,你可以用pet表聯結他自己,找到雌性和雄性。
 
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     |
+--------+------+--------+------+---------+
在這個查詢中,我們指定表的別名名稱引用該表的列和值的實例與每個列引用關聯。
 
 
27.  3.4 獲取有關數據庫和表的信息
 
如果你忘記數據庫或表的名字,或者你忘記了表結構(例如,這個列是存放什么的?)
mysql通過多條語句解決了提供數據庫和表信息的問題。
 
你以前見到 SHOW DATABASES 命令, 列出由服務器管理的數據庫.
用DATABASE() 命令,你可以找出當前選定的數據庫
 
mysql> SELECT DATABASE();
+------------+
| DATABASE() |
+------------+
| menagerie  |
+------------+
 
如果你還沒有選中任何的數據庫,這個命令的返回結果是 NULL。
 
如果你不確定這個數據庫中包含哪些表,你可以用這個語句來查看:
 
mysql> SHOW TABLES;
+---------------------+
| Tables_in_menagerie |
+---------------------+
| event               |
| pet                 |
+---------------------+
 
你可以用 DESCRIBE查看表的結構,它描述了每個列的信息。
 
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    |       |
+---------+-------------+------+-----+---------+-------+
 
Field 表示列的名稱,Type表示列的數據類型,
NULL值指示該列可以包含NULL值,Key指示該列是索引
Default  指出列的默認值,如果列使用了 AUTO_INCREMENT選項,Extra顯示列的額外信息,
這個列的值將會自動增長,而不是空的。
 
DESC 是 DESCRIBE的縮寫。
 
mysql> CREATE TABLE pet2(name VARCHAR(20));
Query OK, 0 rows affected (0.36 sec)
 
mysql> DESCRIBE pet2;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| name  | varchar(20) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
 
 
mysql> DESC pet2;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| name  | varchar(20) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
 
 
用SHOW CREATE TABLE 語句,可以顯示你創建表的語句
 
mysql> SHOW CREATE TABLE pet2;
+-------+-----------------------------------------------------------------------
-----------------------+
| Table | Create Table
                       |
+-------+-----------------------------------------------------------------------
-----------------------+
| pet2  | CREATE TABLE `pet2` (
  `name` varchar(20) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+-----------------------------------------------------------------------
-----------------------+
 
 
28.  3.5 以批處理模式使用mysql
 
在前面的部分中,您使用mysql交互輸入語句並查看結果。
您還可以使用批處理模式運行mysql。
 
例如,在d:/mysql_bat/新建login.bat文件,內容如下:
mysql -h localhost -u cunli -pcunli < d:/mysql_bat/mysql.sql > d:/mysql_bat/bat_out.out
 
然后在d:/mysql_bat/新建mysql.sql ,內容如下:
#show databases;
use menagerie;
#------------tables----------------
show tables;
SELECT * FROM pet;
 
雙擊login.bat,即可在d:/mysql_bat/看到bat_out.out文件,內容是mysql.sql里面執行的內容
 
29. 3.6 常見的查詢的例子
 
啟動命令行,並選中一個數據庫:
你可以使用這些語句創建並填充表:
mysql> use menagerie
Database changed
 
CREATE TABLE shop (
    article INT(4) UNSIGNED ZEROFILL DEFAULT '0000' NOT NULL,
    dealer  CHAR(20)                 DEFAULT ''     NOT NULL,
    price   DOUBLE(16,2)             DEFAULT '0.00' NOT NULL,
    PRIMARY KEY(article, dealer));
INSERT INTO shop VALUES
    (1,'A',3.45),(1,'B',3.99),(2,'A',10.99),(3,'B',1.45),
    (3,'C',1.69),(3,'D',1.25),(4,'D',19.95);
mysql> CREATE TABLE shop (
    ->     article INT(4) UNSIGNED ZEROFILL DEFAULT '0000' NOT NULL,
    ->     dealer  CHAR(20)                 DEFAULT ''     NOT NULL,
    ->     price   DOUBLE(16,2)             DEFAULT '0.00' NOT NULL,
    ->     PRIMARY KEY(article, dealer));
Query OK, 0 rows affected (0.28 sec)
 
mysql> INSERT INTO shop VALUES
    ->     (1,'A',3.45),(1,'B',3.99),(2,'A',10.99),(3,'B',1.45),
    ->     (3,'C',1.69),(3,'D',1.25),(4,'D',19.95);
Query OK, 7 rows affected (0.15 sec)
Records: 7  Duplicates: 0  Warnings: 0
 
查看該表內容:
 
mysql> SELECT * FROM shop;
+---------+--------+-------+
| article | dealer | price |
+---------+--------+-------+
|    0001 | A      |  3.45 |
|    0001 | B      |  3.99 |
|    0002 | A      | 10.99 |
|    0003 | B      |  1.45 |
|    0003 | C      |  1.69 |
|    0003 | D      |  1.25 |
|    0004 | D      | 19.95 |
+---------+--------+-------+
 
 
30. 3.6.1 查看 列的最大值
該項目的最大編號是多少?
 
mysql> SELECT MAX(article) AS article FROM shop;
+---------+
| article |
+---------+
|       4 |
+---------+
 
31.   3.6.2 查看該項目的最大編號的行的信息
 
mysql> SELECT article, dealer, price
    -> FROM   shop
    -> WHERE  price=(SELECT MAX(price) FROM shop);
+---------+--------+-------+
| article | dealer | price |
+---------+--------+-------+
|    0004 | D      | 19.95 |
+---------+--------+-------+
 
你也可以用LIFT JOIN 排序所有的行的價格,然后獲取第一行。或者用LIMT關鍵字:
 
mysql> SELECT s1.article, s1.dealer, s1.price
    -> FROM shop s1
    -> LEFT JOIN shop s2 ON s1.price < s2.price
    -> WHERE s2.article IS NULL;
+---------+--------+-------+
| article | dealer | price |
+---------+--------+-------+
|    0004 | D      | 19.95 |
+---------+--------+-------+
 
 
mysql> SELECT article, dealer, price
    -> FROM shop
    -> ORDER BY price DESC
    -> LIMIT 1;
+---------+--------+-------+
| article | dealer | price |
+---------+--------+-------+
|    0004 | D      | 19.95 |
+---------+--------+-------+
 
32.  3.6.3  查看每組中最大的列的值
查看每種物品的最高價格
 
mysql> SELECT article, MAX(price) AS price
    -> FROM   shop
    -> GROUP BY article;
+---------+-------+
| article | price |
+---------+-------+
|    0001 |  3.99 |
|    0002 | 10.99 |
|    0003 |  1.69 |
|    0004 | 19.95 |
+---------+-------+
 
 
33.  3.6.4  查看每種商品的經銷商醉的最高價格
 
mysql> SELECT article, dealer, price
    -> FROM   shop s1
    -> WHERE  price=(SELECT MAX(s2.price)
    ->               FROM shop s2
    ->               WHERE s1.article = s2.article);
+---------+--------+-------+
| article | dealer | price |
+---------+--------+-------+
|    0001 | B      |  3.99 |
|    0002 | A      | 10.99 |
|    0003 | C      |  1.69 |
|    0004 | D      | 19.95 |
+---------+--------+-------+
 
 
無關聯的子查詢:
SELECT s1.article, dealer, s1.price
FROM shop s1
JOIN (
  SELECT article, MAX(price) AS price
  FROM shop
  GROUP BY article) AS s2
  ON s1.article = s2.article AND s1.price = s2.price;
 

LEFT JOIN:

SELECT s1.article, s1.dealer, s1.price
FROM shop s1
LEFT JOIN shop s2 ON s1.article = s2.article AND s1.price < s2.price
WHERE s2.article IS NULL;
34.  3.6.5 使用用戶定義的變量
你可以使用MySQL用戶變量記住結果,而不必將它們存儲在客戶端中的臨時變量
mysql> SELECT @min_price:=MIN(price),@max_price:=MAX(price) FROM shop;
mysql> SELECT * FROM shop WHERE price=@min_price OR price=@max_price;
+---------+--------+-------+
| article | dealer | price |
+---------+--------+-------+
|    0003 | D      |  1.25 |
|    0004 | D      | 19.95 |
+---------+--------+-------+
mysql>  SELECT @min_price:=MIN(price),@max_price:=MAX(price) FROM shop;
+------------------------+------------------------+
| @min_price:=MIN(price) | @max_price:=MAX(price) |
+------------------------+------------------------+
|                   1.25 |                  19.95 |
+------------------------+------------------------+
1 row in set (0.00 sec)
 
mysql> SELECT * FROM shop WHERE price=@min_price OR price=@max_price;
+---------+--------+-------+
| article | dealer | price |
+---------+--------+-------+
|    0003 | D      |  1.25 |
|    0004 | D      | 19.95 |
+---------+--------+-------+
 
 
35.  3.6.6  使用外鍵
你可以使用一個列創建一個聯接列,如下所示
CREATE TABLE person (
    id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
    name CHAR(60) NOT NULL,
    PRIMARY KEY (id)
);

CREATE TABLE shirt (
    id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
    style ENUM('t-shirt', 'polo', 'dress') NOT NULL,
    color ENUM('red', 'blue', 'orange', 'white', 'black') NOT NULL,
    owner SMALLINT UNSIGNED NOT NULL REFERENCES person(id),
    PRIMARY KEY (id)
);

INSERT INTO person VALUES (NULL, 'Antonio Paz');

SELECT @last := LAST_INSERT_ID();

INSERT INTO shirt VALUES
(NULL, 'polo', 'blue', @last),
(NULL, 'dress', 'white', @last),
(NULL, 't-shirt', 'blue', @last);

INSERT INTO person VALUES (NULL, 'Lilliana Angelovska');

SELECT @last := LAST_INSERT_ID();

INSERT INTO shirt VALUES
(NULL, 'dress', 'orange', @last),
(NULL, 'polo', 'red', @last),
(NULL, 'dress', 'blue', @last),
(NULL, 't-shirt', 'white', @last);

SELECT * FROM person;
+----+---------------------+
| id | name                |
+----+---------------------+
|  1 | Antonio Paz         |
|  2 | Lilliana Angelovska |
+----+---------------------+

SELECT * FROM shirt;
+----+---------+--------+-------+
| id | style   | color  | owner |
+----+---------+--------+-------+
|  1 | polo    | blue   |     1 |
|  2 | dress   | white  |     1 |
|  3 | t-shirt | blue   |     1 |
|  4 | dress   | orange |     2 |
|  5 | polo    | red    |     2 |
|  6 | dress   | blue   |     2 |
|  7 | t-shirt | white  |     2 |
+----+---------+--------+-------+


SELECT s.* FROM person p INNER JOIN shirt s
   ON s.owner = p.id
 WHERE p.name LIKE 'Lilliana%'
   AND s.color <> 'white';

+----+-------+--------+-------+
| id | style | color  | owner |
+----+-------+--------+-------+
|  4 | dress | orange |     2 |
|  5 | polo  | red    |     2 |
|  6 | dress | blue   |     2 |
+----+-------+--------+-------+
使用這種方式時, REFERENCES 子句不會在   SHOW CREATE TABLE  或者  DESCRIBE  顯示:
 
 
SHOW CREATE TABLE shirt\G
*************************** 1. row ***************************
Table: shirt
Create Table: CREATE TABLE `shirt` (
`id` smallint(5) unsigned NOT NULL auto_increment,
`style` enum('t-shirt','polo','dress') NOT NULL,
`color` enum('red','blue','orange','white','black') NOT NULL,
`owner` smallint(5) unsigned NOT NULL,
PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
 
36. 3.6.8   計算每天訪問
下面的示例說明如何使用位元組函數來計算每月用戶訪問Web頁面的數量
CREATE TABLE t1 (year YEAR(4), month INT(2) UNSIGNED ZEROFILL,
             day INT(2) UNSIGNED ZEROFILL);
INSERT INTO t1 VALUES(2000,1,1),(2000,1,20),(2000,1,30),(2000,2,2),
            (2000,2,23),(2000,2,23);
示例表包含年-月-日值代表用戶對頁面的訪問。確定這些訪問發生在每個月多少不同的日子,使用以下查詢:
SELECT year,month,BIT_COUNT(BIT_OR(1<<day)) AS days FROM t1
       GROUP BY year,month;
返回:
+------+-------+------+
| year | month | days |
+------+-------+------+
| 2000 |    01 |    3 |
| 2000 |    02 |    2 |
+------+-------+------+
查詢計算/月,每年組合的表中顯示多少不同的日子,自動刪除重復的條目。
 
37.  3.6.9   使用AUTO_INCREMENT
AUTO_INCREMENT屬性可用於為新行生成一個唯一標識:
CREATE TABLE animals (
     id MEDIUMINT NOT NULL AUTO_INCREMENT,
     name CHAR(30) NOT NULL,
     PRIMARY KEY (id)
);

INSERT INTO animals (name) VALUES
    ('dog'),('cat'),('penguin'),
    ('lax'),('whale'),('ostrich');

SELECT * FROM animals;
返回:
+----+---------+
| id | name    |
+----+---------+
|  1 | dog     |
|  2 | cat     |
|  3 | penguin |
|  4 | lax     |
|  5 | whale   |
|  6 | ostrich |
+----+---------+
沒有為AUTO_INCREMENT列指定值,所以使用自動分配的序列號。
 
您也可以顯式指定列生成序列號0。如果該列被聲明為NOT NULL,也可以指定NULL的列生成序號。當你向一個AUTO_INCREMENT列中插入任何其他值,則列設置為該值和序列重置,以便下自動生成的值如下順序從最大的列值。
您可以檢索最新的自動生成AUTO_INCREMENT值與LAST_INSERT_ID()SQL函數或mysql_insert_id()C API函數。這些功能是連接特定的,所以它們的返回值不受也是執行插入的另一個連接。
使用了AUTO_INCREMENT列,它足夠大,可以容納的最大序列值,您需要的最小整數數據類型。當達到最大值的數據類型的列,接下來生成序列號的嘗試失敗。如果可能,使用無符號屬性以允許更大的范圍。例如,如果您使用TINYINT,最大允許序列號碼是127。為TINYINT簽名,最大值為255。
 
開始一個AUTO_INCREMENT 1以外的值,設置該值與CREATE TABLE或ALTER TABLE,像這樣:
mysql> ALTER TABLE tbl AUTO_INCREMENT = 100;
 
引擎優化
CREATE TABLE animals (
    grp ENUM('fish','mammal','bird') NOT NULL,
    id MEDIUMINT NOT NULL AUTO_INCREMENT,
    name CHAR(30) NOT NULL,
    PRIMARY KEY (grp,id)
) ENGINE=MyISAM;

INSERT INTO animals (grp,name) VALUES
    ('mammal','dog'),('mammal','cat'),
    ('bird','penguin'),('fish','lax'),('mammal','whale'),
    ('bird','ostrich');

SELECT * FROM animals ORDER BY grp,id;
返回:
+--------+----+---------+
| grp    | id | name    |
+--------+----+---------+
| fish   |  1 | lax     |
| mammal |  1 | dog     |
| mammal |  2 | cat     |
| mammal |  3 | whale   |
| bird   |  1 | penguin |
| bird   |  2 | ostrich |
+--------+----+---------+
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM