小白快速學MySQL

使用MySQL

/*返回可用數據庫的列表*/
SHOW DATABASES;
/*使用sell這個數據庫*/
USE sell;
/*返回當前數據庫中可用的列表*/
SHOW TABLES;
/*返回order_detail表中字段的信息*/
SHOW COLUMNS FROM order_detail;
/*作用同上*/
DESC order_detail;
/*返回order_detail這個表創建的sql語句*/
SHOW CREATE TABLE order_detail;

創建和操縱表

/*AUTO_INCREMENT關鍵字表示自增,每個表只允許有一個字段被該關鍵詞修飾,且必須被索引.SELECT last_insert_id()該語句返回最後一個AUTO_INCREMENT值.
DEFAULT關鍵字給字段賦默認值
PRIMARY KEY()主鍵可以採用單個字段,也可以採用多個字段組合,但是必須保證唯一
ENGINE引擎類型(根據需求選用):
InnoDB(可靠的事務處理,但是不支持全文搜索)
MyISAM(支持全文搜索,但是不支持事務處理)
MEMORY(功能等同於MyISAM,但是數據存儲在內存中,速度很快,適用於臨時表)
*/
CREATE TABLE product_category (
  category_id INT NOT NULL AUTO_INCREMENT,
  category_name VARCHAR(128) NOT NULL,
  category_type INT NOT NULL,
  create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY(category_id)
)ENGINE=InnoDB;
/*更新表,增加一列*/
ALTER TABLE product_category ADD COLUMN category_icon VARCHAR(248) NOT NULL;
/*修改字段信息*/
ALTER TABLE product_category CHANGE COLUMN category_icon category_stock VARCHAR(255);
/*刪除一列*/
ALTER TABLE product_category DROP COLUMN category_icon;
/*設置索引*/
ALTER TABLE product_category ADD INDEX (category_icon);
/*刪除索引*/
ALTER TABLE product_category DROP INDEX category_icon;
/*設置unique值*/
ALTER TABLE product_category ADD UNIQUE(category_icon);
/*刪除整個表格*/
DROP TABLE product_category;
/*重命名錶格*/
RENAME TABLE product_category TO category;

檢索數據

/*從order_detail表中檢索出detail_id字段的所有值*/
/*注意:(1)SQL語句不區分大小寫;(2)在處理SQL語句時,空格會被忽略*/
SELECT detail_id FROM order_detail;
/*檢索多個字段*/
SELECT detail_id,product_id,product_name FROM order_detail;
/*檢索所有列,但是最好只檢索自己需要的列,使用*檢索出不必要的列會降低檢索和應用程序的性能*/
SELECT * FROM order_detail;
/*只返回字段中不同的值,DISTINCT關鍵字必須放在字段前面,且應用於所有列,不能部分應用*/
SELECT DISTINCT product_price FROM order_detail;
/*限制檢索出來的結果最多隻顯示5行,[0,5)*/
SELECT detail_id FROM order_detail LIMIT 5;
/*只顯示[5,10),第一個數是開始位置,第二個是檢索行數*/
SELECT detail_id FROM order_detail LIMIT 5,5;
/*從行3開始取4行*/
SELECT detail_id FROM order_detail LIMIT 4 OFFSET 3;

排序檢索數據

/*根據product_price進行排序*/
SELECT product_price FROM order_detail ORDER BY product_price;
/*按照多個列排序,先對product_price排序,只有product_price相同時才比較product_name;*/
SELECT product_id,product_price,product_name FROM order_detail ORDER BY product_price,product_name;
/*降序排列*/
SELECT product_price FROM order_detail ORDER BY product_price DESC;
/*DESC只能作用到直接位於其前面的字段, 要在多個字段上進行降序排列,必須對每個字段後面都指定DESC關鍵字*/
SELECT product_price,product_name FROM order_detail ORDER BY product_price DESC,product_name;
/*注意:ORDER BY子句應保證在FROM子句和WHERE子句後面,LIMIT子句前面*/
SELECT product_price FROM order_detail ORDER BY product_price DESC LIMIT 1;

過濾數據

SELECT product_price FROM order_detail WHERE product_price=5.5;
/*
WHERE子句操作符號

操作符號(說明)
=(等於)
<>(不等於)
!=(不等於)
<(小於)
<=(小於等於)
>(大於)
>=(大於等於)
BETWEEN...AND...(在指定的兩個值之間,包括邊界值)
eg:BETWEEN 4 AND 10;[4,10]
IS NULL(檢查是否爲空)
 */
