Mysql加強
文章目錄
1. 多表查詢
1.1 笛卡爾積
沒有連接條件的表關係返回的結果(表之間數據組合的結果)。
注意:連接 n張表,至少需要 n-1個連接條件。
1.2 外鍵約束
主鍵約束(PRIMARY KEY): 約束在當前表中,指定列的值非空且唯一。
外鍵約束(FOREIGN KEY): A表中的外鍵列. A表中的外鍵列的值必須參照於B表中的某一列(B表主鍵)。
1.3 內連接查詢
1.3.1 顯示內連接
SELECT <selectList> FROM A [INNER] JOIN B ON A.列 = B.列
1.3.2 隱式內連接
SELECT <selectList> FROM A ,B WHERE A.列 = B.列
- 在做等值連接的時候,若A表中和B表中的列名相對. 則可以簡寫:
SELECT <selectList>
FROM A [INNER] JOIN B USING(**同名的列)**
前提:在emp和dept表中都有deptno列. 並且是外鍵關係。
如: SELECT * FROM emp JOIN dept USING (deptno)
1.4 外連接查詢
- 左外連接:查詢出JOIN左邊表的全部數據查詢出來,JOIN右邊的表不匹配的數據使用NULL來填充數據。
- 右外連接:查詢出JOIN右邊表的全部數據查詢出來,JOIN左邊的表不匹配的數據使用NULL來填充數據。
SELECT
<selectList>
FROM
A
LEFT/RIGHT OUTER JOIN B ON
(A.column_name = B.column_name);
1.5 自連接查詢
自連接查詢:把一張表看成兩張來做查詢,一定要取別名。
1.6 子查詢
一個查詢語句嵌套在另一個查詢語句中,內層查詢的結果可以作爲外層查詢條件。一般嵌套在WHERE或者FROM字句中。
- 單行單列子查詢:
-- 需求: 查詢零售價比羅技MX1100更高的所有商品信息。
SELECT * FROM product
WHERE salePrice > (
SELECT salePrice FROM product WHERE productName = '羅技MX1100'
)
- 單行多列子查詢
-- 需求: 查詢分類編號和折扣與羅技M100相同的所有商品信息。
SELECT * FROM product
WHERE (dir_id,cutoff)=(
SELECT dir_id,cutoff FROM product WHERE productName = '羅技M100'
)
2. 數據操作(DML)
2.1 插入數據
1.插入完整數據記錄
INSERT INTO table_name (column1,column2,column3...)VALUES (value1,value2,value3...);
2.插入數據記錄一部分
INSERT INTO table_name VALUES (value1,value2,value3...);
3.插入多條數據記錄(MySQL特有)
INSERT INTO table_name (column1,column2,column3...)
VALUES (value1,value2,value3...),
(value1,value2,value3...),
(value1,value2,value3...)..;
4.插入查詢結果
INSERT INTO table_name (column1,column2,column3...)
SELECT (column1,column2,column3...)
FROM table_name
2.2 修改數據
UPDATE table_name
SET columnName = value [, columnName = value] …
[WHERE condition];
如果省略了where子句,則全表的數據都會被修改。注意:沒有FROM
2.3 刪除數據
DELETE FROM tablename [WHERE condition];
如果省略了where子句,則全表的數據都會被刪除
3. 數據庫的備份與恢復
- 導出:
mysqldump -u賬戶 -p密碼 數據庫名稱>腳本文件存儲地
mysqldump -uroot -padmin jdbcdemo> C:/shop_bak.sql
- 導入:
mysql -u賬戶 -p密碼 數據庫名稱< 腳本文件存儲地址
mysql -uroot -padmin jdbcdemo< C:/shop_bak.sql
4. 函數
- cast函數
cast(值 as 類型)
cast('123' as SIGNED) 將123轉換爲int類型,返回值爲整型類型
- convert函數
convert('123',SIGNED)
可以轉換的類型有限制:
二進制,同帶binary前綴的效果 : BINARY
字符型,可帶參數 : CHAR()
日期 : DATE
時間: TIME
日期時間型 : DATETIME
浮點數 : DECIMAL
整數 : SIGNED
無符號整數 : UNSIGNED
- decimal類型
column decimal(P,D)
P是表示有效數字數的精度。 P範圍爲1〜65。
D是表示小數點後的位數。 D的範圍是0~30。
- ifnull函數
IFNULL(expression_1,expression_2);
如果expression_1不爲NULL,則IFNULL函數返回expression_1; 否則返回expression_2的結果。
5. 索引
索引是創建表在表上,是對數據庫表中一列或者多列的值進行排序的一種結構。索引可以提高檢索的速度。缺點創建和維護索引會耗費內存、時間,索引需要佔用物理空間,影響數據插入的速度(解決辦法是:先刪除表中的索引,然後插入數據,插入數據完成後再創建索引)。
創建索引的語法:
-- 在studnet表的age字段上添加索引,此索引按照從小到大的順序排列。
CREATE INDEX index_age ON student(age ASC);
6. 視圖
視圖是一種虛擬的表,是從一個或者多個表中導出來的數據。數據庫中只存放了視圖的定義,沒有存放視圖中的數據。這些數據還是存放在原來的表中。因此,視圖中的數據依賴於原來的表中的數據。
創建視圖的語法:
-- 創建一個視圖,包括studnet的姓名和年齡
CREATE VIEW student_view AS SELECT name,age from student;
7.數據庫三大範式
-
第一範式:要求表的每個字段必須是獨立的不可分割的單元(數據庫表的每一列都是不可分割的原子數據項)。
-
第二範式:在第一範式的基礎上,要求表的除主鍵以外的字段都和主鍵有依賴關係的(屬性完全依賴於主鍵)。
-
第三範式:在第二範式的基礎上,要求表的除主鍵以外的字段只能和主鍵有直接決定的依賴關係(任何非主屬性不依賴於其它非主屬性)。