《MySQL必知必會》學習筆記 目錄
http://www.itdecent.cn/p/97bab08c6755
本篇內容
了解SQL、MySQL簡介、使用MySQL、檢索數(shù)據(jù) 、排序檢索數(shù)據(jù)、過濾數(shù)據(jù)、用通配符進行過濾
MySQL安裝 自行谷歌
《MySQL 必知必會》創(chuàng)建樣例表
mysql_scripts.zip 下載 下面鏈接
鏈接:https://pan.baidu.com/s/1y-OZG9fbdKFP3r-XlIjeMA
提取碼:ehg5
(1)創(chuàng)建一個新的數(shù)據(jù)源
create database crashcourse; (這里使用書中的數(shù)據(jù)源名稱)
(2)選擇新的數(shù)據(jù)源
use crashcourse;
(3)執(zhí)行creat.sql腳本
source create.sql; (使用mysql命令行使用程序的方法,source+文件路徑 如有必要可能為絕對路徑)
(4)用populate.sql文件填充各個新表
source populate.sql;
檢測樣例創(chuàng)建是否成功

更多可參看:
https://www.runoob.com/mysql/mysql-tutorial.html
第一章 了解SQL
介紹數(shù)據(jù)庫和SQL,它們是學習MySQL的先決條件。
1.1 數(shù)據(jù)庫基礎
1.1.1 什么是數(shù)據(jù)庫
數(shù)據(jù)庫是一個以某種有組織的方式存儲的數(shù)據(jù)集合。理解數(shù)據(jù)庫的一種最簡單的辦法是將其想象為一個文件柜。此文件柜是一個存放數(shù)據(jù)的物理位置,不管數(shù)據(jù)是什么以及如何組織的。
數(shù)據(jù)庫(database)
保存有組織的數(shù)據(jù)的容器(通常是一個文件或一組文件)。
1.1.2 表
表是一種結構化的文件,可用來存儲某種特定類型的數(shù)據(jù)。表可以保存顧客清單、產(chǎn)品目錄,或者其他信息清單。
表(table)
某種特定類型數(shù)據(jù)的結構化清單。
關鍵的一點在于,存儲在表中的數(shù)據(jù)是一種類型的數(shù)據(jù)或一個清單。
數(shù)據(jù)庫中的每個表都有一個名字,用來標識自己。此名字是唯一的,這表示數(shù)據(jù)庫中沒有其他表具有相同的名字。
表名
表名的唯一性取決于多個因素,如數(shù)據(jù)庫名和表名等的結合。這表示,雖然在相同數(shù)據(jù)庫中不能兩次使用相同的表名,但在不同的數(shù)據(jù)庫中卻可以使用相同的表名。
模式(schema)
關于數(shù)據(jù)庫和表的布局及特性的信息。
1.1.3 列和數(shù)據(jù)類型
表由列組成。列中存儲著表中某部分的信息。
列(column)
表中的一個字段。所有表都是由一個或多個列組成的
數(shù)據(jù)庫中每個列都有相應的數(shù)據(jù)類型。數(shù)據(jù)類型定義列可以存儲的數(shù)據(jù)種類。
數(shù)據(jù)類型(datatype)
所容許的數(shù)據(jù)的類型。每個表列都有相應的數(shù)據(jù)類型,它限制(或容許)該列中存儲的數(shù)據(jù)。
1.1.4 行
表中的數(shù)據(jù)是按行存儲的,所保存的每個記錄存儲在自己的行內。
行(row) 表中的一個記錄。
1.1.5 主鍵
表中每一行都應該有可以唯一標識自己的一列(或一組列)。
主鍵(primary key)
一列(或一組列),其值能夠唯一區(qū)分表中每個行。
唯一標識表中每行的這個列(或這組列)稱為主鍵。主鍵用來表示一個特定的行。沒有主鍵,更新或刪除表中特定行很困難,因為沒有安全的方法保證只涉及相關的行。
1.2 什么是SQL
SQL(發(fā)音為字母S-Q-L或sequel)是結構化查詢語言(Structured Query Language)的縮寫。 SQL是一種專門用來與數(shù)據(jù)庫通信的語言。
第 2 章MySQL簡介
介紹什么是MySQL,以及在MySQL中可以應用什么工具。
2.1 什么是MySQL
數(shù)據(jù)的所有存儲、檢索、管理和處理實際上是由數(shù)據(jù)庫軟件——DBMS(數(shù)據(jù)庫管理系統(tǒng))完成的。 MySQL是一種DBMS,即它是一種數(shù)據(jù)庫軟件
MySQL、 Oracle以及Microsoft SQL Server等數(shù)據(jù)庫是基于客戶機—服務器的數(shù)據(jù)庫??蛻魴C—服務器應用分為兩個不同的部分。 服務器部分是負責所有數(shù)據(jù)訪問和處理的一個軟件。這個軟件運行在稱為數(shù)據(jù)庫服務器的計算機上。
與數(shù)據(jù)文件打交道的只有服務器軟件。關于數(shù)據(jù)、數(shù)據(jù)添加、刪除和數(shù)據(jù)更新的所有請求都由服務器軟件完成。客戶機是與用戶打交道的軟件。
2.2 MySQL工具
MySQL是一個客戶機—服務器DBMS,因此,為了使用MySQL,需要有一個客戶機,即你需要用來與MySQL打交道(給MySQL提供要執(zhí)行的命令)的一個應用。
2.2.1 mysql命令行實用程序
在操作系統(tǒng)命令提示符下輸入mysql -u root -p,提示輸入密碼
MySQL選項和參數(shù)
如果僅輸入mysql, 可能會出現(xiàn)一個錯誤消息。mysql接受你可以(和可能需要)使用的一組命令行參數(shù)。例如,為了指定用戶登錄名ben,應該使用mysql -u ben。為了給出用戶名、主機名、端口和口令,應該使用mysql -u ben -p -h myserver -P 9999。 mysql -u root -p
請注意:
- 命令輸入在mysql>之后;
- 命令用;或\g結束,換句話說,僅按Enter不執(zhí)行命令;
- 輸入help或\h獲得幫助,也可以輸入更多的文本獲得特定命令的幫助(如,輸入help select獲得使用SELECT語句的幫助);
- 輸入quit或exit退出命令行實用程序。

