大學學的數據庫系統概論工做後幾年沒有使用都已忘了, 如今項目須要用到數據庫, 但來不及細看相關書籍了, 遂將一些經常使用的記錄下來.mysql
MySQL
支持多種類型, 大體能夠分爲三類: 數值, 日期/時間和字符串(字符)類型, 大體以下:sql
數值類型數據庫
tinyint
, smallint
, mediumint
, int
, bigint
float
, double
, decimal
date
, time
, datetime
, timestamp
, year
ui
字符串類型code
char
, varchar
tinytext
, text
, mediumtext
, longtext
tinyblob
, blob
, mediumblob
, longblob
下面將詳細給出每種類型的大小和描述.ci
類型 | 字節 | 描述 |
---|---|---|
tinyint | 1 | 小整數值 |
smallint | 2 | 大整數值 |
mediumint | 3 | 大整數值 |
int | 4 | 大整數值 |
bigint | 8 | 極大整數值 |
float | 4 | 單精度浮點數 |
double | 8 | 雙精度浮點數 |
decimal | decimal(M,D) | 定點數 |
DECIMAL(M,D) 高精度的數據類型, 經常使用來存儲交易相關的數據字符串
M
表明總精度, N
表明小數點右側的位數. 1 < M < 254, 0 < N < 60, 存儲空間變長it
類型 | 字節 | 描述 |
---|---|---|
date | 3 | 精確到年月日, 如: 2016-09-01 |
time | 3 | 精確到時分秒, 如: 09:10:11 |
datetime | 8 | 精確到年月日時分秒, 如: 2016-09-01 09:10:11 |
timedtamp | 8 | 精確到年月日時分秒, 如: 2016-09-01 09:10:11 |
MySQL 5.6.4 以後, datetime
和 timestamp
支持到微秒io
timestamp
會根據時區進行轉換, datetime
則不會table
timestamp
存儲範圍: 1970-01-01 00::00:01 ~ 2038-01-19 03:14:07
datetime
的存儲範圍: 1000-01-01 00:00:00 to 9999-12-31 23:59:59
通常使用 timestamp
國際化
如存時間戳使用數字類型 BIGINT
類型 | 大小 | 描述 |
---|---|---|
char | 最大爲255字符 | 存儲定長, 容易形成空間的浪費 |
varchar | 能夠超過255個字符 | 存儲變長,節省存儲空間 |
text | 總大小爲65535字節,約爲64KB | 長文本數據 |
根據 MySQL
版本的不一樣, 類型的大小範圍可能會有改變.
CREATE DATABASE <name>;
DROP DATABASE <name>;
show databases;
use <name>;
CHARSET
ALTER DATABASE <name> DEFAULT CHARACTER SET <char name>;
show create database <name>
CREATE TABLE <name>(`id` INT(11) AUTO_INCREMENT),`name` VARCHAR(64) NOT NULL,...)CHARACTER SET=utf8mb4;
DROP TABLE <name>;
INSERT INTO <name>(filed1, filed2,...) VALUES (value1, value2,...),(value3,value4,...),...;
可同時插入多條記錄
SELECT filed1,filed2,... FROM <name> WHERE <condition>
多表查詢: SELECT t1.id,t1.name,t2.name AS desc FROM t1,t2 WHERE t1.t2_id=t2.id
, 這將會返回兩個表的交集
多表查詢也可以使用聯合查詢, 聯合查詢詳情見後文.
使用 LIKE
能夠模糊查詢, %
來表示任意字符, 如: SELECT * FROM <name> WHERE name LIKE '%oy%';
顯示錶
desc <name>
show create table <name>
show tables;
UPDATE <name> SET <filed1>=value1 WHERE <condition>
ALTER TABLE <name> ADD `filed1` <type>
ALTER TABLE <name> DROP filed1
修改列類型
ALTER TABLE <name> MODIFY filed1 <type>
ALTER TABLE <name> CHANGE `filed1` `filed1` <type>
能夠修改列名修改 CHARSET
CHARSET
ALTER TABLE <name> DEFAULT CHARACTER SET utf8mb4
ALTER TABLE <name> CONVERT TO CHARACTER SET utf8mb4
ALTER TABLE <name> CHANGE filed1 CHARACTER SET utf8mb4
mysqldump -h<address> --port <port> -u<username> -p<password> <datebase name> <table name> > bak.sql
其中 table name
可選
mysql -h<address> --port <port> -u<username> -p<password> <datebase name> < bak.sql
導入數據到指定的數據庫中
假設存在表: user(id, name, email)
和 user_profile(id,uid,avatar)
, 幾種聯合方式以下:
LEFT JOIN
或 LEFT OUTER JOIN
返回的結果包含左表中的全部行, 若左行在右行中匹配, 則在對應的右表中顯示爲 NULL
SELECT * FROM user LEFT JOIN user_profile ON user.id=user_profile.uid
RIGHT JOIN
或 RIGHT OUTER JOIN
返回的結果包含右表中的全部行, 若左行在右行中匹配, 則在對應的左表中顯示爲 NULL
FULL JOIN
或 FULL OUTER JOIN
返回左右兩表中的全部行, 若是右表中某行在左表中沒有匹配, 則結果中對應行右表的部分所有爲 NULL
;
若是左表中某行在右表中沒有匹配, 則結果中對應行左表的部分所有爲空 NULL
.
inner join
是比較運算符, 只返回符合條件的行, 如:
SELECT * FROM user INNER JOIN user_profile ON user.id=user_profile.uid
等同於 SELECT * FROM user,user_profile WHERE user.id=user_profile.uid