《MySQL必知必會》學(xué)習(xí)筆記 目錄
http://www.reibang.com/p/97bab08c6755
本篇內(nèi)容
了解SQL、MySQL簡介、使用MySQL官边、檢索數(shù)據(jù) 、排序檢索數(shù)據(jù)内边、過濾數(shù)據(jù)、用通配符進(jìn)行過濾
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漠其,它們是學(xué)習(xí)MySQL的先決條件。
1.1 數(shù)據(jù)庫基礎(chǔ)
1.1.1 什么是數(shù)據(jù)庫
數(shù)據(jù)庫是一個以某種有組織的方式存儲的數(shù)據(jù)集合。理解數(shù)據(jù)庫的一種最簡單的辦法是將其想象為一個文件柜和屎。此文件柜是一個存放數(shù)據(jù)的物理位置拴驮,不管數(shù)據(jù)是什么以及如何組織的。
數(shù)據(jù)庫(database)
保存有組織的數(shù)據(jù)的容器(通常是一個文件或一組文件)柴信。
1.1.2 表
表是一種結(jié)構(gòu)化的文件套啤,可用來存儲某種特定類型的數(shù)據(jù)。表可以保存顧客清單随常、產(chǎn)品目錄潜沦,或者其他信息清單。
表(table)
某種特定類型數(shù)據(jù)的結(jié)構(gòu)化清單绪氛。
關(guān)鍵的一點在于止潮,存儲在表中的數(shù)據(jù)是一種類型的數(shù)據(jù)或一個清單。
數(shù)據(jù)庫中的每個表都有一個名字钞楼,用來標(biāo)識自己。此名字是唯一的袄琳,這表示數(shù)據(jù)庫中沒有其他表具有相同的名字询件。
表名
表名的唯一性取決于多個因素,如數(shù)據(jù)庫名和表名等的結(jié)合唆樊。這表示宛琅,雖然在相同數(shù)據(jù)庫中不能兩次使用相同的表名,但在不同的數(shù)據(jù)庫中卻可以使用相同的表名逗旁。
模式(schema)
關(guān)于數(shù)據(jù)庫和表的布局及特性的信息嘿辟。
1.1.3 列和數(shù)據(jù)類型
表由列組成。列中存儲著表中某部分的信息片效。
列(column)
表中的一個字段红伦。所有表都是由一個或多個列組成的
數(shù)據(jù)庫中每個列都有相應(yīng)的數(shù)據(jù)類型。數(shù)據(jù)類型定義列可以存儲的數(shù)據(jù)種類淀衣。
數(shù)據(jù)類型(datatype)
所容許的數(shù)據(jù)的類型昙读。每個表列都有相應(yīng)的數(shù)據(jù)類型,它限制(或容許)該列中存儲的數(shù)據(jù)膨桥。
1.1.4 行
表中的數(shù)據(jù)是按行存儲的蛮浑,所保存的每個記錄存儲在自己的行內(nèi)。
行(row) 表中的一個記錄只嚣。
1.1.5 主鍵
表中每一行都應(yīng)該有可以唯一標(biāo)識自己的一列(或一組列)沮稚。
主鍵(primary key)
一列(或一組列),其值能夠唯一區(qū)分表中每個行册舞。
唯一標(biāo)識表中每行的這個列(或這組列)稱為主鍵蕴掏。主鍵用來表示一個特定的行。沒有主鍵,更新或刪除表中特定行很困難囚似,因為沒有安全的方法保證只涉及相關(guān)的行剩拢。
1.2 什么是SQL
SQL(發(fā)音為字母S-Q-L或sequel)是結(jié)構(gòu)化查詢語言(Structured Query Language)的縮寫。 SQL是一種專門用來與數(shù)據(jù)庫通信的語言饶唤。
第 2 章MySQL簡介
介紹什么是MySQL徐伐,以及在MySQL中可以應(yīng)用什么工具。
2.1 什么是MySQL
數(shù)據(jù)的所有存儲募狂、檢索办素、管理和處理實際上是由數(shù)據(jù)庫軟件——DBMS(數(shù)據(jù)庫管理系統(tǒng))完成的。 MySQL是一種DBMS祸穷,即它是一種數(shù)據(jù)庫軟件
MySQL性穿、 Oracle以及Microsoft SQL Server等數(shù)據(jù)庫是基于客戶機(jī)—服務(wù)器的數(shù)據(jù)庫±坠觯客戶機(jī)—服務(wù)器應(yīng)用分為兩個不同的部分需曾。 服務(wù)器部分是負(fù)責(zé)所有數(shù)據(jù)訪問和處理的一個軟件。這個軟件運行在稱為數(shù)據(jù)庫服務(wù)器的計算機(jī)上祈远。
與數(shù)據(jù)文件打交道的只有服務(wù)器軟件呆万。關(guān)于數(shù)據(jù)、數(shù)據(jù)添加车份、刪除和數(shù)據(jù)更新的所有請求都由服務(wù)器軟件完成谋减。客戶機(jī)是與用戶打交道的軟件。
2.2 MySQL工具
MySQL是一個客戶機(jī)—服務(wù)器DBMS扫沼,因此出爹,為了使用MySQL,需要有一個客戶機(jī)缎除,即你需要用來與MySQL打交道(給MySQL提供要執(zhí)行的命令)的一個應(yīng)用严就。
2.2.1 mysql命令行實用程序
在操作系統(tǒng)命令提示符下輸入mysql -u root -p,提示輸入密碼
MySQL選項和參數(shù)
如果僅輸入mysql器罐, 可能會出現(xiàn)一個錯誤消息盈蛮。mysql接受你可以(和可能需要)使用的一組命令行參數(shù)。例如技矮,為了指定用戶登錄名ben抖誉,應(yīng)該使用mysql -u ben。為了給出用戶名衰倦、主機(jī)名袒炉、端口和口令,應(yīng)該使用mysql -u ben -p -h myserver -P 9999樊零。 mysql -u root -p
請注意:
- 命令輸入在mysql>之后我磁;
- 命令用;或\g結(jié)束孽文,換句話說,僅按Enter不執(zhí)行命令夺艰;
- 輸入help或\h獲得幫助芋哭,也可以輸入更多的文本獲得特定命令的幫助(如,輸入help select獲得使用SELECT語句的幫助)郁副;
- 輸入quit或exit退出命令行實用程序减牺。
2.2.2 MySQL Administrator
MySQL Administrator(MySQL管理器)是一個圖形交互客戶機(jī),用來簡化MySQL服務(wù)器的管理存谎。
獲得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為一個圖形交互客戶機(jī)既荚,用來編寫和執(zhí)行MySQL命令稚失。
第3章 使用MySQL
學(xué)習(xí)如何連接和登錄到MySQL,如何執(zhí)行MySQL語句恰聘,以及如何獲得數(shù)據(jù)庫和表的信息句各。
3.1 連接
MySQL與所有客戶機(jī)—服務(wù)器DBMS一樣,要求在能執(zhí)行命令之前登錄到DBMS晴叨。
3.2 選擇數(shù)據(jù)庫
在你最初連接到MySQL時诫钓,沒有任何數(shù)據(jù)庫打開供你使用。在你能執(zhí)行任意數(shù)據(jù)庫操作前篙螟,需要選擇一個數(shù)據(jù)庫。為此问拘,可使用USE關(guān)鍵字遍略。
關(guān)鍵字(key word) 作為MySQL語言組成部分的一個保留字。決不要用關(guān)鍵字命名一個表或列骤坐。附錄E列出了MySQL的關(guān)鍵字绪杏。
3.3 了解數(shù)據(jù)庫和表
內(nèi)部的表一般不直接訪問∨ι埽可用MySQL的SHOW命令來顯示這些信息(MySQL從內(nèi)部表中提取這些信息)蕾久。
SHOW DATABASES;
SHOW DATABASES;返回可用數(shù)據(jù)庫的一個列表。包含在這個列表中的可能是MySQL內(nèi)部使用的數(shù)據(jù)庫
SHOW TABLES;
SHOW TABLES;返回當(dāng)前選擇的數(shù)據(jù)庫內(nèi)可用表的列表拌夏。
SHOW COLUMNS FROM customer;
SHOW COLUMNS 要 求 給 出 一 個 表 名 ( 這 個 例 子 中 的 FROMcustomers)僧著,它對每個字段返回一行,行中包含字段名障簿、數(shù)據(jù)類型盹愚、是否允許NULL、鍵信息站故、默認(rèn)值以及其他信息(如字段cust_id的auto_increment)
DESCRIBE語句 MySQL支持用DESCRIBE作為SHOW COLUMNS FROM的一種快捷方式皆怕。換句話說毅舆, DESCRIBE customers;是SHOW COLUMNS FROM customers;的一種快捷方式。
所支持的其他SHOW語句還有:
SHOW STATUS愈腾,用于顯示廣泛的服務(wù)器狀態(tài)信息憋活;
SHOW CREATE DATABASE和SHOW CREATE TABLE,分別用來顯示創(chuàng)建特定數(shù)據(jù)庫或表的MySQL語句虱黄;
SHOW GRANTS悦即,用來顯示授予用戶(所有用戶或特定用戶)的安全權(quán)限;
SHOW ERRORS和SHOW WARNINGS礁鲁, 用來顯示服務(wù)器錯誤或警告消息盐欺。
HELP SHOW; 顯示允許的SHOW語句。
第 4 章 檢 索 數(shù) 據(jù)
介紹如何使用SELECT語句從表中檢索一個或多個數(shù)據(jù)列仅醇。
4.1 SELECT語句
SQL語句是由簡單的英語單詞構(gòu)成的冗美。這些單詞稱為關(guān)鍵字,每個SQL語句都是由一個或多個關(guān)鍵字構(gòu)成的析二。
最經(jīng)常使用的SQL語句就是SELECT語句了粉洼。它的用途是從一個或多個表中檢索信息
使用SELECT檢索表數(shù)據(jù),必須至少給出兩條信息——想選擇什么叶摄,以及從什么地方選擇
4.2 檢索單個列
SELECT prod_name FROM products;
4.3 檢索多個列
要想從一個表中檢索多個列属韧,使用相同的SELECT語句。唯一的不同是必須在SELECT關(guān)鍵字后給出多個列名蛤吓,列名之間必須以逗號分隔宵喂。
SELECT prod_id, prod_name, prod_price FROM products;
4.4 檢索所有列
除了指定所需的列外, SELECT語句還可以檢索所有的列而不必逐個列出它們会傲。這可以通過在實際列名的位置使用星號(*)通配符來達(dá)到
SELECT * FROM products;
4.5 檢索不同的行
DISTINCT關(guān)鍵字指示MySQL只返回不同的值锅棕。
SELECT DISTINCT vend_id FROM products;
SELECT DISTINCT vend_id告訴MySQL只返回不同(唯一)的vend_id行,因此只返回4行
4.6 限制結(jié)果
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語句由子句構(gòu)成,有些子句是必需的弧烤,而有的是可選的忱屑。一個子句通常由一個關(guān)鍵字和所提供的數(shù)據(jù)組成。
為了明確地排序用SELECT語句檢索出的數(shù)據(jù)暇昂,可使用ORDER BY子句莺戒。ORDER BY子句取一個或多個列的名字,據(jù)此對輸出進(jìn)行排序急波。
SELECT prod_name FROM products ORDER BY prod_name;
5.2 按多個列排序
為了按多個列排序从铲,只要指定列名,列名之間用逗號分開即可
下面的代碼檢索3個列澄暮,并按其中兩個列對結(jié)果進(jìn)行排序——首先按價格名段,然后再按名稱排序。
SELECT prod_id, prod_price, prod_name FROM products ORDER BY prod_price, prod_name;
5.3 指定排序方向
數(shù)據(jù)排序不限于升序排序(從A到Z)泣懊。這只是默認(rèn)的排序順序伸辟,還可以使用ORDER BY子句以降序(從Z到A)順序排序。為了進(jìn)行降序排序馍刮,必須指定DESC關(guān)鍵字信夫。
SELECT prod_id, prod_price, prod_name FROM products ORDER BY prod_price DESC;
在多個列上降序排序 如果想在多個列上進(jìn)行降序排序, 必須對每個列指定DESC關(guān)鍵字卡啰。
使用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子句中指定的搜索條件進(jìn)行過濾。
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子句的操作符稍有不同,因為它需要兩個值绵载,即范圍的開始值和結(jié)束值埂陆。
SELECT prod_name, prod_price FROM products WHERE prod_price BETWEEN 5 AND 10;
6.2.4 空值檢查
在創(chuàng)建表時苛白,表設(shè)計人員可以指定其中的列是否可以不包含值。在一個列不包含值時焚虱,稱其為包含空值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子句以建立功能更強(qiáng)的更高級的搜索條件。
7.1 組合WHERE子句
為了進(jìn)行更強(qiáng)的過濾控制丰嘉, MySQL允許給出多個WHERE子句夯到。這些子句可以兩種方式使用:以AND子句的方式或OR子句的方式使用。
7.1.1 AND操作符
為了通過不止一個列進(jìn)行過濾供嚎,可使用AND操作符給WHERE子句附加條件黄娘。
SELECT prod_id, prod_price, prod_name FROM products WHERE vend_id = 1003 AND prod_price <= 10;
AND 用在WHERE子句中的關(guān)鍵字,用來指示檢索滿足所有給定條件的行克滴。
7.1.2 OR操作符
OR操作符與AND操作符不同逼争,它指示MySQL檢索匹配任一條件的行。
SELECT prod_price, prod_name FROM products WHERE vend_id = 1002 OR vend_id = 1003;
OR WHERE子句中使用的關(guān)鍵字劝赔,用來表示檢索匹配任一給定條件的行誓焦。
7.1.3 計算次序
WHERE可包含任意數(shù)目的AND和OR操作符。允許兩者結(jié)合以進(jìn)行復(fù)雜和高級的過濾着帽。
但是杂伟,組合AND和OR帶來了一個有趣的問題。SQL(像多數(shù)語言一樣)在處理OR操作符前仍翰,優(yōu)先處理AND操作符赫粥。此問題的解決方法是使用圓括號明確地分組相應(yīng)的操作符。
SELECT prod_price, prod_name FROM products WHERE (vend_id = 1002 OR vend_id = 1003) AND prod_price >= 10;
7.2 IN操作符
圓括號在WHERE子句中還有另外一種用法予借。 IN操作符用來指定條件范圍越平,范圍中的每個條件都可以進(jìn)行匹配。
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章將對此進(jìn)行詳細(xì)介紹
IN WHERE子句中用來指定要匹配值的清單的關(guān)鍵字舟肉,功能與OR相當(dāng)。
7.3 NOT操作符
WHERE子句中的NOT操作符有且只有一個功能牌借,那就是否定它之后所跟的任何條件度气。
NOT WHERE子句中用來否定后跟條件的關(guān)鍵字。
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 章 用通配符進(jìn)行過濾
介紹什么是通配符现柠、如何使用通配符以及怎樣使用LIKE操作符進(jìn)行通配搜索院领,以便對數(shù)據(jù)進(jìn)行復(fù)雜過濾。
8.1 LIKE操作符
通配符(wildcard) 用來匹配值的一部分的特殊字符够吩。
搜索模式(search pattern) 由字面值比然、通配符或兩者組合構(gòu)成的搜索條件。
為在搜索子句中使用通配符周循,必須使用LIKE操作符强法。 LIKE指示MySQL,后跟的搜索模式利用通配符匹配而不是直接相等匹配進(jìn)行比較湾笛。
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的通配符很有用杆勇。但這種功能是有代價的:通配符搜索的處理一般要比前面討論的其他搜索所花時間更長贪壳。
- 不要過度使用通配符。如果其他操作符能達(dá)到相同的目的蚜退,應(yīng)該使用其他操作符闰靴。
- 在確實需要使用通配符時,除非絕對有必要关霸,否則不要把它們用在搜索模式的開始處传黄。把通配符置于搜索模式的開始處杰扫,搜索起來是最慢的队寇。
- 仔細(xì)注意通配符的位置。如果放錯地方章姓,可能不會返回想要的數(shù)據(jù)佳遣。
GitHub鏈接:
https://github.com/lichangke/LeetCode
知乎個人首頁:
https://www.zhihu.com/people/lichangke/
簡書個人首頁:
http://www.reibang.com/u/3e95c7555dc7
個人Blog:
https://lichangke.github.io/
歡迎大家來一起交流學(xué)習(xí)