2.2.2 MySQL Administrator
MySQL Administrator(MySQL管理器)是一個圖形交互客戶機,用來簡化MySQL服務器的管理。
獲得MySQL Administrator MySQL Administrator不作為核心MySQL 的 組 成 部 分 安 裝 。 必 須 從 http://dev.mysql.com/downloads/下載它
Ubuntu 中 mysql數(shù)據(jù)庫路徑
/var/lib/mysql 日志文件,數(shù)據(jù)庫 [重點要知道這個]
現(xiàn)使用MySQL Workbench
2.2.3 MySQL Query Browser
MySQL Query Browser為一個圖形交互客戶機,用來編寫和執(zhí)行MySQL命令。
第3章 使用MySQL
學習如何連接和登錄到MySQL,如何執(zhí)行MySQL語句,以及如何獲得數(shù)據(jù)庫和表的信息。
3.1 連接
MySQL與所有客戶機—服務器DBMS一樣,要求在能執(zhí)行命令之前登錄到DBMS。
3.2 選擇數(shù)據(jù)庫
在你最初連接到MySQL時,沒有任何數(shù)據(jù)庫打開供你使用。在你能執(zhí)行任意數(shù)據(jù)庫操作前,需要選擇一個數(shù)據(jù)庫。為此,可使用USE關鍵字。
關鍵字(key word) 作為MySQL語言組成部分的一個保留字。決不要用關鍵字命名一個表或列。附錄E列出了MySQL的關鍵字。

3.3 了解數(shù)據(jù)庫和表
內部的表一般不直接訪問??捎肕ySQL的SHOW命令來顯示這些信息(MySQL從內部表中提取這些信息)。
SHOW DATABASES;

SHOW DATABASES;返回可用數(shù)據(jù)庫的一個列表。包含在這個列表中的可能是MySQL內部使用的數(shù)據(jù)庫
SHOW TABLES;

SHOW TABLES;返回當前選擇的數(shù)據(jù)庫內可用表的列表。
SHOW COLUMNS FROM customer;

