第3章 使用MySql
3.1 連接
3.2 選擇數(shù)據(jù)庫
首先在登錄數(shù)據(jù)庫情況,可以先使用 show databases;展示出有哪些數(shù)據(jù)庫
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| 9 |
| book |
| bookstore |
| db_9griddiary |
| db_database13 |
| hibernate |
| hwp_db |
| jdbc01 |
| mysql |
| onlinexam |
| performance_schema |
| test |
+--------------------+
13 rows in set (0.06 sec)
輸入 USE book
輸出 Database changed
表示選中了book數(shù)據(jù)庫;
3.3 了解數(shù)據(jù)庫和表
SHOW TABLES; 返回當前選擇的數(shù)據(jù)庫內可用表的列表。
輸入 SHOW TABLES;
輸出
mysql> SHOW TABLES;
+------------------+
| Tables_in_book |
+------------------+
| book_info |
| product_tb |
| tb_studnet_batch |
+------------------+
SHOW也可以用來顯示表列:
輸入 SHOE COLUMNS FROM book_info;
輸出
+-----------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(200) | NO | | NULL | |
| price | double | NO | | NULL | |
| bookCount | int(11) | NO | | NULL | |
| author | varchar(45) | NO | | NULL | |
+-----------+--------------+------+-----+---------+----------------+
**SHOE COLUMNS ** 要求給出一個表名,它對應每個字段返回一行,行中包含字段名、數(shù)據(jù)類型、是否允許NULL、鍵信息、默認值以及其他信息(如字段id的auto_incerement)。
其他的SHOW語句還有:
SHOW STATUS ,用于顯示廣泛的服務器狀態(tài)信息;
SHOW GRANTS,用來顯示授予用戶(所有用戶或特定用戶)的安全權限;
SHOW ERRORS和SHOW WARNINGS,用來顯示服務器錯誤或警告消息;
第4章 檢索數(shù)據(jù)
4.1 SELECT 語句
4.2 檢索單個列
輸入
SELECT name FROM book_info;
上述語句利用SELECT語句從book_info表中檢索一個名name的列。所需的列名在SELECT關鍵字之后給出,FROM關鍵字指出從其中檢索數(shù)據(jù)的表名。此語句的輸出如下所示:
+----------------------+
| name |
+----------------------+
| JAVAWeb |
| 1111 |
| 名稱一 |
| 或者 |
| 名稱一 |
| 山月不知心底事 |
| 致我們終將逝去的青春 |
| 平凡的世界 |
| aj |
| 我是作者 |
+----------------------+
未排序數(shù)據(jù)“如果讀者自己試驗這個查詢,可能會發(fā)現(xiàn)顯示輸出的數(shù)據(jù)順序與這里的不同。出現(xiàn)這種情況很正常。如果沒有明確排序查詢結果(下一章介紹),則返回的數(shù)據(jù)的順序沒有特殊意義。返回數(shù)據(jù)的順序可能是數(shù)據(jù)被添加到表中的順序,
也可能不是。只要返回相同數(shù)目的行,就是正常的。
結束SQL語句多條SQL語葉心須以分號(;)分隔、MySQL如同多數(shù)DBMS一樣,不需要在單條SQL語句后加分號。但特定的DBMS可能必須在單條SQL語葉后加上分號。當然,如果愿意可以總是加上分號。事實上,即使不一定需要,但加上分號肯定沒有壞處。如果你使用的是mySq1l命令行,必須加上分號來結束SQL語句。
SQL語句和大小寫 請注意,SQL語句不區(qū)分大小寫,因此SELECT與select是相同的.同樣,寫成Select也沒有關系。許多SQL開發(fā)人員喜歡對所有SQL關鍵字使用大寫,而對所有列和表名使用小寫,這樣做使代碼更易于閱讀和調試
使用空格 在處理SQL語句時,其中所有空格都被忽略。SQL語句可以在一行上給出,也可以分成許多行.多數(shù)SQL開發(fā)人員認為將SQL語句分成多行更容易閱讀和調試。
4.3 檢索多個列
要想從一個表中檢索多個列,使用相同的SELECT語句。唯一的不同是必須在SELECT關鍵字后給出多個列名,列名之間必須以逗號分隔。
當心逗號在選擇多個列時,一定要在列名之間加上逗號,但_
最后一個列名后不加。如果在最后一個列名后加了迎號,將出
現(xiàn)錯誤。
輸入
SELECT name ,author FROM book_info;
輸出
+----------------------+-----------+
| name | author |
+----------------------+-----------+
| JAVAWeb | b |
| 1111 | c |
| 名稱一 | 我的作者 |
| 或者 | 余華 |
| 名稱一 | 安安 |
| 山月不知心底事 | 辛夷塢 |
| 致我們終將逝去的青春 | 辛夷塢 |
| 平凡的世界 | 路遙 |
| aj | back back |
| 我是作者 | 中文測試 |
+----------------------+-----------+
4.4 檢索所有列
輸入 select * from book_info;
分析 如果給定一個通配符(*),則返回表中所有列。列的順序一般是列在表定義中出現(xiàn)的順序。但有時候并不是這樣的,表的模式的變化(如添加或刪除列)可能會導致順序的變化。
4.5 檢索不同的行
使用DISTINCT關鍵字,返回不同值的列表
輸入 SELECT DISTINCT price FROM book_info;
分析 SELECT DISTINCT price告訴MYSQL 只返回不同的price行。
輸出
+-------+
| price |
+-------+
| 20.6 |
| 30 |
| 80 |
| 30.5 |
| 35 |
| 40 |
| 58 |
+-------+
4.6 限制結果
SELECT語句返回所有匹配的行,它們可能是指定表中的每個行。為了返回第一行或前幾行,可使用LIMIT子句。
輸入 SELECT price FROM book_info LIMIT 5;
分析 此語句使用SELECT語句檢索單個列。LIMIT5指示MySQL返回不多于5行
為得出下一個5行,可指定要檢索的開始行和行數(shù):
輸入 SELECT price FROM book_info LIMIT 5,5;
分析 LIMIT5,5指示MySQL返回從行5開始的5行。第一個數(shù)為開始位置,第二個數(shù)為要檢索的行數(shù)。
索引從0開始~ 在行數(shù)不夠時,有多少返回多少!
4.7 使用完全限定的表名
使用完全限定的名字來引用列(同時使用表名和列字)
輸入 SELECT book_info.name FROM book_info;
表名也可以是完全限定的:
SELECT book_info.name FROM book.book_info;
第5章 排序檢索數(shù)據(jù)
5.1 排序數(shù)據(jù)
為了明確地排序用SELECT語句檢索出的數(shù)據(jù),可使用0RDER BY子句。0RDER BY子句取一個或多個列的名字,據(jù)此對輸出進行排序
輸入 select book_info.name FROM book_info ORDER BY name;
輸出
+----------------------+
| name |
+----------------------+
| 1111 |
| aj |
| JAVAWeb |
| 名稱一 |
| 名稱一 |
| 山月不知心底事 |
| 平凡的世界 |
| 我是作者 |
| 或者 |
| 致我們終將逝去的青春 |
+----------------------+
ORDER BY使用非檢索的列排序數(shù)據(jù)是完全合法的。
5.2 按多個列排序
輸入 SELECT name ,price,author FROM book_info ORDER BY price,author;
輸出
+----------------------+-------+-----------+ | name | price | author | +----------------------+-------+-----------+ | JAVAWeb | 20.6 | b | | 1111 | 30 | c | | 或者 | 30 | 余華 | | 名稱一 | 30.5 | 安安 | | 山月不知心底事 | 35 | 辛夷塢 | | 穩(wěn)穩(wěn)當當 | 40 | A | | 平凡的世界 | 40 | 路遙 | | 致我們終將逝去的青春 | 40 | 辛夷塢 | | 測試 | 40.5 | 中 | | aj | 58 | back back | | 我是作者 | 58 | 中文測試 | | 名稱一 | 80 | 我的作者 | +----------------------+-------+-----------+上訴例子表示,僅在多個具有相同的price值時才對書本按autor進行排序,如果price列中所有的值都是唯一的,則不會按author排序。
5.3 指定方向排序
數(shù)據(jù)有升序和降序,為了進行降序排序,必須指定DESC關鍵字。
輸入 SELECT name ,price,author FROM book_info ORDER BY author DESC;
輸出
+----------------------+-------+-----------+
| name | price | author |
+----------------------+-------+-----------+
| 致我們終將逝去的青春 | 40 | 辛夷塢 |
| 山月不知心底事 | 35 | 辛夷塢 |
| 平凡的世界 | 40 | 路遙 |
| 名稱一 | 80 | 我的作者 |
| 名稱一 | 30.5 | 安安 |
| 或者 | 30 | 余華 |
| 我是作者 | 58 | 中文測試 |
| 測試 | 40.5 | 中 |
| 1111 | 30 | c |
| aj | 58 | back back |
| JAVAWeb | 20.6 | b |
| 穩(wěn)穩(wěn)當當 | 40 | A |
+----------------------+-------+-----------+
在多列上降序排序 如果想在多個列上進行降序排序,必須對每個列指定DESC關鍵字。
使用ORDER BY 和LIMIT組合,,能夠找出一個列中最高或最低的值。
輸入 SELECT price FROM book_info ORDER BY price DESC LIMIT 1;
輸出
+-------+
| price |
+-------+
| 80 |
+-------+
分析price DESC保證行是按照由最昂貴到最便宜檢索的,而LIMIT1告訴MySQL僅返回一行。
0RDER BY子句的位置“在給出O0RDER BY二句時,應該保證它位于FROM十句之后.如果使用tIMIT,它處須位于0RDER BY之后。使用子句的次序不對將產生錯誤消息。
第6章 過濾數(shù)據(jù)
6.1 使用WHERE語句
輸入 SELECT name,price,author FROM book_info WHERE price=30;
輸出
+------+-------+--------+
| name | price | author |
+------+-------+--------+
| 1111 | 30 | c |
| 或者 | 30 | 余華 |
+------+-------+--------+
分析
這條語句從book_info 表中檢索三個列,但不返回所有行,只返回price值為30的行。
WHERE子句的位置在同時使用ORDER BY和WHERE子句時,應該讓0RDERBY位于WHERE之后,否則將會產生錯誤。
6.2 WHERE 語句子句操作符
| 操作符 | 說明 |
|---|---|
| = | 等于 |
| <> | |
| != | |
| < | |
| <= | |
| > | |
| >= | |
| BETAEEN | |
-
6.2.1 檢查單個值
輸入
SELECT name,price,author FROM book_info WHERE price <=30;
-
6.2.2 不匹配檢查
輸入
SELECT name,price,author FROM book_info WHERE price <> 40;
輸出
+----------------+-------+-----------+ | name | price | author | +----------------+-------+-----------+ | JAVAWeb | 20.6 | b | | 1111 | 30 | c | | 名稱一 | 80 | 我的作者 | | 或者 | 30 | 余華 | | 名稱一 | 30.5 | 安安 | | 山月不知心底事 | 35 | 辛夷塢 | | aj | 58 | back back | | 我是作者 | 58 | 中文測試 | | 測試 | 40.5 | 中 | +----------------+-------+-----------+
-
6.2.3 范圍值檢查
檢查范圍值,可使用 BETWEEN關鍵字
輸入
SELECT name,price,author FROM book_info WHERE price BETWEEN 20 AND 40;
輸出
+----------------------+-------+--------+ | name | price | author | +----------------------+-------+--------+ | JAVAWeb | 20.6 | b | | 1111 | 30 | c | | 或者 | 30 | 余華 | | 名稱一 | 30.5 | 安安 | | 山月不知心底事 | 35 | 辛夷塢 | | 致我們終將逝去的青春 | 40 | 辛夷塢 | | 平凡的世界 | 40 | 路遙 | | 穩(wěn)穩(wěn)當當 | 40 | A | +----------------------+-------+--------+
- 6.2.4 空值檢查
輸入
SELECT name,price,author FROM book_info WHERE name IS NULL;
第7章 數(shù)據(jù)過濾
7.1
7.1.1 AND操作符
輸入
SELECT name,price,author,bookCount FROM book_info WHERE bookCount < 40 AND price <50;
輸出
+----------------------+-------+--------+-----------+
| name | price | author | bookCount |
+----------------------+-------+--------+-----------+
| JAVAWeb | 20.6 | b | 10 |
| 名稱一 | 30.5 | 安安 | 20 |
| DD | 35 | 辛夷塢 | 10 |
| 致我們終將逝去的青春 | 40 | 辛夷塢 | 0 |
| 平凡的世界 | 40 | 路遙 | 0 |
+----------------------+-------+--------+-----------+
7.2 IN操作符
IN操作符用來指定條件范圍,范圍中的每個條件都可以進行匹配。
輸入
SELECT name,author FROM book_info WHERE price in (30,40,58) ORDER BY name;
輸出
+----------------------+-----------+
| name | author |
+----------------------+-----------+
| 1111 | c |
| aj | back back |
| 平凡的世界 | 路遙 |
| 我是作者 | 中文測試 |
| 或者 | 余華 |
| 穩(wěn)穩(wěn)當當 | A |
| 致我們終將逝去的青春 | 辛夷塢 |
+----------------------+-----------+
分析
此SELECT語句價格為30、40、58的所有書本信息。IN操作符后跟由逗號分隔的合法值清單,整個清單必須括在圓括號中。(IN并不是數(shù)學中的區(qū)間概念,如30、40、58僅僅是30,40,58)
IN和OR功能相同,如下
輸入
SELECT name,author FROM book_info WHERE price=30 OR price=40 OR price=58 ORDER BY name;
IN操作符的優(yōu)點:
- 在使用長的合法選項清單時,IN操作符的語法更清楚且更直觀。
- 在使用IN時,計算的次序更容易管理(因為使用的操作符更少)。
- IN操作符一般比0R操作符清單執(zhí)行更快。
- IN的最大優(yōu)點是可以包含其他SELECT語句,使得能夠更動態(tài)地建立WHERE子句。
7.3 NOT操作符
WHERE子句中的NOT操作符有且只有一個功能,那就是否定它之后所
跟的任何條件。
輸入
SELECT name,author FROM book_info WHERE price NOT IN (30,40,58) ORDER BY name;
輸出
+---------+----------+
| name | author |
+---------+----------+
| DD | 辛夷塢 |
| JAVAWeb | b |
| 名稱一 | 我的作者 |
| 名稱一 | 安安 |
| 測試 | 中 |
+---------+----------+
第8章 用通配符進行過濾
8.1 LIKE操作符
8.1.1 百分號(%)通配符
最常使用的通配符是百分號(%)。在搜索中,%表示任何字符出現(xiàn)任意次數(shù)。例如,為了找出所有以詞名起頭的產品,可使用以下SELECT語句:
輸入
SELECT * FROM book_info WHERE name LIKE '名%';
輸出
+----+--------+-------+-----------+-----------+
| id | name | price | bookCount | author |
+----+--------+-------+-----------+-----------+
| 3 | 名稱二 | 80 | 77 | 我的作者 |
| 5 | 名稱一 | 30.5 | 20 | 安安 |
| 9 | 名稱三 | 58 | 60 | back back |
+----+--------+-------+-----------+-----------+
通配符可在搜索模式中任意位置使用,并且可以使用多個通配符。下面的例子使用兩個通配符,它們位于模式的兩端:
輸入
SELECT * FROM book_info WHERE name LIKE '%的%';
輸出
+----+----------------------+-------+-----------+--------+
| id | name | price | bookCount | author |
+----+----------------------+-------+-----------+--------+
| 7 | 致我們終將逝去的青春 | 40 | 0 | 辛夷塢 |
| 8 | 平凡的世界 | 40 | 0 | 路遙 |
+----+----------------------+-------+-----------+--------+
8.1.2 下劃線(_)通配符
另一個有用的通配符是下劃線(_)。下劃線的用途與%一樣,但下劃線只匹配單個字符而不是多個字符。
8.2 使用通配符的技巧
- 不要過度使用通配符。如果其他操作符能達到相同的目的,應該
使用其他操作符。 - 在確實需要使用通配符時,除非絕對有必要,否則不要把它們用
在搜索模式的開始處。把通配符置于搜索模式的開始處,搜索起
來是最慢的。 - 仔細注意通配符的位置。如果放錯地方,可能不會返回想要的數(shù)據(jù)。
第9章 用正則表達式進行搜索
9.1 正則表達式介紹
9.2 使用MySql正則表達式
9.2.1 基本字符匹配
9.2.2 進行OR匹配
輸入
SELECT * FROM book_info WHERE bookCount REGEXP '20|60|50' ORDER BY name;
輸出
+----+----------+-------+-----------+-----------+
| id | name | price | bookCount | author |
+----+----------+-------+-----------+-----------+
| 2 | 1111 | 30 | 50 | c |
| 5 | 名稱一 | 30.5 | 20 | 安安 |
| 9 | 名稱三 | 58 | 60 | back back |
| 14 | 我是作者 | 58 | 60 | 中文測試 |
+----+----------+-------+-----------+-----------+
9.2.3 匹配幾個字符之一
9.2.4 匹配范圍
輸入
SELECT * FROM book_info WHERE name REGEXP '[1-6]書名' ORDER BY name;
輸出
+----+---------+-------+-----------+--------+
| id | name | price | bookCount | author |
+----+---------+-------+-----------+--------+
| 18 | 2書名字 | 50 | 200 | 作者B |
| 19 | 3書名 | 20 | 63 | 作者C |
| 21 | 5書名 | 20 | 60 | 作者4 |
+----+---------+-------+-----------+--------+
9.2.5 匹配特色字符
例如想找出包含.字符的值,該怎樣搜索
輸入
SELECT * FROM book_info WHERE name REGEXP '\\.' ORDER BY name;
注意:使用.匹配需要使用兩個\進行轉義;
9.2.6 匹配字符類
| 類 | 說明 |
|---|---|
| [alnum:] | 任意孛母和數(shù)子(同[a-ZA-Z0-9]) |
| [:alpha:] | 任意字符(同[a-zA-Z]) |
| [:blank:] | 空格和制表(同[V\t] |
| [:cntrl:] | ASCII控制字符(ASCII0到31和127) |
| [:digit:] | 任意數(shù)字(同[0-9]) |
| [:graph:1] | 與[:print:]相同,但不包括空格 |
| [:Lower:] | 任意小寫字母(同[a-z]) |
| [:print:] | 任意可打印字符 |
| [:punct:] | 既不在[:alnum:]又不在[:cntr1l:]中的任意字符 |
9.2.7 匹配多個實例
9.2.8 定位符
第10章 創(chuàng)建計算字段
10.1 計算字段
10.2 拼接字段
在MySQL的SELECT語句中,可使用Concat()函數(shù)來拼接兩個列。
輸入
SELECT Concat(name,'(',price,')') FROM book_info ;
輸出
+----------------------------+
| Concat(name,'(',price,')') |
+----------------------------+
| JAVAWeb(20.6) |
| 1111(30) |
| 名稱二(80) |
| 或者(30) |
| 名稱一(30.5) |
| DD(35) |
| 致我們終將逝去的青春(40) |
| 平凡的世界(40) |
| 名稱三(58) |
| 我是作者(58) |
| 穩(wěn)穩(wěn)當當(40) |
| 測試(40.5) |
| 1 書名(30) |
| 2書名字(50) |
| 3書名(20) |
| 9書名(37) |
| 5書名(20) |
| 書.名(15) |
+----------------------------+
Rtrim()可以刪除數(shù)據(jù)右側多余的空格
輸入
SELECT Concat(Rtrim(name),'(',Rtrim(price),')') FROM book_info ;
10.3 執(zhí)行算術計算
total_price 包含單價和數(shù)量乘積。
輸入
SELECT name,price ,bookCount ,price*bookCount AS total_price FROM book_info;
輸出
+----------------------+-------+-----------+-------------+
| name | price | bookCount | total_price |
+----------------------+-------+-----------+-------------+
| JAVAWeb | 20.6 | 10 | 206 |
| 1111 | 30 | 50 | 1500 |
| 名稱二 | 80 | 77 | 6160 |
| 或者 | 30 | 40 | 1200 |
| 名稱一 | 30.5 | 20 | 610 |
| DD | 35 | 10 | 350 |
| 致我們終將逝去的青春 | 40 | 0 | 0 |
| 平凡的世界 | 40 | 0 | 0 |
| 名稱三 | 58 | 60 | 3480 |
| 我是作者 | 58 | 60 | 3480 |
| 穩(wěn)穩(wěn)當當 | 40 | 100 | 4000 |
| 測試 | 40.5 | 100 | 4050 |
| 1 書名 | 30 | 60 | 1800 |
| 2書名字 | 50 | 200 | 10000 |
| 3書名 | 20 | 63 | 1260 |
| 9書名 | 37 | 50 | 1850 |
| 5書名 | 20 | 60 | 1200 |
| 書.名 | 15 | 66 | 990 |
+----------------------+-------+-----------+-------------+