MySQL 必知必會(huì)學(xué)習(xí)入門

數(shù)據(jù)庫入門

數(shù)據(jù)庫: 保存有組織的數(shù)據(jù)的容器(通常是一個(gè)文件或一組文件).數(shù)據(jù)庫軟件應(yīng)該稱為 DBMS(DataBase Manage System) 數(shù)據(jù)庫管理系統(tǒng)唧席,數(shù)據(jù)庫是指通過 DBMS 創(chuàng)建和操縱的容器,數(shù)據(jù)庫可以是保存在硬盤上的文件吞鸭,但也可以不是。你不能直接訪問數(shù)據(jù)庫逗载,而是使用 DBMS 來訪問塘安,他替你訪問數(shù)據(jù)庫。

表: 某種特定類型數(shù)據(jù)的結(jié)構(gòu)化清單。存儲在表中的數(shù)據(jù)是一種類型的數(shù)據(jù)或一個(gè)清單憎茂,數(shù)據(jù)庫中的每個(gè)表都有一個(gè)名字珍语,用來標(biāo)識自己,此名字是唯一的,這表示數(shù)據(jù)庫中沒有其他表具有相同的名字竖幔。

表具有一些特性板乙,這些特定定義了數(shù)據(jù)在表中如何存儲,如存儲什么樣的數(shù)據(jù)拳氢,數(shù)據(jù)如何分解募逞,個(gè)部分信息如何命名等等,描述這組信息就是所謂的模式
模式: 關(guān)于數(shù)據(jù)庫和表的布局及特性的信息.

列:表中的一個(gè)字段馋评,所有的表都是由一個(gè)或多個(gè)列組成的放接。
數(shù)據(jù)類型: 所容許的數(shù)據(jù)的類型,每個(gè)表都有相對應(yīng)的數(shù)據(jù)類型栗恩,他限制(容許)該列中存儲的數(shù)據(jù)透乾。數(shù)據(jù)類型限制可存儲在列中的數(shù)據(jù)種類,數(shù)據(jù)類型還幫助正確的排序數(shù)據(jù)磕秤,并在優(yōu)化磁盤使用方面起重要的作用乳乌,因此,在創(chuàng)建表時(shí)必須對數(shù)據(jù)類型給予特別的關(guān)注

行:表中的一個(gè)記錄市咆,
主鍵:一列(或一組列)汉操,其值能夠唯一區(qū)分表中的每個(gè)行。唯一標(biāo)識表中每行的這個(gè)列稱為主鍵蒙兰,主鍵用來表示一個(gè)特定的行磷瘤,沒有主鍵,更新或刪除表中特定行很困難搜变,因?yàn)闆]有安全的方法保證只涉及相關(guān)的行采缚。表中的任何列都可以作為主鍵,只要它滿足以下條件:

  • 任何兩行都不具有相同的主鍵值
  • 每個(gè)行都必須具有一個(gè)主鍵值(主鍵值不允許 NULL 值)挠他。

SQL: 結(jié)構(gòu)化查詢語言(Structured Query Language),是一種專門用來與數(shù)據(jù)庫通信的語言扳抽。

基礎(chǔ)操作

了解數(shù)據(jù)庫和表(SHOW)

  1. SHOW DATABASES: 返回一個(gè)數(shù)據(jù)庫列表,包含在這個(gè)列表中的可能是 MYSQL 內(nèi)部使用的數(shù)據(jù)庫.
  2. SHOW TABLES: 返回當(dāng)前選擇的數(shù)據(jù)庫內(nèi)可用表的列表
  3. SHOW COLUMS FROM customers: 要求給出一個(gè)表名殖侵,對每個(gè)字段返回一行贸呢。包含 該字段的信息。

創(chuàng)建和操縱表

創(chuàng)建表

MySQL 不僅用于表數(shù)據(jù)操作拢军,而且還可以用來執(zhí)行數(shù)據(jù)庫和表的所有操作楞陷,包括表本身的創(chuàng)建和處理。