SHOW COLUMNS 要 求 給 出 一 個 表 名 ( 這 個 例 子 中 的 FROMcustomers),它對每個字段返回一行,行中包含字段名、數(shù)據(jù)類型、是否允許NULL、鍵信息、默認值以及其他信息(如字段cust_id的auto_increment)
DESCRIBE語句 MySQL支持用DESCRIBE作為SHOW COLUMNS FROM的一種快捷方式。換句話說, DESCRIBE customers;是SHOW COLUMNS FROM customers;的一種快捷方式。

所支持的其他SHOW語句還有:
SHOW STATUS,用于顯示廣泛的服務器狀態(tài)信息;
SHOW CREATE DATABASE和SHOW CREATE TABLE,分別用來顯示創(chuàng)建特定數(shù)據(jù)庫或表的MySQL語句;
SHOW GRANTS,用來顯示授予用戶(所有用戶或特定用戶)的安全權限;
SHOW ERRORS和SHOW WARNINGS, 用來顯示服務器錯誤或警告消息。
HELP SHOW; 顯示允許的SHOW語句。
第 4 章 檢 索 數(shù) 據(jù)
介紹如何使用SELECT語句從表中檢索一個或多個數(shù)據(jù)列。
4.1 SELECT語句
SQL語句是由簡單的英語單詞構成的。這些單詞稱為關鍵字,每個SQL語句都是由一個或多個關鍵字構成的。
最經(jīng)常使用的SQL語句就是SELECT語句了。它的用途是從一個或多個表中檢索信息
使用SELECT檢索表數(shù)據(jù),必須至少給出兩條信息——想選擇什么,以及從什么地方選擇
4.2 檢索單個列
SELECT prod_name FROM products;

4.3 檢索多個列
要想從一個表中檢索多個列,使用相同的SELECT語句。唯一的不同是必須在SELECT關鍵字后給出多個列名,列名之間必須以逗號分隔。
SELECT prod_id, prod_name, prod_price FROM products;

4.4 檢索所有列
除了指定所需的列外, SELECT語句還可以檢索所有的列而不必逐個列出它們。這可以通過在實際列名的位置使用星號(*)通配符來達到
SELECT * FROM products;

4.5 檢索不同的行
DISTINCT關鍵字指示MySQL只返回不同的值。
SELECT DISTINCT vend_id FROM products;

SELECT DISTINCT vend_id告訴MySQL只返回不同(唯一)的vend_id行,因此只返回4行
4.6 限制結果
SELECT語句返回所有匹配的行,它們可能是指定表中的每個行。為了返回第一行或前幾行,可使用LIMIT子句。
SELECT prod_name FROM products LIMIT 5;

此語句使用SELECT語句檢索單個列。 LIMIT 5指示MySQL返回不多于5行。
可指定要檢索的開始行和行數(shù)
SELECT prod_name FROM products LIMIT 7,5;

LIMIT 7, 5指示MySQL返回從行7開始的5行。第一個數(shù)為開始位置,第二個數(shù)為要檢索的行數(shù)。
行0 檢索出來的第一行為行0而不是行1。因此, LIMIT 1, 1將檢索出第二行而不是第一行。
MySQL 5的LIMIT語法 MySQL 5支持LIMIT的另一種替代語法。 LIMIT 4 OFFSET 3意為從行3開始取4行,就像LIMIT 3, 4一樣。
SELECT prod_name FROM products LIMIT 7 OFFSET 5;

4.7 使用完全限定的表名
可能會使用完全限定的名字來引用列(同時使用表名和列字)。
SELECT products.prod_name FROM products;
表名也可以是完全限定的
SELECT products.prod_name FROM crashcourse.products;
第5章 排序檢索數(shù)據(jù)
如何使用SELECT語句的ORDER BY子句,根據(jù)需要排序檢索出的數(shù)據(jù)
5.1 排序數(shù)據(jù)
子句(clause) SQL語句由子句構成,有些子句是必需的,而有的是可選的。一個子句通常由一個關鍵字和所提供的數(shù)據(jù)組成。
為了明確地排序用SELECT語句檢索出的數(shù)據(jù),可使用ORDER BY子句。ORDER BY子句取一個或多個列的名字,據(jù)此對輸出進行排序。
SELECT prod_name FROM products ORDER BY prod_name;
5.2 按多個列排序
為了按多個列排序,只要指定列名,列名之間用逗號分開即可
下面的代碼檢索3個列,并按其中兩個列對結果進行排序——首先按價格,然后再按名稱排序。
SELECT prod_id, prod_price, prod_name FROM products ORDER BY prod_price, prod_name;

