這里寫目錄標題
- MySQL服務啟動
- SQL通用語法
- SQL分類
- DDL
- DML
- DQL
- 查詢陳述句
- 聚合函式
- 分組查詢
- 分頁查詢
- 約束
- 主鍵約束
- 非空約束
- 唯一約束
- 外鍵約束
- DCL
- 資料庫的設計
- 多表之間的關系
- 資料庫設計的范式
- 資料庫的備份和還原
- 多表查詢
- 查詢語法
- 笛卡爾積
- 多表查詢的分類
MySQL服務啟動
??cmd–>services.msc //打開服務的視窗
??net stop/start mysql //使用管理員打開cmd,關閉/打開mysql的服務
??mysql -uroot -proot //鏈接mysql服務器
??exit/quit //mysql的退出
??mysql -h127.0.0.1 -uroot -proot //登錄需要鏈接的目標
??mysql --host=ip --user=root --password=連接目標的密碼
SQL通用語法
1.陳述句可以單行或多行書寫,以分號結尾
2.可使用空格和縮進來增強陳述句的可讀性
3.陳述句不區分大小寫,建議使用大寫
4.三種注釋
(1)單行注釋:–(兩個橫杠一個空格) 注釋內容 或 # 注釋內容(mysql 特有)
(2)多行注釋:/* 注釋 */
SQL分類
DDL
用來定義資料庫物件:資料庫,表,列等,
????關鍵字:create,drop,alter等
(1)操作資料庫:CRU
? ?1)C(Create)創建//CREATE DATABASE 資料庫名稱//創建資料庫
? ?2)R(Retrieve):查詢
//SHOW DATABASES//查詢所有資料庫的名稱
//SHOW CREATE DATABASE 資料庫名稱;//查詢某個資料庫的創建陳述句
? ?3)U(Update):修改
修改資料庫的字符集
//ALTER DATABASE 資料名稱 CHARACTER SET 字符集名稱//例如UTF8
? ?4)D(Delete):洗掉
洗掉資料庫
//DROP DATABASE 資料庫名稱
? ?5)使用資料庫
查詢當前正在使用的資料庫名稱
//SELECT DATABASE();
使用資料庫
//USE 資料庫名稱
(2)操作表
1)C(Create)創建
*1.語法:
CREATE TABLE 表名(
列名1 資料型別1,
列名2 資料型別2,
…
列名n 資料型別n
);
*2.資料庫的型別:
1.int:整數型別
age int
2.double:小數型別
score double(5,2)//一共五位有效數字,保留小數點后兩位
3.date:日期,質保函年月日,yyyy-MM-dd
4.datetime:日期,包含年月日時分秒 yyyy-MM-dd HH:mm:ss
5.datestamp:日期,包含年月日時分秒 yyyy-MM-dd HH:mm:ss//如果將來不給這個欄位賦值,或賦值為null,則默認使用當前的系統時間,來自動賦值
6.varchar:字串
name varchar(20):姓名最大20個字符
? 復制表:
//CREATE TABLE 表名 LIKE 被復制的表名
2)R(Retrieve)查詢
查詢某個資料庫中所有的表名稱
//SHOW TABLES
查詢表結構
//DESC 表名
3)U(Update):修改
1.修改表名
ALTER TABLE 表名 RENAME TO 新的表名;
2.修改表的字符集
ALTER TABLE 表名 CHARACTER SET 字符集名稱;
3.添加一列
ALTER TABLE 表名 ADD 列名 資料型別;
4.修改列名稱 型別
ALTER TABLE 表名 CHANGE 列名 新列名 新資料型別;
ALTER TABLE 表名 MODIFY 列名 新資料型別;
5.洗掉列
4)D(Delete)洗掉
//DROP TABLE 表名
DML
用來查詢資料庫中表的資料進行增刪改、查詢SELECT * FROM 表名;
關鍵字:insert,delete,update等
1)添加資料:
*語法:
INSERT INTO 表名(列名1,列名2,…,列名n) VALUES(值1,值2,…,值n);
*注意:
1.列名和值要一一對應
2.如果表名后,不定義列名,則默認給所有添加值
INSERT INTO 表名 VALUES(值1,值2,…,值n);
3.除了數字型別,其他型別需要使用引號(單雙都可以)引起來
2)洗掉資料
*語法:
DELETE FROM 表名 WHERE 條件
*注意:
1.如果不加條件,則洗掉表中所有記錄
2.如果要洗掉所有的記錄,推薦使用//TRUNCATE TABLE 表名;//洗掉表,然后再創建一個一模一樣的空表
3)修改資料
*語法:UPDATE 表名 SET 列名1 = 值1,列名2 = 值2,…[WHERE 條件]
*注意:如果不加任何條件,則會將表中所有記錄全部修改
DQL
用來查詢資料庫中標的記錄,
? 關鍵字:select,where等
1)語法:
SELECT
欄位串列
FROM
表明串列
WHERE
條件串列
GROUP BY
分組欄位
HAVING
分組之后的條件
ORDER BY
排序
LIMIT
分頁限定
2)基礎查詢
1.多個欄位的查詢
SELECT 欄位名1,欄位名2… FROM 表名;
*注意:
如果查詢所有欄位,則可以使用 * 來替代欄位串列
2.去除重復:
DISTINCT
3.計算列:
一般可以使用四則運算計算一些列的值(一般只會進行數值型的計算)
IFNULL(運算式1,運算式2)//NULL參與的運算,結果都為NULL
//運算式1:那個欄位需要判斷是否為NULL
運算式2:如果該欄位為NULL后的替換值
4.起別名:
AS:AS也可以省略
3)條件查詢:
1.WHERE趑趄后跟條件
2.運算子
? >、<、>=、<=、=、<>
? BETWEEN…AND
? IN(集合)
? LIKE
*占位符:
? _:單個任意字符
? %:多個任意字符
? IS NULL/IS NOT NULL
? AND 或 &&
? OR或 ||
? NOT 或 !### 查詢
查詢陳述句
語法:
ORDER BY 子句
ORDER BY 排序欄位1 排序方式1, 排序欄位2 排序方式2…
//排序方式:ASC:升序,默認的
DESC:降序
//注意:
如果有多個排序條件,則當前邊的條件值一樣時,才會判斷第二條件
聚合函式
將一列資料作為一個整體,進行縱向的計算
1.COUNT:計算個數
*1一般選擇非空的列:主鍵
*2IFNULL函式
2.MAX:計算最大值
3.MIN:計算最小值
4.SUM:計算和
5.AVG:計算平均值
分組查詢
1.語法:GROUP BY 分組欄位;
2.注意:
分組之后查詢的欄位:分組欄位、聚合函式
WHERE 和 HAVING 的區別:
WHERE在分組之前進行限定,如果不滿足條件,則不參與分組;WHERE后不可跟聚合函式
HAVING在分組之后進行限定,如果不滿足結果,則不會被查詢出來;HAVING可以進行聚合函式的判斷
SELECT sex ,AVG(math),COUNT(id) FROM student WHERE math > 70 GROUP BY sex HAVING COUNT(id) > 2;
分頁查詢
1.語法:LIMIT 開始的索引,每頁查詢的條數;
2.公式:開始的索引=(當前的頁碼-1)*每頁顯示的條數
3.LIMIT 是一個MySQL“方言”
約束
1)概念:對表中的資料進行限定,保證資料的正確性、有效性和完整性
2)分類:
主鍵約束
PRIMARY KEY
*1.注意:
非空且唯一;一張表只能有一個欄位為主鍵,;主鍵就是表中記錄的唯一表示
*2.在創建表示,添加主鍵約束
CREAT TABLE 表名(
列名 型別 PRIMARY KEY
);
*3.洗掉主鍵
ALTER TABLE 表名 DROP PRIMARY KEY;
*4.創建完表后,添加主鍵
ALTER TABLE 表名 MODIFY 列名 型別 PRIMARY KEY;
*5.自動增長:
a.如果某一列是數值型別的,使用AUTO_INCREMENT 可以來完成值的自動增長
b.在創建表時,添加主鍵約束,并且完成主鍵自增長
CREAT TABLE 表名(
列名 型別 PRIMARY KEY AUTO_INCREMENT
);
c.洗掉自動增長
ALTER TABLE 表名 MODIFY 列名 型別;
d.添加自動增長
ALTER TABLE 表名 MODIFY 列名 型別 AUTO_INCREMENT;
*6.聯合主鍵
FOREIGN KEY(主鍵1,主鍵2);
非空約束
NOT NULL
*1傳建表時添加約束
CREATE TABLE stu(
NAME VARCHAR(20) NOT NULL--name為非空
)
*2創建表完之后,添加非空約束
ALTER TABLE sty MODIFT NAME VARCHAR(20) NOT NULL;
*3洗掉name的非空約束
ALTER TABLE stu MODIFY NAME VARCHAR(20);
唯一約束
UNIQUE
*1.創建表示,添加唯一約束
CREATE TABLE 表名(
列名 型別 UNIQUE//添加了唯一約束
);
*2.洗掉唯一約束
ALTER TABLE 表名 DROP INDEX 列名;
*3.在創建表后,添加唯一約束
ALTER TABLE 表名 MODIFY 列名 型別 UNIQUE;
外鍵約束
FOREIGN KEY
FOREGIN KEY,讓表與表產生關系,從而保證資料的正確性
*1.在創建表時,可以添加外鍵
CREATE TABLE 表名(
…
外鍵列
CONSTRAINT 外鍵名稱 FOREIGN KEY (外鍵列名稱) REFERENCES 主表名稱(主表列名稱)
);
*2.洗掉外鍵
ALTER TABLE 表名 DROP FOREIGN KEY 外鍵名稱;
*3.創建表之后,添加外鍵
ALTER TABLE 表名 ADD CONSTRAINT 外鍵名稱 FOREIGN KEY (外鍵欄位名稱) REFERENCES 主表名稱(主表列名稱);
*4.級聯操作
a.添加級聯操作
ALTER TABLE 表名 ADD CONSTRAINT 外鍵名稱 FOREIGN KEY (外鍵欄位名稱) REFERENCES 主表名稱(主表列名稱) ON UPDATE CASCADE ON DELETE CASCADE;
b.分類:
①級聯更新:ON UPDATE CASCADE
②級聯洗掉:ON DELETE CASCADE
DCL
用來定義資料庫的訪問權限和安全級別,及創建用戶,
?關鍵字:grant,revoke等
資料庫的設計
多表之間的關系
1.一對一://如人和身份證
實作方式:可以在任意一方添加外鍵指向另一方的主鍵
2.一對多(多對一)://如部門(一)和員工(多)
實作方式:在多的一方建立外鍵,指向一的一方的主鍵
3.多對多://如學生和課程
實作方式:需要借助第三張中間表,中間表至少包含兩個欄位,這兩個欄位作為第三張表的外鍵,分別指向兩張表的主鍵
資料庫設計的范式
1.概念:設計資料庫時,需要遵循的一些規范,要遵循后變得范式要求,必須先遵循前邊的所有范式要求
2.分類:
*1.第一范式(1NF):每一列都是不可分割的原子資料項
*2.第二范式(2NF):在1NF的基礎上,非碼屬性必須完全依賴于候選碼
??a.函式依賴:如果通過A屬性(屬性組)的值,可以確定唯一B屬性的值,則稱B依賴于A
??b.完全函式依賴:如果A是一個屬性組,則B屬性值的確定需要依賴于A屬性組中所有的屬性值
??c.部分函式依賴:如果A是一個屬性組,則B屬性值的確定只需要依賴于A屬性組中部分的屬性值即可
??d.傳遞函式依賴:如果通過A屬性(屬性組)的值,可以確定唯一B屬性的值,在通過B屬性(屬性組)的值可以確定為宜C屬性的值,則稱C傳遞函式依賴于A
??e.碼:如果在一張表中,一個屬性或屬性組,被其他所有屬性所完全依賴,則稱這個屬性(屬性組)為該表的碼
*3.第三范式(3NF):在2NF的基礎上,任何非主屬性不依賴與其他非主屬性(在2NF的基礎上消除傳遞依賴)
資料庫的備份和還原
一、命令列:
MYSQLDUMP -u用戶名 -p密碼 資料庫的名稱 > 保存的路徑;//保存
SOURCE 檔案路徑;//執行還原
二、圖形化工具:
選中表,郵件備份/匯出,備份資料庫;右鍵資料庫,執行SQL腳本,選擇檔案
多表查詢
查詢語法
SELECT 表 FROM 表名串列 WHERE…
笛卡爾積
有兩個集合A,B,取這兩個集合的所有組成情況;要完成多表查詢,需要消除無用的資料
多表查詢的分類
1.內連接查詢:
*1.隱式內連接:使用WHERE條件消除無用的資料
SELECT
emp.name,
emp.gender,
dept.name
From
emp,dept
WHERE
emp.dept_id=dept.id;
*2.顯式內連接:
a.語法:SELECT 欄位串列 FROM 表名1 [INNER] JOIN 表名2 ON 條件
b.
SELECT * FROM emp INNER JOIN dept ON emp.dept_id=dept.id
SELECT * FROM emp INNER JOIN dept ON emp.dept_id=dept.id
*3.內連接查詢:
a.從哪些表中查詢資料
b.條件是什么
c.查詢哪些欄位
4.外連接查詢:
*1.左外連接:
SELECT 欄位串列 FROM 表1 LEFT [OUTER] JOIN 表2 ON 條件;//顯示出左邊表的全部資料和左邊和右邊相同的資料
*2.右外連接:
SELECT 欄位串列 FROM 表1 RIGHT [OUTER] JOIN 表2 ON 條件; //顯示出右邊表的全部資料和左邊和右邊相同的資料
5.子查詢
*1.子查詢:查詢中嵌套查詢
SELECT * FROM emp WHERE emp.salary=(SELECT MAX(salary) FROM emp);//單行單列子查詢,可以作為條件
*2.子查詢不同情況
a.子查詢的結果是單行單列的:
該子查詢可以作為條件
b.子查詢的結果是多行單列的
該子查詢可以作為條件使用運算子IN來判斷
c.子查詢的結果是多行多列的
該子查詢可以作為一張虛擬表
SELECT * FROM dept t1,(SELECT * FROM emp WHERE emp.join_date > '2011-11-11') t2
WHERE t1.id=t2.dept_id;
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/278143.html
標籤:其他