創(chuàng)建表的方法:
- 使用具有交互式創(chuàng)建和管理表的工具
- 使用 MySQL 語句操縱

  1. 表創(chuàng)建基礎(chǔ)(CREATE TABLE)
    • 新的表明名再關(guān)鍵字 CREATE TABLE 之后給出
    • 表列的名字和定義茉唉,用逗號分隔
  2. 使用 NULL 值: Null 值就是沒有值或者缺值固蛾,允許 NULL 值的列也允許再插入行時(shí)不給出該列的值结执,不允許 NULL 值的列不接受該列沒有值的行,換句話說艾凯,在插入或更新行時(shí)該列必須有值昌犹。NULL 為默認(rèn)值,如果不指定 NOT NULL, 則認(rèn)為指定的是 NULL览芳, NULL 值就是沒有值斜姥,他不是空串,空串是一個(gè)有效的值沧竟。
  3. 主鍵: 主鍵的值必須唯一铸敏,即,表中的每個(gè)行必須具有唯一的主鍵值悟泵,如果主鍵使用單個(gè)列杈笔,則他的值必須唯一,如果使用多個(gè)列糕非,則這些列的組合值必須唯一蒙具。
  4. 使用 AUTO_INCREMENT: 告訴 MySQL ,本列每當(dāng)增加一行時(shí)自動(dòng)增量朽肥,每次執(zhí)行一個(gè) INSERT 操作時(shí)禁筏, MySQL 會(huì)對該列增量,每個(gè)表只允許一個(gè) AUTO_INCREMENT列衡招,而且他必須被索引

更改表(ALTER TABLE)

  1. 增加列: ALTER TABLE vendors ADD vend_phone CHAR(20)
  2. 刪除列: ALTER TABLE vendors DROP COLUMN vend_phone

刪除表 (DROP TABLE)

重命名表 (RENAME TABLE)

插入數(shù)據(jù)

使用 INSERT 語句將數(shù)據(jù)插入表中篱昔, INSERT是用來插入(或添加)行到數(shù)據(jù)庫表的,插入可以用集中方式使用

  1. 插入完整行始腾,使用 INSERT 州刽,要求指定表明和被插入到新行的值,最好是寫上列名,這樣可以保證列明是正確的浪箭。
  2. 插入多個(gè)行: INSERT 可以插入一行到一個(gè)表中穗椅,如果想一次性插入多行的話,就需要使用多個(gè) INSERT 或者使用單條 INSERT 語句有多組值奶栖,每組值用一對圓括號括起來

更新和刪除數(shù)據(jù)

更新數(shù)據(jù)

為了更新(修改)表中的數(shù)據(jù)匹表,可使用 UPDATE 語句,可采用兩種方式使用 UPDATE:
使用 UPDATE 的時(shí)候一定要注意驼抹,不要省略 WHERE 子句桑孩,使用 UPDATE 語句總是以要更新的表的名字開始.要以 WHERE 子句(用來告訴 MySQL 更新哪一行)結(jié)束拜鹤。在更新多個(gè)列時(shí)框冀,只需要使用單個(gè) SET 命令,每個(gè) 列=值對之間用逗號分隔(最后一列之后不用逗號);

  • 更新表中特定行
  • 更新表中所有行

刪除數(shù)據(jù)

為了從一個(gè)表中刪除(去掉)數(shù)據(jù)敏簿,使用 DELETE 語句明也,可依兩種方式使用 DELETE

  • 從表中刪除特定的行 DELETE FROM products WHERE cust_id = 1006

更新和刪除的指導(dǎo)原則

