1. 程式人生 > >MySQL的基礎知識

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 <