速查語(yǔ)法
查詢(xún)
實(shí)用語(yǔ)句:https://www.liaoxuefeng.com/wiki/1177760294764384/1246617682185952
常規(guī)查詢(xún)
- SELECT 列1 別名1, 列2 別名2, 列3 別名3 FROM students(表) WHERE(后跟條件) score >= 80
可以加上DESC表示“倒序”:
SELECT id, name, gender, score
FROM students
WHERE class_id = 1
ORDER BY score DESC;
LIMIT <N-M> OFFSET <M>
條件運(yùn)算:按照NOT、AND、OR的優(yōu)先級(jí)進(jìn)行,即NOT優(yōu)先級(jí)最高,其次是AND,最后是OR。加上括號(hào)可以改變優(yōu)先級(jí)。
分頁(yè)查詢(xún):確定每頁(yè)需要顯示的結(jié)果數(shù)量pageSize(這里是3),然后根據(jù)當(dāng)前頁(yè)的索引pageIndex(從1開(kāi)始),確定LIMIT和OFFSET應(yīng)該設(shè)定的值: LIMIT總是設(shè)定為pageSize;OFFSET計(jì)算公式為pageSize * (pageIndex - 1)。
條件表達(dá)式(字符串需要使用單引號(hào)引起來(lái)):
=:判斷相等
>:判斷大于
>=:判斷大于或相等
<:判斷小于
<=:判斷小于或相等
<>:判斷不相等
LIKE:判斷相似
BETWEEN XX AND XX:數(shù)值范圍
IN (60, 90):表示在括號(hào)內(nèi)的值,此處只有60和90
聚合查詢(xún)
- COUNT(*)
- SUM()
- AVG()
- MAX()
- MIN()
查詢(xún)數(shù)量
SELECT COUNT(*) FROM students;
其他方法
SELECT AVG(score) average FROM students WHERE gender = 'M';
分組查詢(xún)
- GROUP BY
SELECT class_id, gender, COUNT(*) num FROM students GROUP BY class_id, gender;
多表查詢(xún)
乘積,中間使用逗號(hào)分開(kāi)
- 慎用,會(huì)生成一個(gè)很大的表格,100*100=10000
- 查詢(xún)的時(shí)候不能直接使用別名,可用c.id,不能用cid
- 使用別名不是必須的,但可以更好地簡(jiǎn)化查詢(xún)語(yǔ)句
SELECT
s.id sid,
s.name,
s.gender,
s.score,
c.id cid,
c.name cname
FROM students s, classes c
WHERE c.id = 1;
連接查詢(xún)
- INNER JOIN:只返回同時(shí)存在于兩張表的行數(shù)據(jù)
- RIGHT OUTER JOIN:返回右表都存在的行
- LEFT OUTER JOIN:返回左表都存在的行
- FULL OUTER JOIN:把兩張表的所有記錄全部選擇出來(lái)
先確定主表,仍然使用FROM <表1>的語(yǔ)法;
再確定需要連接的表,使用INNER JOIN <表2>的語(yǔ)法;
然后確定連接條件,使用ON <條件...>,這里的條件是s.class_id = c.id,表示students表的class_id列與classes表的id列相同的行需要連接;
可選:加上WHERE子句、ORDER BY等子句。
SELECT s.id, s.name, s.class_id, c.name class_name, s.gender, s.score
FROM students s
INNER JOIN classes c
ON s.class_id = c.id;
增、刪、改
- INSERT:插入新記錄;
INSERT INTO <表名> (字段1, 字段2, ...) VALUES (值1, 值2, ...); - UPDATE:更新已有記錄;
UPDATE <表名> SET 字段1=值1, 字段2=值2, ... WHERE ...; - DELETE:刪除已有記錄。
DELETE FROM <表名> WHERE ...; - 沒(méi)有選中不會(huì)報(bào)錯(cuò)(mysql會(huì)有提示),如果沒(méi)有加WHERE會(huì)更新整表,高風(fēng)險(xiǎn)操作
INSERT INTO students (class_id, name, gender, score) VALUES
(1, '大寶', 'M', 87),
(2, '二寶', 'M', 81);
UPDATE students SET name='小牛', score=77 WHERE id>=5 AND id<=7;
DELETE FROM students WHERE id>=5 AND id<=7;
MySQL
登錄
- mysql -u root -p:
- SHOW DATABASES:顯示數(shù)據(jù)庫(kù)
nformation_schema、mysql、performance_schema和sys是系統(tǒng)庫(kù),不要去改動(dòng)它們。 - CREATE DATABASE test;
- DROP DATABASE test;
- USE test;
- SHOW TABLES;
- DESC students; 查看表結(jié)構(gòu)
- SHOW CREATE TABLE students;查看創(chuàng)建表的SQL語(yǔ)句
- DROP TABLE students;
- ALTER TABLE students ADD COLUMN birth VARCHAR(10) NOT NULL;新增一列
- ALTER TABLE students CHANGE COLUMN birth birthday VARCHAR(20) NOT NULL;要修改birth列,例如把列名改為birthday,類(lèi)型改為VARCHAR(20):
- ALTER TABLE students DROP COLUMN birthday;
- exit
其他
- 不帶from可以直接進(jìn)行運(yùn)算,一般會(huì)通過(guò)SELECT 1;來(lái)判斷是否正常連接到數(shù)據(jù)庫(kù)
- 通常情況下,字段應(yīng)該避免允許為NULL。不允許為NULL可以簡(jiǎn)化查詢(xún)條件,加快查詢(xún)速度,也利于應(yīng)用程序讀取數(shù)據(jù)后無(wú)需判斷是否為NULL。
- 身份證號(hào)、手機(jī)號(hào)、郵箱地址這些看上去可以唯一的字段,均不可用作主鍵。作為主鍵最好是完全業(yè)務(wù)無(wú)關(guān)的字段,我們一般把這個(gè)字段命名為id,可以使用自增整數(shù)類(lèi)型或全局唯一GUID類(lèi)型(一般程序可生成)
數(shù)據(jù)類(lèi)型
| 名稱(chēng) | 類(lèi)型 | 說(shuō)明 |
|---|---|---|
| INT | 整型 | 4字節(jié)整數(shù)類(lèi)型,范圍約+/-21億 |
| BIGINT | 長(zhǎng)整型 | 8字節(jié)整數(shù)類(lèi)型,范圍約+/-922億億 |
| REAL | 浮點(diǎn)型 | 4字節(jié)浮點(diǎn)數(shù),范圍約+/-1038 |
| DOUBLE | 浮點(diǎn)型 | 8字節(jié)浮點(diǎn)數(shù),范圍約+/-10308 |
| DECIMAL(M,N) | 高精度小數(shù) | 由用戶指定精度的小數(shù),例如,DECIMAL(20,10)表示一共20位,其中小數(shù)10位,通常用于財(cái)務(wù)計(jì)算 |
| CHAR(N) | 定長(zhǎng)字符串 | 存儲(chǔ)指定長(zhǎng)度的字符串,例如,CHAR(100)總是存儲(chǔ)100個(gè)字符的字符串 |
| VARCHAR(N) | 變長(zhǎng)字符串 | 存儲(chǔ)可變長(zhǎng)度的字符串,例如,VARCHAR(100)可以存儲(chǔ)0~100個(gè)字符的字符串 |
| BOOLEAN | 布爾類(lèi)型 | 存儲(chǔ)True或者False |
| DATE | 日期類(lèi)型 | 存儲(chǔ)日期,例如,2018-06-22 |
| TIME | 時(shí)間類(lèi)型 | 存儲(chǔ)時(shí)間,例如,12:20:59 |
| DATETIME | 日期和時(shí)間類(lèi)型 | 存儲(chǔ)日期+時(shí)間,例如,2018-06-22 12:20:59 |
鍵與索引
外鍵:通過(guò)定義外鍵約束實(shí)現(xiàn),會(huì)降低性能,一般通過(guò)程序保證正確,不設(shè)置外鍵約束
添加:
ALTER TABLE students
ADD CONSTRAINT fk_class_id
FOREIGN KEY (class_id)
REFERENCES classes (id);
刪除:(并沒(méi)有刪除外鍵列)
ALTER TABLE students
DROP FOREIGN KEY fk_class_id;
索引:索引是關(guān)系數(shù)據(jù)庫(kù)中對(duì)某一列或多個(gè)列的值進(jìn)行預(yù)排序的數(shù)據(jù)結(jié)構(gòu)。通過(guò)使用索引,可以讓數(shù)據(jù)庫(kù)系統(tǒng)不必掃描整個(gè)表,而是直接定位到符合條件的記錄,這樣就大大加快了查詢(xún)速度。
索引的效率取決于索引列的值是否散列,即該列的值如果越互不相同,那么索引效率越高??梢詫?duì)一張表創(chuàng)建多個(gè)索引。索引的優(yōu)點(diǎn)是提高了查詢(xún)效率,缺點(diǎn)是在插入、更新和刪除記錄時(shí),需要同時(shí)修改索引,因此,索引越多,插入、更新和刪除記錄的速度就越慢。
創(chuàng)建索引:
ALTER TABLE students
ADD INDEX idx_score (name,score);
創(chuàng)建唯一索引:
ALTER TABLE students
ADD UNIQUE INDEX uni_name (name);
創(chuàng)建唯一約束不創(chuàng)建索引:
ALTER TABLE students
ADD CONSTRAINT uni_name UNIQUE (name);
事務(wù)
在執(zhí)行SQL語(yǔ)句的時(shí)候,某些業(yè)務(wù)要求,一系列操作必須全部執(zhí)行,而不能僅執(zhí)行一部分。
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT;
主動(dòng)讓事務(wù)失?。?BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
ROLLBACK;
搬運(yùn)自
廖雪峰的官方網(wǎng)站:https://www.liaoxuefeng.com/