如果執(zhí)行 UPDATE 而不帶 WHERE 子句宣虾,則表中每行都將應(yīng)用新值更新,類似的温数,如果執(zhí)行 DELETE 語句而不帶 WHERE 子句绣硝,表的所有數(shù)據(jù)都將被刪除。

  • 除非缺失打算更新和刪除每一行撑刺,否則絕對不要使用不帶 WHERE子句的 UPDATEDELETE語句
  • 保證每個(gè)表都有主鍵鹉胖,盡可能像 WHERE子句那樣使用它
  • 在對 UPDATE 或 DELETE 語句使用 WHERE 子句前,最好先用 SELECT 進(jìn)行測試够傍,保證它過濾的是正確的記錄甫菠,以防止編寫的 WHERE 子句不正確
  • 使用強(qiáng)制實(shí)施引用完整性的數(shù)據(jù)庫,這樣 MySQL 將不允許刪除具有與其他表相關(guān)聯(lián)的數(shù)據(jù)的行冕屯。

檢索數(shù)據(jù)(SELECT)

從一個(gè)或多個(gè)表中檢索信息寂诱,為了使用 SELECT 檢索數(shù)據(jù),必須至少給出兩條數(shù)據(jù) -- 項(xiàng)選擇什么安聘,以及從什么地方選擇痰洒。

  1. 檢索單個(gè)列: SELECT prod_name FROM products

  2. 檢索多個(gè)列: SELECT prod_id,prof_name FROM product

  3. 檢索所有列: SELECT * FROM product

  4. 檢索不同的行: SELECT DISTINCT vend_id FROM products, DISTINCT 關(guān)鍵字必須直接方法在列名的前面

  5. 限制結(jié)果: LIMIT :

    • SELECT prod_name FROM products LIMIT 5
    • SELECT prod_name FROM products LIMIT 5,5
  6. 使用完全限定的表名: SELECT products.prod_name FROM crashcourse.products;

排序檢索數(shù)據(jù)

將會(huì)講授如何使用 SELECT 語句的 ORDER_BY 子句,根據(jù)需要排序檢索出的數(shù)據(jù).

子句(clause): SQL 語句由子句構(gòu)成浴韭,有些子句是必需的丘喻,而有的是可選的,一個(gè)子句通常由一個(gè)關(guān)鍵字和所提供的數(shù)據(jù)組組成念颈,子句的例子有 SELECT 語句的 FROM 子句仓犬。
  1. 單列排序: SELECT prod_name FROM products ORDER BY prod_id
  2. 多列排序: SELECT prod_name FROM products ORDER BY prod_price,prod_name, 排序完全按照所規(guī)定的順序進(jìn)行,也就是說僅在多行具有相同的 price 的時(shí)候才會(huì)根據(jù) name 進(jìn)行排序
  3. 指定排序方向: 數(shù)據(jù)排序不限于升序順序(A-Z),還可以使用 ORDER BY 子句以降序(Z-A)順序排序舍肠,為了進(jìn)行降序排序搀继,必須指定 DESC 關(guān)鍵字. SELECT prod_id, prod_price,prod_name FROM products ORDER BY prod_price DESC. DESC 關(guān)鍵字只能應(yīng)用到直接位于其前面的列名。如果想要對多個(gè)列上進(jìn)行降序排列翠语,必須對每個(gè)列指定DESC關(guān)鍵字叽躯。

過濾數(shù)據(jù)

使用 SELECT 語句的 WHERE子句指定搜索條件,只檢索所需的數(shù)據(jù)需要指定搜索條件,搜索條件也稱為過濾條件,在SELECT語句中,數(shù)據(jù)根據(jù) WHERE 子句中指定的搜索條件進(jìn)行過濾肌括。WHERE 子句在表名 (FROM子句) 之后給出点骑。

  1. SELECT prod_name,prod_price FROM products WHERE prod_price=2.5;
    如果同時(shí)使用 ODRDER BY 子句和 WHERE 子句時(shí),應(yīng)該讓 ORDER BY 位于 WHERE 之后谍夭。

  2. WHERE 子句操作符

    • = 等于
    • <> 不等于
    • != 不等于
    • < 小于
    • <= 小于等于
    • > 大于
    • >= 大于等于
    • BETWEEN 在指定的兩個(gè)值之間
  3. 不匹檢查. SELECT prod_name, prod_price FROM product WHERE prod_location <> 'japan', 注意黑滴,單引號用來限定字符串,如果將值與串類型的列來進(jìn)行比較紧索,則需要限定引號袁辈,用來與數(shù)值列進(jìn)行比較的值不用引號。

  4. 范圍值檢查: SELECT prod_name,prod_price FROM products WHERE prod_price BETWEEN 5 AND 10 ,BETWEEN 是閉合查詢珠漂,也就是意味著包含了起始和結(jié)束

  5. 空值檢查: 在創(chuàng)建表晚缩,表設(shè)計(jì)人員可以指定其中的列是否可以不包含值尾膊,在一個(gè)列不包含值時(shí),稱其為包含空值 NULL, SELECT 語句有一個(gè)特殊的 WHERE 子句荞彼,可用來檢查具有 NULL值的列冈敛,這個(gè) WHERE 子句就是 IS NULL 子句

