MySQL的基礎知識
MySQL常用命令
轉載自:http://blog.csdn.net/chenmeixxl/article/details/75210398
MySQL初步命令
1 MySQL資料庫基礎命令
1.1 建立、檢視資料庫
1.1.1 檢視系統資料庫
SHOW DATABASES
1.1.2 建立使用者資料庫
CREATE DATABASE mytest
1.2 在資料庫中建立表
1.2.1 切換當前資料庫
USE mytest
1.2.2 建立表
CREATE TABLE user
(
id intauto_increment not null primary key,
usernamevarchar(10) not null,
passwordvarchar(10) not null
)
user是表名;id,username和password是列名;int是整形;auto_increment是系統自增;notnull是欄位不允許為空;primary key是主鍵;varchar是字元型別,(10)是限制不超過10個字元。
1.2.3 查看錶資訊
SHOW TABLES
1.3 增刪改查
1.3.1 插入
INSERT INTO user VALUES(1,'Tom','123456')
1.3.2 修改
UPDATE user SET id = 2,username = 'chenmei',password = 123
1.3.3 查詢
SELECT * FROM user
1.3.4 刪除
DELETE FROM user
WHERE id = 1
1.4 刪除資料庫
DROP DATABASE mytest
MySQL命令詳解
用[ ]表示可選項,語法用灰底色,例子用黃底色
2 MySQL資料庫和表
2.1 MySQL資料庫
2.1.1 建立資料庫
語法:
CREATE DATABASE [IF NOT EXISTS] 資料庫名
[選項 …]
選項:
[DEFAULT] CHARACTER SET 字符集
| [DEFAULT] COLLATE 校隊規則名
IF NOT EXISTS:建立資料庫前進行判斷,該資料庫不存在時才執行CREATE DATABASE操作。用此選項可以避免出現數據庫已經存在而在新建的錯誤。
DEFAULT:指定預設值
字符集:指定資料庫採用的字符集
COLLATE:指定字符集的校對規則
【例】建立學生成績資料庫xscj。
CREATE DATABASE IF NOT EXISTS xscj
2.1.2 修改資料庫
語法:
ALTER DATABASE [資料庫名]
選項 …
選項:
[DEFAULT] CHARACTER SET 字符集名
| [DEFAULT] COLLATE 校對規則名
【例】修改學生成績資料庫(xscj)預設字符集和校對規則。
ALTER DATABASE xscj
DEFAULT CHARACTER SET gb2312
DEFAULT COLLATE gb2312_chinese_ci
2.1.3 刪除資料
語法:
DROP DATABASE [IF EXISTS] 資料庫名
IF EXISTS:避免刪除不存在的資料庫時出現錯誤資訊
2.2 MySQL表
2.2.1 建立表
語法:
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] 表名
[([列定義] …| [表索引定義])]
[表選項] [select語句]
TEMPORARY:表示建立臨時表。
IF NOT EXISTS:建立表前判斷該表是否存在,不存在時建立。
【例】在學生成績資料庫(xscj)中也建立一個學生情況表,表名為xs。
CREATE TABLE xs
(
學號 char(6) not nullprimary key,
姓名 char(8) not null,
專業名 char(10) null,
姓別 tinyint(1) not nulldefault 1,
出生日期 date not null,
總學分 tinyint(1) null,
照片 blob(8) null,
備註 text(8) null
)
xs是表名;學號,姓名…等是列名;int是整形; not null是欄位不允許為空;primarykey是主鍵;default 1表示姓名預設值為1。
2.2.2 複製表
語法:
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] 表名
[ ( ) LIKE 已有表名 [ ] ]
| [AS (表示式) ];
LIKE:建立一個與已有表名相同結構的新表,複製表結構,不復製表內容。
AS:複製表內容,但索引和完整性約束是不會複製的。
【例】在mytest資料庫中,用複製的方式建立一個名為user_copy1的表,表結構直接取自user表;另外再建立一個名為user_copy2的表,其結構和資料都取自user表。
(1) 建立表user_copy1表(只複製表結構)
CREATE TABLE user_copy1 LIKE user;
(2) 建立表user_copy2表(複製表結構和資料)
CREATE TABLE user_copy2 AS (SELECT * FROM user)
2.2.3 修改表
語法:
ALTER TABLE 表名
選項…
新增列:ALTER TABLE 表名ADD COLUMN列名型別;
【例】ALTER TABLE user ADDCOLUMN a VARCHAR(30)
修改列名:ALTER TABLE 表名CHANGE 原列名新列名 型別;
【例】ALTER TABLE userCHANGE a b INT
修改表名:ALTER TABLE 原表名RENAME TO新表名;
【例】ALTER TABLEuser_copy1 RENAME TO usera
刪除列:ALTER TABLE 表名DROP COLUMN列名;
【例】ALTER TABLE xsDROP COLUMN 姓名;
2.2.4 刪除表
語法:
DROP TABLE [IF EXISTS] 表名
IF EXISTS:判斷如果該表存在就刪除
【例】DROP TABLE IF EXISTSusera
2.3 MySQL表記錄操作
2.3.1 插入新紀錄
【例】向xs表裡插入一條記錄。
INSERT INTO xs (學號,姓名,性別,出生日期,總學分)
VALUES('081101','王林',1,'1994-02-10','50')
2.3.2 替換舊記錄
REPLACE語句可以在插入資料前將與新記錄衝突的舊記錄刪除,從而使新紀錄能替換舊記錄,正常插入。
REPLACE INTO xs (學號,姓名,性別,出生日期,總學分)
VALUES('081101','王林',1,'1994-02-10','50')
2.3.3 從已有表中插入新紀錄
【例】將user表記錄插入到user1表中。
INSERT INTO user1 SELECT * FROM user
2.3.4 修改記錄
1. 修改單個表語法:
UPDATE 表名
SET 列表 1=expr1 [, 列名 2=expr2 …]
[WHERE 條件]
[ORDER BY …]
【例】將學生表(xs)中的所有學生的總學分都增加10。將姓名為“劉華”的同學備註填寫為“輔修計算機專業”,學號為“081250”
UPDATE xs
SET 總學分 = 總學分+10;
UPDATE xs
SET 學號 = '081250',備註 = '輔修計算機專業'
WHERE 姓名 = '劉華'
2. 修改多個表語法:
UPDATE 表名,表名 …
SET 列名 1 = expr1 [, 列名 2 = 2expr2 …]
[WHERE 條件]
【例】表user和表user2中都有兩個欄位:idint(11)、password varchar(10),其中id為主鍵。當表user中id值與user2中id值相同時,將表user中對應的password值修改為11111111,將表user2中對應的password值改為22222222。
UPDATE user,user2
SET user.password = '11111111',user2.password ='22222222'
WHERE user.id = user2.id
2.3.5 刪除記錄
1. 刪除滿足條件行(單行)語法:
DELETE FROM 表名
[WHERE 條件]
[ORDER BY …]
【例】將user2表中id為2的記錄刪除。
DELETE FROM user2
WHERE id = 2
2. 從多個表中刪除行語法:
DELETE 表名,表名
FROM table_references
[WHERE 條件]
表名,表名是指刪除那些表裡的資料
table_references是指用到了哪些表
【例】刪除user1中id值等於user的id值的所有行和user2中id值等於user的id值的所有行。
DELETE user1,user2
FROM user1,user2,user
WHERE user1.id = user.id AND user2.id = user.id
3. 清除表資料語法:
TRUNCATE TABLE 表名
2.4 資料庫顯示資訊
1. 顯示當前資料庫中所有表的名稱:SHOW TABLES
2. 顯示MySQL中所有資料庫的名稱:SHOW DATABASES
3. 顯示錶中列名:SHOW COLUMNS FROM user
4. 顯示錶索引:SHOW INDEX FROM user
5. 顯示一些系統特定資源的資訊,例如正在執行的執行緒數量:SHOW STATUS
6. 顯示系統變數名稱和值:SHOW VARIABLES
7. 顯示系統中正在執行的所有程序:SHOW PROCESSLIST
8. 顯示當前資料庫中每個表的資訊:SHOW TABLE STATUS
9. 顯示伺服器所支援的不同許可權:SHOW PRIVILEGES
10. 顯示最後一條語句所產生的錯誤:SHOW ERRORS
11. 顯示安裝後的可用儲存引擎和預設引擎:SHOW ENGINES
12. 顯示資料庫中所有儲存過程基本資訊:SHOW PROCEDURE STATUS
13. 顯示某一個儲存過程的詳細資訊:SHOW CREATE PROCEDURE sp_name
14. 查看錶資訊:DESCRIBE 表名
15. 檢視列資訊:DESCRIBE表名列名
3 MySQL查詢和檢視
3.1 MySQL資料庫查詢
3.1.1 SELECT子句
3.1.1.1 選擇指定列
語法:
SELECT* |列名,列名,… FROM 表名
【例】查詢xs表中各個同學的姓名,專業名和總學分
SELECT 姓名,專業名,總學分
FROM xs
3.1.1.2 定義列別名
不允許where子句中使用列別名
語法:
SELECT… 列名 [AS 列別名]
【例】查詢xs表中計算機專業同學的學號,姓名和總學分,結果中各列的標題分別制定為number,name和mark
SELECT 學號 AS number,姓名 AS name,總學分 AS mark
FROM xs
WHERE 專業名 = '計算機'
3.1.1.3 替換查詢結果中的資料
語法:
SELECT列名
CASE
WHEN 條件 1 THEN 表示式1
WHEN 條件 2 THEN 表示式2
…
ELSE 表單式 n
END
FROM 表名
[WHERE條件]
【例】若總學分為空值,替換為“尚未選課”;若總學分小於50,替換為“不及格”;若總學分在50~52之間,替換為合格;若總學分大於52,替換為“優秀”。總學分列的標題更改為“等級”。
select 學號,姓名,
case
when 總學分 is unll then '尚未選課'
when 總學分 < 50 then '不及格'
when 總學分 >= 50 and總學分 <= 52 < then '合格'
else '優秀'
end as 等級
from xs
where 專業名 = '計算機 ';
3.1.1.4 計算列值
語法:
SELECT表示式 …
【例】查詢xs表中學號為081101的學生成績資訊,按120分制重新計算成績。
SELECT 學號,成績 * 1.20 AS 成績120
FROM xs
WHERE 學號 = '081101'
3.1.1.5 消除結果集中的重複行
效能比較慢,不建議用,可以使用groupby
語法:
SLECTDISTINCT|DISTINCTROW 列名 …
【例】用distinct關鍵字消除重複行
SELECTDISTINCT 專業名,總學分
from xs
3.1.1.6 聚合函式
1) COUNT函式
用於統計總行數,返回select語句檢索到的行中非null值的數目,若找不到匹配行,則返回0。
【例】求學生的總人數
SELECT COUNT(*) AS '學生總人數'
FROM xs
2) MAX和MIN
【例】求選修101課程的學生的最高分和最低分
SELECT MAX(總學分),MIN(總學分)
FROM xs
WHERE 課程號 = '101'
3) SUM函式和AVG函式
SUM:求總和;AVG:求平均值(用法同COUNT函式)
4) VARIANCE和STDDEV函式
VARIANCE:方差;STDDEV:標準差(用法同COUNT函式)
3.1.2 FROM子句
3.1.2.1 引用一個表
【例】SELECT * FROM db2.tb;
db2.tb是指資料庫db2下的tb表
3.1.2.2 多表連線
1. 全連線
【例】查詢所有學生選過的課程名和課程號
SELECT DISTINCT kc.課程名,xs.課程號
FROM kc,xs
WHERE kc.課程號 = xs.課程號
2. JOIN連線
1) 內連線:指定INNER關鍵字的連線是內連線
【例】查詢所有學生選過的課程名和課程號
SELECT DISTINCT kc.課程名,xs.課程號
FROM kc
INNER JOIN xs ON kc.課程號 = xs.課程號
2) 外連結:分為左外連結(LEFTJOIN),右外連結(RIGHT JOIN)和自然連線。自然連線又分為自然左外連線(NATURAL LEFT JOIN)和自然右外連結(NATURAL RIGHT JOIN)
【例】左連線,主要查xs表裡的資料,kc表裡不匹配的行的列設定為null
SELECT xs.*,kc.課程號
FROM xs
LEFT JOIN kc ON xs.學號 = kc.學號
【例】右連線,主要查kc表裡的資料,xs表裡不匹配的行的列設定為null
SELECT xs.*,kc.課程號
FROM xs
RIGHT JOIN kc ON xs.學號 = kc.學號
【例】自然連線
SELECT 課程名,課程號
FROM kc
WHERE 課程號 IN
( SELECTDISTINCT 課程號
FROMkc
NATURALRIGHT JOIN xs
)
3) 交叉連線:指定了CROSS JOIN關鍵指定連線是交叉連線
【例】SELECT xs.學號,xs.姓名,kc.課程號,kc.課程名
FROM xsCROSS JOIN kc
3.1.3 WHERE子句
where 子句是用來在from子句之後選擇行。
3.1.3.1 比較運算
MySQL支援的運算子有 =,<,>,<=,>=,<=>(相等或都等於空),<>(不等於),!=(不等於)。
【例】SELECT 姓名,學號,總學分
FROM xs
WHERE 學號 = '081101'
3.1.3.2 模式匹配
1. LIKE運算子:用LIKE匹配時,常用特殊符號_和%進行模糊查詢。%代表0個或多個字元,_代表單個字元。
【例】查詢xs表中,學號倒數第二個數字為0的學生的學號,姓名及專業名。
SELECT 學號,姓名,專業名
FROM xs
WHERE 學號 LIKE '%0_'
如果想要查詢特殊符號的一個或全部(_和%),必須使用一個轉義字元。
【例】查詢xs表中名字包含下劃線的學生學號和姓名。
SELECT 學號,姓名
FROM xs
WHERE 學號 LIKE '%#_%'ESCAPE '#'
2. REGEXP運算子:用來執行更復雜的字串比較運算。
【例】查詢行李的同學的學號,姓名和專業名
SELECT 學號,姓名,專業名
FROM xs
WHERE 姓名 REGEXP '^李'
1) ^ :匹配字串的開始部分
2) [abc]:匹配方括號裡出現的字串abc
3) .:匹配任何一個字元(包括回車和新行)
4) *:匹配星號之前的0個或多個字元任何序列
3.1.3.3 範圍比較
用於範圍比較的關鍵字有兩個:BETWEEN和IN。IN關鍵字最主要的作用是表單子查詢。
【例】查詢xs表中不在1993年出生的學生情況。
SELECT 學號,姓名,專業名,出生日期
FROM xs
WHERE 出生日期 NOT BETWEEN'1993-1-1' AND '199312-31'
【例】查詢xs表中專業名為“計算機”,“通訊工程”或“無線電”的學生的情況。
SELECT *
FROM xs
WHERE 專業名 IN ('計算機','通訊工程','無線電')
上面的IN語句等價於下面的OR語句
SELECT *
FROM xs
WHERE 專業名 = '計算機' OR 專業名 = '通訊工程' OR 專業名 = '無線電'
3.1.3.4 空值比較
當需要判定一個表示式的值是否為空值時,使用ISNULL關鍵字為空;NOT NULL不為空,格式為
表示式 IS [NOT] NULL
【例】查詢總學分不確定的學生情況。
SELECT *
FROM xs
WHERE 總學分 IS NULL
3.1.3.5 子查詢
1) IN子查詢
IN子查詢用於進行一個給定值是否在子查詢結果集中的判斷。格式為:
表示式 [NOT] IN (子查詢)
【例】查詢選修了課程號為206的課程的學生的姓名,學號。
SELECT 姓名,學號
FROM xs
WHERE 學號 IN
(
SELECT學號
FROMxs_kc
WHERE課程號 = '206'
)
2) 比較子查詢
這種子查詢可以認為是IN子查詢的擴充套件,它使表示式的值與子查詢的結果進行比較運算,格式如下:
表示式{<|<=|=|>|>=|!=|<>} {ALL|SOME|NAY} (子查詢)
ALL是與子查詢結果集裡的每一個值進行比較,都滿足時返回true,否則false。
SOME和NAY是同義詞,表示只要與子查詢結果集裡某個值滿足比較關係就返回true,否則false。
【例】查詢xs表中比所有計算機系的學生年齡都大的學生學號,姓名,出生日期。
SELECT 學號,姓名,出生日期
FROM xs
WHERE 出生日期 < ALL
(
SELECT出生日期
FROMxs
WHERE專業名 = '計算機'
)
3) EXISTS子查詢
用於測試子查詢的結果是否為空表,若子查詢的結果不為空返回true,否則false。EXISTS與NOT結合使用,其返回值剛好相反。
[NOT] EXISTS (子查詢)
【例】查詢選修206號課程的學生姓名。
SELECT 姓名
FROM xs
WHERE EXISTS
(
SELECT*
FROMxs_kc
WHERE學號 = xs.學號 AND 課程號 = '206'
)
子查詢還可以用在FROM子句中,但必須為子查詢產生的中間表定義一個別名。SELECT關鍵字後面也可用子查詢,在WHERE子句中還可以將一行資料與子查詢中的結果通過比較運算進行比較。
【例】FROM子句
select 姓名,學號,總學分
from( select <