5.3 指定排序方向
數(shù)據(jù)排序不限于升序排序(從A到Z)。這只是默認的排序順序,還可以使用ORDER BY子句以降序(從Z到A)順序排序。為了進行降序排序,必須指定DESC關鍵字。
SELECT prod_id, prod_price, prod_name FROM products ORDER BY prod_price DESC;

在多個列上降序排序 如果想在多個列上進行降序排序, 必須對每個列指定DESC關鍵字。
使用ORDER BY和LIMIT的組合,能夠找出一個列中最高或最低的值。
SELECT prod_price FROM products ORDER BY prod_price DESC LIMIT 1;

第6章 過 濾 數(shù) 據(jù)
講授如何使用SELECT語句的WHERE子句指定搜索條件。
6.1 使用WHERE子句
數(shù)據(jù)庫表一般包含大量的數(shù)據(jù),很少需要檢索表中所有行。通常只會根據(jù)特定操作或報告的需要提取表數(shù)據(jù)的子集。只檢索所需數(shù)據(jù)需要指定搜索條件( search criteria) ,搜索條件也稱為過濾條件( filtercondition) 。
在SELECT語句中,數(shù)據(jù)根據(jù)WHERE子句中指定的搜索條件進行過濾。
SELECT prod_name, prod_price FROM products WHERE prod_price = 2.50;

6.2 WHERE子句操作符
WHERE子句操作符
| 操 作 符 | 說 明 |
|---|---|
| = | 等于 |
| <> | 不等于 |
| != | 不等于 |
| < | 小于 |
| <= | 小于等于 |
| > | 大于 |
| >= | 大于等于 |
| BETWEEN | 在指定的兩個值之間 |
6.2.1 檢查單個值
SELECT prod_name, prod_price FROM products WHERE prod_name = 'fuses';

SELECT prod_name, prod_price FROM products WHERE prod_price < 10;

6.2.2 不匹配檢查
SELECT vend_id, prod_name FROM products WHERE vend_id <> 1003;

SELECT vend_id, prod_name FROM products WHERE vend_id != 1003;

6.2.3 范圍值檢查
為了檢查某個范圍的值,可使用BETWEEN操作符。其語法與其他WHERE子句的操作符稍有不同,因為它需要兩個值,即范圍的開始值和結束值。
SELECT prod_name, prod_price FROM products WHERE prod_price BETWEEN 5 AND 10;

6.2.4 空值檢查
在創(chuàng)建表時,表設計人員可以指定其中的列是否可以不包含值。在一個列不包含值時,稱其為包含空值NULL。
NULL 無值(no value),它與字段包含0、空字符串或僅僅包含空格不同。
SELECT語句有一個特殊的WHERE子句,可用來檢查具有NULL值的列。這個WHERE子句就是IS NULL子句。
SELECT prod_name FROM products WHERE prod_price IS NULL;

SELECT cust_id FROM customers WHERE cust_email IS NULL;

第 7 章 數(shù) 據(jù) 過 濾
如何組合WHERE子句以建立功能更強的更高級的搜索條件。
7.1 組合WHERE子句
為了進行更強的過濾控制, MySQL允許給出多個WHERE子句。這些子句可以兩種方式使用:以AND子句的方式或OR子句的方式使用。
7.1.1 AND操作符
為了通過不止一個列進行過濾,可使用AND操作符給WHERE子句附加條件。
SELECT prod_id, prod_price, prod_name FROM products WHERE vend_id = 1003 AND prod_price <= 10;

AND 用在WHERE子句中的關鍵字,用來指示檢索滿足所有給定條件的行。
7.1.2 OR操作符
OR操作符與AND操作符不同,它指示MySQL檢索匹配任一條件的行。
SELECT prod_price, prod_name FROM products WHERE vend_id = 1002 OR vend_id = 1003;