數(shù)據(jù)過濾

組織 WHERE 子句建立功能更強(qiáng)的更高級的搜索條件,MYSQL 允許多個(gè) WHERE 子句鸣皂,這些子句可以以兩種方式使用: 以 AND 子句的方式或者以 OR 子句的方式使用抓谴。操作符用來鏈接或者改變 WHERE 子句中的子句的關(guān)鍵字,也稱為邏輯操作符

  1. AND操作符: SELECT prod_id,prod_price FROM products WHERE vend_id = 1003 AND prod_price <= 10;

  2. OR操作符: OR 操作符與 AND 操作符不同寞缝,它指示 MySQL 檢索匹配任意條件SELECT prod_id FROM products WHERE vend_id=1002 OR prod_price=1003

  3. 計(jì)算次序: SELECT prod_name FROM products WHERE (prod_id=1002 OR prod_id=1003) AND prod_price>10, AND 的計(jì)算次序要優(yōu)先于 OR 齐邦,所以需要將 OR

  4. IN操作符: IN 操作符用來指定條件范圍,范圍內(nèi)的每個(gè)條件都可以進(jìn)行匹配第租, IN 取合法值的由逗號分隔的清單措拇,全都括在圓括號中。SELECT prod_name FROM products WHERE vend_id IN (1002,1003) ORDER BY prod_name 其實(shí) INOR 的功能相同慎宾。那么為什么要使用 IN 操作符呢?

    • 在使用長的合法選項(xiàng)清單時(shí)丐吓,IN 操作符的語法更清楚且更直觀
    • 在使用 IN 時(shí),計(jì)算的次序更容易管理
    • IN 操作符一般比 OR 操作符清單執(zhí)行更快
    • IN 的最大優(yōu)點(diǎn)是可以包含其他 SELECT 語句趟据,使得能夠更動(dòng)態(tài)地建立 WHERE 子句
  5. NOT操作符:NOT 操作符用來否定它之后所跟的任何條件 SELECT prod_name FROM products WHERE vend_id NOT IN(1002,1003)

用通配符進(jìn)行過濾

使用 LIKE 操作符來進(jìn)行通配搜索券犁,以便對數(shù)據(jù)進(jìn)行復(fù)雜過濾

  1. LIKE 操作符:利用通配符可創(chuàng)建比較特定數(shù)據(jù)的搜索模式,來匹配值的一部分的特殊字符汹碱,搜索模式: 由字面值粘衬,通配符或兩者組合構(gòu)成的搜索條件。為在搜索子句中使用通配符咳促,必須使用 LIKE 操作符稚新,LIKE 指示 MySQL,后跟的搜索模式利用通配符匹配而不是直接相等匹配進(jìn)行比較跪腹。

    • 百分號(%)通配符:表示任何字符出現(xiàn)的任意次數(shù) SELECT prod_id,prod_name FROM products WHERE prod_name LIKE ‘jet%’
    • 下劃線_通配符:另一個(gè)有用的通配符是下劃線 _褂删,下劃線只匹配單個(gè)字符串而不是多個(gè)字符串。SELECT prod_id FROM products WHERE prod_name LIKE '_ton anvil';
    • 使用通配符的技巧:
      • 不要過渡使用通配符
      • 在確實(shí)需要的時(shí)候再使用通配符

