一、mysql當數(shù)據(jù)同時屬于多個分類時,該怎么查詢
1、使用 AND 連接符
可以將多個分類條件使用 AND 連接符連接起來,下面是代碼示例:
SELECT * FROM table_name WHERE category_id = 1 AND category_id = 2 AND category_id = 3;
但是,上述 SQL 語句可能無法正常工作,因為一條記錄的 category_id 列值無法同時為 1、2 和 3。
2、使用 OR 連接符
可以將多個分類條件使用 OR 連接符連接起來,下面是代碼示例:
SELECT * FROM table_name WHERE category_id = 1 OR category_id = 2 OR category_id = 3;
但是,這種方法會返回所有具有 category_id 為 1、2 或者 3 的記錄,而非同時具有這些分類的記錄。
3、使用 IN 操作符
可以使用 IN 操作符來指定多個分類值,下面是代碼示例:
SELECT * FROM table_name WHERE category_id IN (1, 2, 3);
這將返回同時具有分類 ID 為 1、2 和 3 的記錄。
4、使用 HAVING 和 COUNT
可以使用 HAVING 和 COUNT 函數(shù)來確保每個記錄同時具有多個分類,下面是代碼示例:
SELECT item_id FROM table_name WHERE category_id IN (1, 2, 3) GROUP BY item_id HAVING COUNT(DISTINCT category_id) = 3;
這會查找每個分類 ID 為 1、2 和 3 的分類,然后對 item_id 進行分組。HAVING 和 COUNT 函數(shù)將確保每個 item_id 同時具有三個分類 ID,然后返回匹配的 item_id。
二、mysql介紹
1、簡介
MySQL是一個關(guān)系型數(shù)據(jù)庫管理系統(tǒng),由瑞典MySQL AB公司開發(fā),屬于?Oracle?旗下產(chǎn)品。MySQL是最流行的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)之一,在?WEB?應用方面,MySQL是較好的?RDBMS(Relational Database Management System,關(guān)系數(shù)據(jù)庫管理系統(tǒng))應用軟件之一。
MySQL是一種關(guān)系型數(shù)據(jù)庫管理系統(tǒng),關(guān)系數(shù)據(jù)庫將數(shù)據(jù)保存在不同的表中,而不是將所有數(shù)據(jù)放在一個大倉庫內(nèi),這樣就增加了速度并提高了靈活性。
MySQL所使用的 SQL 語言是用于訪問數(shù)據(jù)庫的最常用標準化語言。MySQL 軟件采用了雙授權(quán)政策,分為社區(qū)版和商業(yè)版,由于其體積小、速度快、總體擁有成本低,尤其是開放源碼這一特點,一般中小型和大型網(wǎng)站的開發(fā)都選擇MySQL作為網(wǎng)站數(shù)據(jù)庫。
2、應用環(huán)境
與其他的大型數(shù)據(jù)庫例如?Oracle、DB2、SQL Server等相比,MySQL自有它的不足之處,但是這絲毫也沒有減少它受歡迎的程度。對于一般的個人使用者和中小型企業(yè)來說,MySQL提供的功能已經(jīng)綽綽有余,而且由于 MySQL是開放源碼軟件,因此可以大大降低總體擁有成本。
Linux作為操作系統(tǒng),Apache?或Nginx作為?Web?服務器,MySQL 作為數(shù)據(jù)庫,PHP/Perl/Python作為服務器端腳本解釋器。由于這四個軟件都是免費或開放源碼軟件(FLOSS),因此使用這種方式不用花一分錢(除開人工成本)就可以建立起一個穩(wěn)定、免費的網(wǎng)站系統(tǒng),被業(yè)界稱為“LAMP”或“LNMP”組合。
3、索引類別
普通索引:普通索引(由關(guān)鍵字 KEY 或 INDEX 定義的索引)的任務是加快對數(shù)據(jù)的訪問速度。因此,應該只為那些最經(jīng)常出現(xiàn)查詢條件(WHERE column =)或排序條件(ORDER BY column)中的數(shù)據(jù)列創(chuàng)建索引。只要有可能,就應該選擇一個數(shù)據(jù)最整齊、最緊湊的數(shù)據(jù)列(如一個整數(shù)類型的數(shù)據(jù)列)來創(chuàng)建索引。索引:普通索引允許被索引的數(shù)據(jù)列包含重復的值。比如說,因為人有可能同名,所以同一個姓名在同一個“員工個人資料”數(shù)據(jù)表里可能出現(xiàn)兩次或更多次。如果能確定某個數(shù)據(jù)列將只包含彼此各不相同的值,在為這個數(shù)據(jù)列創(chuàng)建索引的時候就應該用關(guān)鍵字UNIQUE 把它定義為一個索引。這么做的好處:一是簡化了 MySQL 對這個索引的管理工作,這個索引也因此而變得更有效率;二是 MySQL 會在有新記錄插入數(shù)據(jù)表時,自動檢查新記錄的這個字段的值是否已經(jīng)在某個記錄的這個字段里出現(xiàn)過了;如果是,MySQL 將拒絕插入那條新記錄。也就是說,索引可以保證數(shù)據(jù)記錄的獨特性。事實上,在許多場合,人們創(chuàng)建索引的目的往往不是為了提高訪問速度,而只是為了避免數(shù)據(jù)出現(xiàn)重復。主索引:在前面已經(jīng)反復多次強調(diào)過:必須為主鍵字段創(chuàng)建一個索引,這個索引就是所謂的“主索引”。主索引區(qū)別是:前者在定義時使用的關(guān)鍵字是 PRIMARY 而不是 UNIQUE。外鍵索引:如果為某個外鍵字段定義了一個外鍵約束條件,MySQL 就會定義一個內(nèi)部索引來幫助自己以最有效率的方式去管理和使用外鍵約束條件。復合索引:索引可以覆蓋多個數(shù)據(jù)列,如像 INDEX(columnA,columnB)索引。這種索引的特點是 MySQL 可以有選擇地使用一個這樣的索引。如果查詢操作只需要用到 columnA 數(shù)據(jù)列上的一個索引,就可以使用復合索引 INDEX(columnA,columnB)。不過,這種用法僅適用于在復合索引中排列在前的數(shù)據(jù)列組合。比如說,INDEX(A,B,C)可以當做 A 或 (A,B)的索引來使用,但不能當做 B、C 或(B,C)的索引來使用。4、查詢與索引
只有當數(shù)據(jù)庫里已經(jīng)有了足夠多的測試數(shù)據(jù)時,它的性能測試結(jié)果才有實際參考價值。如果在測試數(shù)據(jù)庫里只有幾百條數(shù)據(jù)記錄,它們往往在執(zhí)行完名列前茅條查詢命令之后就被全部加載到內(nèi)存里,這將使后續(xù)的查詢命令都執(zhí)行得非常快–不管有沒有使用索引。只有當數(shù)據(jù)庫里的記錄超過了 1000 條、數(shù)據(jù)總量也超過了 MySQL 服務器上的內(nèi)存總量時,數(shù)據(jù)庫的性能測試結(jié)果才有意義。
在不確定應該在哪些數(shù)據(jù)列上創(chuàng)建索引的時候,人們從 EXPLAIN SELECT 命令那里往往可以獲得一些幫助。這其實只是簡單地給一條普通的 SELECT 命令加一個 EXPLAIN 關(guān)鍵字作為前綴而已。有了這個關(guān)鍵字,MySQL 將不是去執(zhí)行那條 SELECT 命令,而是去對它進行分析。MySQL 將以表格的形式把查詢的執(zhí)行過程和用到的索引等信息列出來。
在 EXPLAIN 命令的輸出結(jié)果里,第1列是從數(shù)據(jù)庫讀取的數(shù)據(jù)表的名字,它們按被讀取的先后順序排列。type列指定了本數(shù)據(jù)表與其它數(shù)據(jù)表之間的關(guān)聯(lián)關(guān)系(JOIN)。在各種類型的關(guān)聯(lián)關(guān)系當中,效率較高的是 system,然后依次是 const、eq_ref、ref、range、index 和 All(All 的意思是:對應于上一級數(shù)據(jù)表里的每一條記錄,這個數(shù)據(jù)表里的所有記錄都必須被讀取一遍——這種情況往往可以用一索引來避免)。
possible_keys 數(shù)據(jù)列給出了 MySQL 在搜索數(shù)據(jù)記錄時可選用的各個索引。key 數(shù)據(jù)列是 MySQL 實際選用的索引,這個索引按字節(jié)計算的長度在 key_len 數(shù)據(jù)列里給出。比如說,對于一個 INTEGER 數(shù)據(jù)列的索引,這個字節(jié)長度將是4。如果用到了復合索引,在 key_len 數(shù)據(jù)列里還可以看到 MySQL 具體使用了它的哪些部分。作為一般規(guī)律,key_len 數(shù)據(jù)列里的值越小越好。
ref 數(shù)據(jù)列給出了關(guān)聯(lián)關(guān)系中另一個數(shù)據(jù)表里的數(shù)據(jù)列的名字。row 數(shù)據(jù)列是 MySQL 在執(zhí)行這個查詢時預計會從這個數(shù)據(jù)表里讀出的數(shù)據(jù)行的個數(shù)。row 數(shù)據(jù)列里的所有數(shù)字的乘積可以大致了解這個查詢需要處理多少組合。
最后,extra 數(shù)據(jù)列提供了與 JOIN 操作有關(guān)的更多信息,比如說,如果 MySQL 在執(zhí)行這個查詢時必須創(chuàng)建一個臨時數(shù)據(jù)表,就會在 extra 列看到 usingtemporary 字樣。
延伸閱讀1:mysql的管理工具
可以使用命令行工具管理 MySQL 數(shù)據(jù)庫(命令 mysql 和 mysqladmin),也可以從 MySQL 的網(wǎng)站下載圖形管理工具 MySQL Administrator,MySQL Query Browser 和 MySQL Workbench。phpMyAdmin是由 php 寫成的 MySQL資料庫系統(tǒng)管理程程序,讓管理者可用 Web 界面管理 MySQL 資料庫。phpMyBackupPro也是由 PHP 寫成的,可以透過 Web 界面創(chuàng)建和管理數(shù)據(jù)庫。它可以創(chuàng)建偽 cronjobs,可以用來自動在某個時間或周期備份 MySQL 數(shù)據(jù)庫。另外,還有其他的 GUI 管理工具,例如 mysql-front 以及 ems mysql manager,navicat等等。