SELECT product_price FROM order_detail WHERE product_price BETWEEN 4 AND 10;
SELECT product_price FROM order_detail WHERE product_price IS NULL;

更強的數據過濾

/*AND連結兩個篩選條件,必須同時滿足*/
SELECT product_id,product_name,product_price FROM order_detail WHERE product_price<10 AND product_quantity>10;
/*OR關鍵字表示只需滿足條件之一*/
SELECT product_id,product_name,product_price FROM order_detail WHERE product_price=10 OR product_price=20;
/*注意:AND和OR操作符可以組合使用,AND優先級更高,爲了明確過濾原則,最好使用()明確計算順序*/
/*IN匹配在()中的所有值,功能與OR相當*/
SELECT product_price FROM order_detail WHERE product_id IN (3,4,10) ORDER BY product_price;
/*NOT否定跟在它之後的條件,MySQL支持使用NOT對IN,BETWEEN和EXISTS子句取反*/
SELECT product_price FROM order_detail WHERE product_id NOT IN (3,4,10) ORDER BY product_price;

使用通配符進行過濾

/*通配符%,表示任意字符出現任意次數,可以匹配空格,但是不能匹配NULL*/
SELECT product_id,product_name FROM order_detail WHERE product_name LIKE 'fru%';
SELECT product_id,product_name FROM order_detail WHERE product_name LIKE '%ate%';
/*通配符_,表示匹配單個字符,不能多也不能少*/
SELECT product_id,product_name FROM order_detail WHERE product_name LIKE 'frui_';
/*使用通配符的技巧
(1)不要過度使用
(2)不要把通配符放在搜索模式的最前面,這樣是最慢的
(3)仔細注意通配符的位置
 */

使用正則表達式進行過濾

SELECT product_id,product_name FROM order_detail WHERE product_name REGEXP '.ruit';
/*
.   匹配任意一個字符
|   搜索兩個串之一,或操作
[123] 匹配1,2,3中任意一個字符
[0-9] 匹配0-9中任意一個字符
[^0-9] 匹配除了0-9外任意一個字符
\\ 匹配特殊字符都必須用\\爲前導,如要匹配.  則表示爲\\.
*   0或多個匹配,如正則表達式爲'abc*','ab','abc','abcccc'都可以匹配
+   1或多個匹配,如正則表達式爲'abc+','ab'不可以匹配,'abc'和'abccccc'可以匹配
?   0或1個匹配,如正則表達式爲'abc?','ab','abc'可以匹配,'abccccc'不可以匹配
{n}   指定數目的匹配
{n,}    不少於指定數目的匹配
{n,m}   一定數目範圍內的匹配


定位元字符^----文本的開始(^在[]中的作用則爲否定該集合)
定位元字符$----文本的結束
*/

創建計算字段

/*CONCAT()拼接串,TRIM()去除串左右的空格,另外還有LTRIM()和RTRIM(),AS關鍵字賦予別名; */
SELECT CONCAT(product_id,'(',TRIM(product_name),')') AS product_message FROM order_detail ORDER BY product_id;
SELECT product_id,product_price*2 AS double_price FROM order_detail ORDER BY double_price;

/*使用匯聚函數(需要注意的是函數的可移植性不強,最好在用函數的時候加上註釋*/
SELECT COUNT(*) AS num_items,MIN(product_price) AS price_min,MAX(product_price) AS price_max,SUM(product_price) AS price_sum,AVG(product_price) AS product_avg FROM order_detail;

使用分組數據

SELECT category_type,COUNT(*) AS nums_categorytype FROM product_info GROUP BY category_type HAVING nums_categorytype <2;
/*GROUP BY子句應該在WHERE後,ORDER BY前,使用了GROUP BY,WHERE就無法對分組進行數據過濾了,這個時候應該使用HAVING對分組進行過濾
 也就是WHERE是針對分組前的數據進行過濾,而HAVING是針對分組後的數據進行過濾.
 */
SELECT MAX(product_price),category_type FROM product_info GROUP BY category_type;

子查詢

/*子查詢,從內向外執行查詢語句,一般與IN操作符結合使用,嵌套層數沒限制,但是最好不要太多*/
SELECT product_name FROM product_info WHERE category_type IN (
SELECT category_type FROM product_category WHERE category_id IN (1,2));
/*子查詢,計算字段,該子查詢對外部的每條記錄都執行一遍.*/
SELECT category_name,category_type,(SELECT COUNT(*) FROM product_info WHERE product_info.category_type=product_category.category_type) AS nums_each FROM product_category;