用正則表達(dá)式來進(jìn)行搜索

帶學(xué)

創(chuàng)建計(jì)算字段

filed 可以與列的意思相同冲茸,經(jīng)惩头В互換使用,不過數(shù)據(jù)庫的列稱為一般列轴术,而術(shù)語通常用在計(jì)算字段的連接上.

  1. 拼接字段: concatenate:將值連接到一起構(gòu)成單個(gè)值难衰,解決辦法是把兩個(gè)列拼接起來,在 MySQL 的 SELECT 語句中逗栽,可使用 Concat() 函數(shù)來拼接兩個(gè)列盖袭。Concat() 拼接串,即把多個(gè)串連接起來形成一個(gè)較長的串,需要一個(gè)或多個(gè)指定的串苍凛,各個(gè)串之間用逗號分隔。
  2. 使用別名 SELECT Concat(...) AS newName FROM products
  3. 執(zhí)行算數(shù)計(jì)算: 計(jì)算字段的另一個(gè)常見用途是對檢索出的數(shù)據(jù)進(jìn)行算術(shù)計(jì)算兵志,

使用數(shù)據(jù)處理函數(shù)

MySQL 支持利用函數(shù)來處理數(shù)據(jù)醇蝴,函數(shù)一般是在數(shù)據(jù)上執(zhí)行的,它給數(shù)據(jù)的轉(zhuǎn)換和處理提供了方便想罕。函數(shù)沒有 SQL 的可移植性強(qiáng)悠栓,多數(shù)的 SQL 語句是可移植的,在 SQL 實(shí)現(xiàn)之間有差異時(shí)按价,這些差異通常不那么難處理惭适,而函數(shù)的可移植性卻不強(qiáng),

使用函數(shù)

大多數(shù) SQL 實(shí)現(xiàn)支持以下類型的函數(shù):

  • 用于處理文本串(刪除或填充值楼镐,轉(zhuǎn)換值為大寫或小寫的文本函數(shù))
  • 用于在數(shù)值數(shù)據(jù)上進(jìn)行算術(shù)操作(如絕對值癞志,進(jìn)行代數(shù)運(yùn)算)的數(shù)值函數(shù)
  • 用于處理日期和時(shí)間值,并且從這些址中提取特定成分
  • 返回 DBMS 正使用的特殊信心(如返回用戶登陸信息框产,檢查版本細(xì)節(jié))的系統(tǒng)函數(shù)

文本處理函數(shù)

  • RTrim()函數(shù)來去除列值右邊的空格凄杯。
  • Upper()函數(shù),將文本轉(zhuǎn)換為大寫秉宿。
  • Left() 函數(shù)戒突,返回串左邊的字符。

時(shí)期和時(shí)間處理函數(shù)

時(shí)間和日期采用相應(yīng)的數(shù)據(jù)類型和特殊的格式存儲描睦,以便能快速和有效排序或過濾膊存,并且節(jié)省物理存儲空間,一般忱叭,應(yīng)用程序不使用用來存儲日期和時(shí)間的格式隔崎,因此日期和時(shí)間函數(shù)被用來統(tǒng)計(jì),讀取和處理這些值韵丑。

  • AddDate() 增加一個(gè)日期(天仍稀,周等)。
  • AddTime() 增加一個(gè)時(shí)間(時(shí)埂息,分等)技潘。等,,,,。

數(shù)值處理函數(shù)

數(shù)值處理函數(shù)僅處理數(shù)值數(shù)據(jù)千康,這些函數(shù)一般主要用于代數(shù)享幽,三角或幾何運(yùn)算.

  • Abs(). 返回一個(gè)數(shù)的絕對值
  • Cos()返回一個(gè)角度的余弦
  • ...

匯總數(shù)據(jù)

