mysql 经典入门教程_MySQL 经典入门教程
MySQL 經(jīng)典入門(mén)教程
1 定義
數(shù)據(jù)庫(kù)中的表:一行叫一條記錄。每一列叫一個(gè)屬性,或一個(gè)字段。
主鍵:表中的某個(gè)特殊字段,具有唯一的確定的值,可以根據(jù)該字段唯一的確定一條記錄
外鍵:表中的某個(gè)字段的值為另一張表(也可以是自身)中的某個(gè)字段的值。
2 MySQL 的數(shù)據(jù)類(lèi)型
2.1 數(shù)值
TINYINT 小整型
INT/INTEGER 整型
BIGINT 長(zhǎng)整型
FLOAT 小數(shù)
DOUBLIE 雙精度小數(shù)
2.2 日期
DATE YYYY-MM-DD
TIME HH:MM:SS
YEAT YYYY
DATETIME 混合
TIMESTAMP 高精度
2.3 字符串
CHAR 定長(zhǎng)字符串
VARCHAR 不定長(zhǎng)
BLOB 二進(jìn)制文件
LONGBLOB 長(zhǎng)二進(jìn)制文件
TEXT 長(zhǎng)文本數(shù)據(jù)
LONGTEXT 長(zhǎng)文本數(shù)據(jù)
注:以上僅總結(jié)了常用類(lèi)型,并不是所有類(lèi)型
3 SQL語(yǔ)句
3.1 數(shù)據(jù)庫(kù)的創(chuàng)建
CREATE DATABASE 數(shù)據(jù)庫(kù)名 [參數(shù)]
例如創(chuàng)建一個(gè)名為test的數(shù)據(jù)庫(kù),設(shè)置字符集為utf-8
CREATE DATABASE test CHARACTER SET utf8;
出現(xiàn)下面的內(nèi)容即說(shuō)明創(chuàng)建成功。
Query OK, 0 rows affected (0.00 sec)
你可以使用下面的語(yǔ)句查看新創(chuàng)建的數(shù)據(jù)庫(kù)
SHOW DATABASES;
選擇需要操作的數(shù)據(jù)庫(kù)
USE test;
執(zhí)行完上面的語(yǔ)句后出現(xiàn)Database changed,
你所有的操作都將在test數(shù)據(jù)庫(kù)中進(jìn)行。
3.2 創(chuàng)建表
CREATE TABLE 表名 (
列名 列數(shù)據(jù)屬性 [約束],
列名 列數(shù)據(jù)屬性,
... ...
);
例如創(chuàng)建一個(gè)users表id是主鍵,自增長(zhǎng)。
PRIMARY KEY:約束 主鍵約束
AUTO_INCREMENT:約束 自增長(zhǎng)
CREATE TABLE users( id INTEGER PRIMARY KEY AUTO_INCREMENT, account VARCHAR(50), pwd VARCHAR(50), );
3.3 插入數(shù)據(jù)
INSERT INTO 表名 VALUES (值1, 值2,...,NULL,...);
這種插入方式一定要將所有的值都寫(xiě)上,如果為空的話(huà)寫(xiě)NULL。值與列要一一對(duì)應(yīng)
主鍵如果設(shè)置為自增的話(huà)寫(xiě)NULL
也可以指定所要插入數(shù)據(jù)的列,向下面這樣。
INSERT INTO 表名 (列1, 列2,...) VALUES (值1, 值2,....);
按回車(chē)后出現(xiàn)
Query Ok, 1 row affected (0.05 sec)
說(shuō)明成功。否則請(qǐng)檢查SQL語(yǔ)句。
例如向剛剛創(chuàng)建的users表中插入一條數(shù)據(jù)
INSERT INTO users VALUES(NULL,'admin','admin');
第一列是id,主鍵自增,不需要插入。
3.4 查詢(xún)數(shù)據(jù)
SELECT * FROM 表名 [WHERE 條件] [參數(shù)];
例如查詢(xún)users表里的所有數(shù)據(jù)的 account 列。
SELECT account FROM users;
3.4.1 WHERE 查詢(xún)
可以給FROM后面的表起一個(gè)別名。例如:
SELECT tn.id,tn.account FROM tablename AS tn WHERE tn.id = 1;
3.4.2 WHERE 后的條件語(yǔ)句
WHERE后面可以寫(xiě)多種條件語(yǔ)句。
1. 關(guān)系語(yǔ)句: =,>,=,<=
2. 邏輯語(yǔ)句: AND,OR,NOT
3. IS NULL: 是否為空
4. BETWEEN:在兩者之間
WHERE u.id BETWEEN 11 AND 15;
id 在11-15之間。
5. IN:在..之中
WHERE u.account IN (值1,值2,...);
查詢(xún) account 在(值1,值2,...)之中的數(shù)據(jù)
5. LIKE:模糊匹配
WHERE u.id LIKE '通配符';
通配符
'%':替代零個(gè)或多個(gè)字符
'_':替代一個(gè)字符
WHERE u.account LIKE '%A%';查詢(xún)account字段中含有'A'的數(shù)據(jù)。
[charlist]:字符列中的任何單一字符
WHERE u.account LIKE '[ASD]%'; 查詢(xún)以A S D 開(kāi)頭的數(shù)據(jù)。
[!charlist]:不在字符列中的任何單一字符
WHERE u.account LIKE '[!ASD]%'; 查詢(xún)不以A S D 開(kāi)頭的數(shù)據(jù)
3.4.3 聚合函數(shù)
SELECT AVG(列名) FROM 表名
1. AVG(列名):返回某一列的平均值
2. COUNT(列名):返回匹配指定條件的行數(shù)
3. FIRST(列名):返回指定的字段中第一個(gè)記錄的值。
4. LAST(列名):返回指定的字段中最后一個(gè)記錄的值。
5. MAX(列名):返回一列中的最大值。NULL 值不包括在計(jì)算中。
6. MIN(列名):返回一列中的最小值。NULL 值不包括在計(jì)算中。
7. SUM(列名):返回?cái)?shù)值列的總數(shù)(總額)。
8. UCASE(列名):把字段的值轉(zhuǎn)換為大寫(xiě)。
9. LCASE(列名):把字段的值轉(zhuǎn)換為小寫(xiě)。
10. MID(列名,開(kāi)始位置,截取長(zhǎng)度):用于從文本字段中提取字符。
SELECT MID(account,1,3) as uname FROM users;
11. LEN(列名):返回文本字段中值的長(zhǎng)度。
12. ROUND(列名,小數(shù)位數(shù)):用于把數(shù)值字段舍入為指定的小數(shù)位數(shù)。
13. CURDATE():返回當(dāng)前日期。YYYY-MM-DD。
14. CURTIME():返回當(dāng)前時(shí)間。HH:MM:SS。
15. NOW():返回當(dāng)前時(shí)間。YYYY-MM-DD HH:MM:SS。
16. YEAR(d),MONTH(d),DAY(d):分別返回參數(shù)的年,月,日。
17. ADDDATE(d,n):在d的時(shí)間上加n天。
18. SUBDATE(d,n):在d的時(shí)間上減n天。
19. DATE_FORMAT(d,f):格式化時(shí)間d。
%a 縮寫(xiě)星期名
%b 縮寫(xiě)月名
%c 月,數(shù)值
%D 帶有英文前綴的月中的天
%d 月的天,數(shù)值(00-31)
%e 月的天,數(shù)值(0-31)
%f 微秒
%H 小時(shí) (00-23)
%h 小時(shí) (01-12)
%I(大寫(xiě)的i) 小時(shí) (01-12)
%i 分鐘,數(shù)值(00-59)
%j 年的天 (001-366)
%k 小時(shí) (0-23)
%l(小寫(xiě)的L) 小時(shí) (1-12)
%M 月名
%m 月,數(shù)值(00-12)
%p AM 或 PM
%r 時(shí)間,12-小時(shí)(hh:mm:ss AM 或 PM)
%S 秒(00-59)
%s 秒(00-59)
%T 時(shí)間, 24-小時(shí) (hh:mm:ss)
%U 周 (00-53) 星期日是一周的第一天
%u 周 (00-53) 星期一是一周的第一天
%V 周 (01-53) 星期日是一周的第一天,與 %X 使用
%v 周 (01-53) 星期一是一周的第一天,與 %x 使用
%W 星期名
%w 周的天 (0=星期日, 6=星期六)
%X 年,其中的星期日是周的第一天,4 位,與 %V 使用
%x 年,其中的星期一是周的第一天,4 位,與 %v 使用
%Y 年,4 位
%y 年,2 位
3.4.4 分組查詢(xún)
GROUP BY 語(yǔ)句用于結(jié)合聚合函數(shù),根據(jù)一個(gè)或多個(gè)列對(duì)結(jié)果集進(jìn)行分組。
SELECT 列名, 聚合函數(shù) FROM 表名 WHERE 條件 GROUP BY 列名
例如根據(jù)用戶(hù)表中的role屬性分組統(tǒng)計(jì)每組的人數(shù)
SELECT role, COUNT(id) FROM users GROUP BY role;
3.4.5 分組過(guò)濾
在 SQL 中增加 HAVING 子句原因是,WHERE 關(guān)鍵字無(wú)法與合計(jì)函數(shù)一起使用。
例如根據(jù)用戶(hù)表中的role屬性分組統(tǒng)計(jì)每組的人數(shù),查找人數(shù)大于10的role
SELECT role, COUNT(id) FROM users GROUP BY role HAVING COUNT(id)>10;
3.4.6 結(jié)果排序
ORDER BY 語(yǔ)句用于根據(jù)指定的列對(duì)結(jié)果集進(jìn)行排序。
默認(rèn)為升序,降序使用關(guān)鍵字DESC。
例如根據(jù)用戶(hù)表中的role屬性分組統(tǒng)計(jì)每組的人數(shù),按照人數(shù)降序排列
SELECT role, COUNT(id) count FROM users GROUP BY role ORDER BY count DESC;
3.5 更新數(shù)據(jù)
UPDATE 表名 SET 列名 = 新值 WHERE 條件
WHERE的修改條件是可選的,不寫(xiě)的話(huà)修改表的所有數(shù)據(jù)
例如修改users表里的數(shù)據(jù),將admin用戶(hù)的密碼改為root
UPDATE users SET pwd = 'root' WHERE account = 'admin';
3.6 刪除數(shù)據(jù)
DELETE FROM 表名 WHERE 條件
WHERE的修改條件是可選的,不寫(xiě)的話(huà)刪除表的所有數(shù)據(jù)
4 表屬性的修改
4.1 表重命名
ALTER TABLE 表名 RENAME 新表名;
4.2 添加新的一列
ALTER TABLE 表名 ADD 列名 列數(shù)據(jù)類(lèi)型 [AFTER 插入位置]
例如在users表的pwd字段后面添加一個(gè)role字段類(lèi)型是INTEGER
ALTER TABLE users ADD role INTEGER AFTER pwd;
4.3 修改列
ALTER TABLE 表名 CHANGE 列名稱(chēng) 新列名稱(chēng) 新數(shù)據(jù)類(lèi)型;
例如修改users表里的pwd字段改為password,類(lèi)型是varchar(20)
ALTER TABLE users CHANGE pwd password varchar(20);
5 完整性約束
約束:對(duì)表中的列添加的一些限制條件。只有滿(mǎn)足這些條件時(shí)才能數(shù)據(jù)才能插入。
5.1 實(shí)體完整性
主鍵不能為空
5.2 參照完整性
外鍵的值必須是某張表中存在的值,可以為空
5.3 用戶(hù)自定義完整性
唯一性約束,某一列雖然不為主鍵,但是依然不能重復(fù)。
5.4 添加約束
ALTER TABLE 表名 ADD CONSTRAINT 約束名 約束類(lèi)型(列名);
例如,給users表的role列添加外鍵約束,引用自roles表的id列
ALTER TABLE users ADD CONSTRAINT uq_phone FOREIGN KEY (`role`) REFERENCES `roles` (`id`);
5.5 常見(jiàn)約束類(lèi)型
1. PRIMARY KEY: 主鍵
2. CHECK:限制列中的值的范圍。MySQL好像不支持
3. UNIQUE:唯一性約束
4. NOT NULL:非空約束
5. FOREIGN KEY:外鍵約束
6 范式
函數(shù)依賴(lài):如果A依賴(lài)B,那么當(dāng)確定A值后,B值也就確定了。
例如,在一張表中由于主鍵是唯一確定且不重復(fù)的。所以,當(dāng)主鍵的值確定了,那么其他列的值也就確定了。我們便說(shuō),其他列都依賴(lài)主鍵。
完全函數(shù)依賴(lài):如果B函數(shù)依賴(lài)于A,并且對(duì)于A的任何一個(gè)真子集A1,都有 B不依賴(lài)與A1,稱(chēng)A對(duì)B完全函數(shù)依賴(lài)。
部分函數(shù)依賴(lài):如果B函數(shù)依賴(lài)于A,但是B不完全函數(shù)依賴(lài)于A,稱(chēng)B對(duì)A部分函數(shù)依賴(lài)。
例如,在一張表中,有兩列,一列是用戶(hù)名,而另一列里某些行里記錄的是用戶(hù)的id,而某些行里在這一列里記錄的是用戶(hù)所在部門(mén)的id,那么用戶(hù)名列便部分函數(shù)依賴(lài)于id列,因?yàn)榇嬖谀承┬幸蕾?lài)于id列的子集(記錄是部門(mén)id的行)。
傳遞函數(shù)依賴(lài):如果A函數(shù)依賴(lài)于B,B函數(shù)依賴(lài)于C,則稱(chēng)A傳遞函數(shù)依賴(lài)于C。
6.1 1NF(第一范式)
確保列不可分,即每一列只描述一個(gè)屬性,即達(dá)到1NF
6.2 2NF(第二范式)
在1NF的基礎(chǔ)上消除部分函數(shù)依賴(lài)即達(dá)到2NF。即每一個(gè)非主屬性(非主鍵列)完全函數(shù)依賴(lài)于主鍵。
例如,可以將上面部分函數(shù)依賴(lài)的例子中的表,改成兩張表,一張用戶(hù)表,一張部門(mén)表,所有的用戶(hù)名列都完全依賴(lài)于主鍵。便達(dá)到2NF。
6.3 3NF(第三范式)
在2NF的基礎(chǔ)上消除傳遞函數(shù)依賴(lài)便達(dá)到3NF。即每一個(gè)非主屬性(非主鍵列)即不部分依賴(lài)于主鍵,也不傳遞依賴(lài)于主鍵。
總結(jié)
以上是生活随笔為你收集整理的mysql 经典入门教程_MySQL 经典入门教程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 百分之十是多少钱啊?
- 下一篇: qt绘制一圈圆_Qt绘制圆