OR WHERE子句中使用的關鍵字,用來表示檢索匹配任一給定條件的行。
7.1.3 計算次序
WHERE可包含任意數(shù)目的AND和OR操作符。允許兩者結合以進行復雜和高級的過濾。
但是,組合AND和OR帶來了一個有趣的問題。SQL(像多數(shù)語言一樣)在處理OR操作符前,優(yōu)先處理AND操作符。此問題的解決方法是使用圓括號明確地分組相應的操作符。
SELECT prod_price, prod_name FROM products WHERE (vend_id = 1002 OR vend_id = 1003) AND prod_price >= 10;

7.2 IN操作符
圓括號在WHERE子句中還有另外一種用法。 IN操作符用來指定條件范圍,范圍中的每個條件都可以進行匹配。
SELECT prod_price, prod_name FROM products WHERE vend_id IN (1002,1003) ORDER BY prod_name;

為什么要使用IN操作符?其優(yōu)點具體如下
- 在使用長的合法選項清單時, IN操作符的語法更清楚且更直觀。
- 在使用IN時,計算的次序更容易管理(因為使用的操作符更少)。
- IN操作符一般比OR操作符清單執(zhí)行更快。
- IN的最大優(yōu)點是可以包含其他SELECT語句,使得能夠更動態(tài)地建立WHERE子句。第14章將對此進行詳細介紹
IN WHERE子句中用來指定要匹配值的清單的關鍵字,功能與OR相當。
7.3 NOT操作符
WHERE子句中的NOT操作符有且只有一個功能,那就是否定它之后所跟的任何條件。
NOT WHERE子句中用來否定后跟條件的關鍵字。
SELECT prod_price, prod_name FROM products WHERE vend_id NOT IN (1002,1003) ORDER BY prod_name;

MySQL中的 NOT MySQL 支 持 使 用 NOT 對 IN 、 BETWEEN 和EXISTS子句取反,這與多數(shù)其他DBMS允許使用NOT對各種條件取反有很大的差別。
第 8 章 用通配符進行過濾
介紹什么是通配符、如何使用通配符以及怎樣使用LIKE操作符進行通配搜索,以便對數(shù)據(jù)進行復雜過濾。
8.1 LIKE操作符
通配符(wildcard) 用來匹配值的一部分的特殊字符。
搜索模式(search pattern) 由字面值、通配符或兩者組合構成的搜索條件。
為在搜索子句中使用通配符,必須使用LIKE操作符。 LIKE指示MySQL,后跟的搜索模式利用通配符匹配而不是直接相等匹配進行比較。
8.1.1 百分號(%)通配符
最常使用的通配符是百分號(%)。在搜索串中, %表示任何字符出現(xiàn)任意次數(shù)。
SELECT prod_id, prod_name FROM products WHERE prod_name LIKE 'jet%';

區(qū)分大小寫 根據(jù)MySQL的配置方式,搜索可以是區(qū)分大小寫的。
8.1.2 下劃線(_)通配符
另一個有用的通配符是下劃線(_)。下劃線的用途與%一樣,但下劃線只匹配單個字符而不是多個字符。
SELECT prod_id, prod_name FROM products WHERE prod_name LIKE '_ ton anvil';

區(qū)別:
SELECT prod_id, prod_name FROM products WHERE prod_name LIKE '% ton anvil';

8.2 使用通配符的技巧
MySQL的通配符很有用。但這種功能是有代價的:通配符搜索的處理一般要比前面討論的其他搜索所花時間更長。
- 不要過度使用通配符。如果其他操作符能達到相同的目的,應該使用其他操作符。
- 在確實需要使用通配符時,除非絕對有必要,否則不要把它們用在搜索模式的開始處。把通配符置于搜索模式的開始處,搜索起來是最慢的。
- 仔細注意通配符的位置。如果放錯地方,可能不會返回想要的數(shù)據(jù)。
GitHub鏈接:
https://github.com/lichangke/LeetCode
知乎個人首頁:
https://www.zhihu.com/people/lichangke/
簡書個人首頁:
http://www.itdecent.cn/u/3e95c7555dc7
個人Blog:
https://lichangke.github.io/
歡迎大家來一起交流學習