MySQL 查詢可用于檢索數(shù)據(jù),以便分析和報(bào)表生成拾弃,這種類型的檢索例子有以下幾種:

  • 確定表中行數(shù)(或者滿足某個(gè)條件或包含某個(gè)特定值的行數(shù))
  • 獲得表中行組的和
  • 找出表列(或所有行或某些特定的行)的最大值值桩,最小值和平均值
    這些例子都需要對表中數(shù)據(jù)匯總。為了檢索上述的類型豪椿, MySQL 給出了5個(gè)聚集函數(shù)奔坟。聚集函數(shù)運(yùn)行在行組上携栋,計(jì)算和返回單個(gè)值的函數(shù)。

AVG() 函數(shù)

AVG() 通過對表中行數(shù)計(jì)數(shù)并計(jì)算特定列值之和咳秉,求得該列的平均值婉支,AVG()可用來返回所有列的平均值,也可以用來返回特定列或行的平均值澜建。SELECT AVG(price) AS price_avg FROM products;

COUNT() 函數(shù)

COUNT() 函數(shù)進(jìn)行計(jì)數(shù)向挖,可利用 COUNT() 確定表中行的數(shù)目或符合特定條件的行的數(shù)目。COUNT()函數(shù)有兩種使用方式

  1. 使用 COUNT(*) 對表中行的數(shù)目進(jìn)行計(jì)數(shù)炕舵,不管表列中包含的是空值(NULL)還是非空值何之。
  2. 使用 COUNT(column) 對特定列中具有值的行進(jìn)行計(jì)數(shù),忽略 NULL 值咽筋。

MAX() 函數(shù)

MAX() 返回指定列中的最大值溶推,MAX()要求指定列名,

MIN() 函數(shù)

MIN() 的功能正好與 MAX() 功能相反奸攻,他返回指定列的最小值悼潭,與 MAX() 一樣,必須指定列名

SUM() 函數(shù)

SUM() 函數(shù)用來返回指定列值的和(總計(jì))舞箍,SUM()也可以用來合計(jì)計(jì)算值

分組數(shù)據(jù)

使用分組來匯總表內(nèi)容的子集舰褪,使用 SELECT的子句 GROUP BYHAVING 子句。

創(chuàng)建分組

分組是在 SELECT 語句的 GROUP BY 子句中建立的疏橄。

SELECT country, COUNT(*) AS num_prod FROM products GROUP BY country;

使用了 GROUP BY子句時(shí)占拍,需要知道一些重要的規(guī)定。

  • GROUP BY 子句可以包含任意數(shù)目的列捎迫,這使得能對分組進(jìn)行嵌套晃酒,為數(shù)據(jù)分組提供更細(xì)致的控制。

過濾分組

除了能使用 GROUP BY 分組數(shù)據(jù)外窄绒,MySQL 還允許過濾數(shù)組贝次,規(guī)定包含哪些分組,排除哪些分組彰导。使用 HAVING 過濾分組

SELECT price, COUNT(*) AS price_larger FROM products GROUP BY price HAVING price LIKE '6_000';

SELECT子句順序:

  • SELECT 要返回的列或表達(dá)式
  • FROM 從中檢索數(shù)據(jù)的表
  • WHERE 行級過濾
  • GROUP BY 分組說明
  • HAVING 組級過濾
  • ORDER BY 輸出排序順序
  • LIMIT 限制檢索的行數(shù)

使用子查詢

SQL 允許創(chuàng)建子查詢蛔翅,即嵌套在其他查詢中的查詢

SELECT 語句中,子查詢總是從內(nèi)向外處理位谋,在處理上面的 SELECT 語句時(shí)山析, MySQL 實(shí)際上執(zhí)行了兩個(gè)操作

SELECT order_num FROM orderitems WHERE prod_id = 1;
SELECT cust_id FROM orders WHERE order_num = 1;
SELECT * FROM customers WHERE cust_id = 1;