聯接表

/*外鍵:外鍵爲某一個表中的一個字段,它同時也是另外一個表的主鍵,定義了兩個表之間的關聯,
在聯接兩個表的時候,實際上是將第一個表的每一行與第二個表中的每一行配對,要保證所有聯結都有WHERE子句或者是ON子句*/
SELECT product_name,product_price,category_name FROM product_info,product_category WHERE product_info.category_type=product_category.category_type;
/*儘量使用INNER JOIN...ON...進行聯結(推薦使用),而不是WHERE*/
SELECT product_name,product_price,category_name FROM product_info INNER JOIN product_category ON product_info.category_type=product_category.category_type;
/*OUTER JOIN外聯結,LEFT OUTER JOIN左外聯結,包括了所有左邊表的行,RIGHT OUTER JOIN 右外聯結,包括了所有右邊表的行*/
SELECT product_name,product_price,category_name FROM product_info LEFT OUTER JOIN product_category ON product_info.category_type=product_category.category_type;
SELECT product_name,product_price,category_name FROM product_info RIGHT OUTER JOIN product_category ON product_info.category_type=product_category.category_type;

組合查詢

/*使用UNION操作符將多條SELECT子句組合成一個結果集合,UNION從查詢結果集中自動去除了重複的行,如果需要查詢出全部,可以使用UNION ALL替代.*/
SELECT product_name,product_price FROM product_info WHERE product_price<5 UNION SELECT product_name,product_price FROM product_info WHERE category_type=3;

插入數據

/*插入檢索出來的數據*/
/*INSERT INTO 要插入的表(字段名,字段名,...) SELECT 字段名,字段名,... FROM 另外一個表名*/
INSERT INTO product_category(category_id,category_name,category_type) VALUES(80,"日用品",5);

更新和刪除

/*更新或者刪除一定要注意加上WHERE子句,否則就變成了更新或者清空整個表,若想從整個表中刪除所有行,可使用TRUNCATE TABLE語句*/
UPDATE product_category SET category_name='香菸',category_type=5 WHERE category_id=80;
DELETE FROM product_category WHERE category_id=5;

數據庫管理高級篇

使用視圖(簡化數據,格式化基礎數據)

/*創建視圖,之後視圖就可以跟正常表格一樣使用了,但是視圖並不是實際存在的表,只是從
基本表中檢索出來的數據而已,而且還有一些操作的限制,應該將視圖用於檢索而不是更新
*/
CREATE VIEW category_product AS
SELECT product_name,product_price,category_name
  FROM product_info AS p INNER JOIN product_category AS c
  ON p.category_type=c.category_type;

/*視圖的使用*/
SELECT product_name,product_price,category_name FROM category_product;
/*視圖的刪除*/
DROP VIEW category_product;
/*顯示創建視圖的CREATE語句*/
SHOW CREATE VIEW category_product;

存儲過程(與編程語言的方法功能相似)

/*創建存儲過程*/
/*IN,OUT,INOUT分別爲輸入,輸出,輸入並輸出,INTO是賦值操作符號*/
CREATE PROCEDURE proceduring(
  OUT p1 DECIMAL(6,2),
  OUT p2 DECIMAL(6,2),
  OUT p3 DECIMAL(6,2),
  IN p4 INT
)
BEGIN
  SELECT MIN(product_price) INTO p1
    FROM product_info;
  SELECT AVG(product_price) INTO p2
    FROM product_info;
  SELECT SUM(product_price)+p4 INTO p3
    FROM product_info;
END;
/*使用存儲過程,必須注意要加上@*/
CALL proceduring(@p1,@p2,@p3,20);
/*查詢結果,也必須注意要加上@*/
SELECT @p3;
/*刪除存儲過程*/
DROP PROCEDURE proceduring;
/*顯示用來創建一個存儲過程的CREATE語句*/
SHOW CREATE PROCEDURE proceduring;

管理事務處理


/*使用事務*/
START TRANSACTION;
DELETE FROM product_info WHERE product_id=1;
COMMIT;
START TRANSACTION;
DELETE FROM product_info WHERE product_id=2;
SAVEPOINT commitpoint;
DELETE FROM product_info;
SELECT * FROM product_info;
ROLLBACK TO commitpoint;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章