SELECT * FROM customers WHERE cust_id IN (
  SELECT cust_id
  FROM orders
  WHERE order_num IN (
    SELECT order_num
    FROM orderitems
    WHERE prod_id = 1
  )
);

雖然子查詢一般與 IN 操作符結(jié)合使用,但也可以用于測試等于(=),不等于(<>) 等掏父。

作為計(jì)算字段使用子查詢

使用子查詢的另一方法是創(chuàng)建字段笋轨。

SELECT cust_name, cust_state,(SELECT COUNT(*) FROM orders WHERE cust_id = customers.cust_id) AS orders FROM customers;

聯(lián)結(jié)表

SQL 最強(qiáng)大功能之一就是能在數(shù)據(jù)檢索查詢的執(zhí)行中聯(lián)結(jié)(join)表,聯(lián)結(jié)是利用 SQL 的 SELECT 能執(zhí)行的最重要的操作,很好地理解聯(lián)結(jié)及其語法是學(xué)習(xí) SQL 的一個(gè)極為重要的組成部分爵政。

關(guān)系表

關(guān)系表的設(shè)計(jì)就是要保證把信息分解成多個(gè)表仅讽,一類數(shù)據(jù)一個(gè)表,各表通過某些常用的值(即關(guān)系設(shè)計(jì)中的關(guān)系)互相關(guān)聯(lián)钾挟。

外鍵:外鍵為某個(gè)表中的一列洁灵,他包含另一個(gè)表的主鍵值,從而定義了兩個(gè)表之間的關(guān)系等龙。
可伸縮性:能夠適應(yīng)不斷增加的工作量而不失敗处渣,

為什么要使用聯(lián)結(jié)

分解數(shù)據(jù)為多個(gè)表中伶贰,更方便地處理蛛砰,并且具有更大的可伸縮性。

使用聯(lián)結(jié)黍衙,可以用單條 SELECT 語句檢索出數(shù)據(jù)泥畅,聯(lián)結(jié)是一種機(jī)制,用來在一條 SELECT 語句中關(guān)聯(lián)表琅翻,因此稱之為聯(lián)結(jié)位仁,

SELECT vend_name,prod_name,prod_id,prod_price FROM vendors,products WHERE vendors.vend_id = products.vend_id;

WHERE 子句的重要性

請記住:在一條 SELECT 語句中聯(lián)結(jié)幾個(gè)表時(shí),相應(yīng)的關(guān)系是在運(yùn)行中構(gòu)造的方椎,在數(shù)據(jù)表的定義中不存在能指示 MySQL 如何對表進(jìn)行聯(lián)結(jié)的東西聂抢,你必須自己做這件事情,

笛卡爾積 由沒有聯(lián)結(jié)條件的表關(guān)系返回的結(jié)果為笛卡爾積棠众,檢索出的行的數(shù)目將是第一個(gè)表中的行數(shù)乘以第二個(gè)表中的行數(shù)琳疏。

內(nèi)部聯(lián)結(jié)

目前為止所用的聯(lián)結(jié)稱為等值聯(lián)結(jié),他基于兩個(gè)表之間的相等測試,這種聯(lián)結(jié)也稱為內(nèi)部聯(lián)結(jié)闸拿,其實(shí)空盼,對于這種聯(lián)結(jié)可以使用稍微不同的語法來明確指定聯(lián)結(jié)的類型,

聯(lián)結(jié)多個(gè)表

SQL 對一條 SELECT 語句中可以聯(lián)結(jié)的表的數(shù)目沒有限制新荤,創(chuàng)建聯(lián)結(jié)的基本規(guī)則也相同揽趾,首先列出所有表,然后定義表之間的關(guān)系苛骨。

創(chuàng)建高級聯(lián)結(jié)

組合查詢

多數(shù) SQL 查詢都只包含一個(gè)或多個(gè)表中返回?cái)?shù)據(jù)的單條 SELECT 語句篱瞎,MySQL 也允許執(zhí)行多個(gè)查詢(多條查詢),并將結(jié)果作為單個(gè)查詢結(jié)果集返回痒芝,這些組合查詢通暢稱為并 (union) 或復(fù)合查詢(compound query).
有兩種基本情況奔缠,其中需要使用組合查詢:

  • 再單個(gè)查詢中從不同的表返回類似結(jié)構(gòu)的數(shù)據(jù)
  • 對單個(gè)表執(zhí)行多個(gè)查詢,按單個(gè)查詢返回?cái)?shù)據(jù)

創(chuàng)建組合查詢

可用 UNION 操作符來組合數(shù)條 SQL 查詢吼野,利用 UNION, 可給出多條 SELECT 語句校哎,將它們的結(jié)果組合成單個(gè)結(jié)果集。

使用 UNION : 用法,給出每條 SELECT 語句闷哆,在各條 語句之間放上關(guān)鍵字 UNION腰奋。
UNION 規(guī)則: UNION 必須由兩條或兩條以上的 SELECT語句組成,語句之間用關(guān)鍵字 UNION 分隔抱怔,UNION 中的每個(gè)查詢必須包含相同的列劣坊,表達(dá)式或聚集函數(shù)。
包含或取消重復(fù)的行: UNION 查詢時(shí)回自動(dòng)去除重復(fù)的行屈留,如果想要返回所有的匹配行局冰,可使用 UNION ALL 而不是 UNION.
對組合查詢結(jié)果排序: SELECT 語句的輸出用 ORDER BY子句排序,在用 UNION組合查詢時(shí)灌危,只能使用一條 ORDER BY 子句康二,他必須出現(xiàn)在最后一條 SELECT 語句之后,對于結(jié)果集勇蝙,不存在用一種方式排序一部分沫勿,用另一種反式排序另一部分。

全文本搜索

為了進(jìn)行全文本搜索味混,必須索引被搜索的列产雹,而且隨著數(shù)據(jù)的改變不斷的被重新索引,在對表列進(jìn)行適當(dāng)設(shè)計(jì)后翁锡,MySQL 會(huì)自動(dòng)進(jìn)行所有的索引和重新索引蔓挖。在索引之后,SELECT 與 Match() 和 Against() 一起使用以時(shí)機(jī)執(zhí)行搜索馆衔。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末瘟判,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子哈踱,更是在濱河造成了極大的恐慌荒适,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件开镣,死亡現(xiàn)場離奇詭異刀诬,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)邪财,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進(jìn)店門陕壹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人树埠,你說我怎么就攤上這事糠馆。” “怎么了怎憋?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵又碌,是天一觀的道長九昧。 經(jīng)常有香客問我,道長毕匀,這世上最難降的妖魔是什么铸鹰? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮皂岔,結(jié)果婚禮上蹋笼,老公的妹妹穿的比我還像新娘。我一直安慰自己躁垛,他們只是感情好剖毯,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著教馆,像睡著了一般逊谋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上活玲,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天涣狗,我揣著相機(jī)與錄音谍婉,去河邊找鬼舒憾。 笑死,一個(gè)胖子當(dāng)著我的面吹牛穗熬,可吹牛的內(nèi)容都是我干的镀迂。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼唤蔗,長吁一口氣:“原來是場噩夢啊……” “哼探遵!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起妓柜,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤箱季,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后棍掐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體藏雏,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年作煌,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了掘殴。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,064評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡粟誓,死狀恐怖奏寨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情鹰服,我是刑警寧澤病瞳,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布揽咕,位于F島的核電站,受9級特大地震影響套菜,放射性物質(zhì)發(fā)生泄漏心褐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一笼踩、第九天 我趴在偏房一處隱蔽的房頂上張望逗爹。 院中可真熱鬧,春花似錦嚎于、人聲如沸掘而。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽袍睡。三九已至,卻和暖如春肋僧,著一層夾襖步出監(jiān)牢的瞬間斑胜,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工嫌吠, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留止潘,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓辫诅,卻偏偏與公主長得像凭戴,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子炕矮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內(nèi)容