首頁  >  文章  >  資料庫  >  具體介紹MySql經常使用語句的全面總結

具體介紹MySql經常使用語句的全面總結

黄舟
黄舟原創
2017-03-21 13:24:04960瀏覽

下面小編就為大家帶來一篇對MySql經常使用語句的全面總結(必看篇)。小編的挺不錯的,現在就分享給大家,也給大家做個參考。一起跟著小編過來看看吧

下面總結的知識點全是常用的,全都是乾貨,好好收藏吧。

/* 啟動MySQL */

net start mysql

/* 連線與中斷伺服器*/

mysql -h 位址-P 連接埠-u 使用者名稱-p 密碼

#/* 跳過權限驗證登入MySQL */

#mysqld --skip-grant-tables
-- 修改root密碼
密碼加密函數password()
update mysql.user set password=password('root');

SHOW PROCESSLIST -- 顯示哪些執行緒正在執行
SHOW VARIABLES --

#/* 資料庫操作*/ ------------------

#-- 查看目前資料庫
    select database();
-- 顯示目前時間、使用者名稱、資料庫版本
    select now(), user(), version();
---- 建立庫
create database[ if not exists] 資料庫名稱資料庫選項
    資料庫選項:
        CHARACTER SET charset_name
   'pattern']
-- 查看目前庫資訊
    show create database 資料庫名稱
-- 修改庫的選項資訊
    alter database 庫名選項資訊
--
刪除
#庫    drop database[ if exists] 資料庫名稱        以相關資料庫相關的目錄及其目錄內容

/* 表的操作*/ --- ---------------
-- 建立表格

    create [temporary] table[ if not exists] [庫名.]表名( 表的結構定義)[

表選項
]        每個欄位必須為資料型別
        最後一個欄位後無法有  臨時表,會話結束時表自動消失

對於欄位的定義:

欄位名稱資料類型[NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT] [ UNIQUE [KEY] | [PRIMARY] KEY] [COMMENT 'string']

#

-- 表選項
    -- 字元集
        CHARSET = charset_name
        如果表未設定,則使用資料庫表在管理資料時所採用的不同的資料結構,結構不同會導致處理方式、提供的特性操作等不同
        常見的引擎:InnoDB MyISAM Memory/Heap BDB Merge Example CSV MaxDBive#>  儲存表的結構和資料時採用不同的方式
        MyISAM表檔案意義:.frm表定義,.MYD表資料,.MYI表索引
        InnoDB表檔案意義:.frm表定義,表空間資料與資料表定義,表空間資料與日誌檔案
        SHOW ENGINES -- 顯示儲存引擎的狀態資訊
        SHOW ENGINE 引擎名稱{LOGS|STATUS} -- # = '目錄'
    -- 索引檔案目錄
        INDEX DIRECTORY = '目錄'
    -- 表註釋
      . (詳細請見手冊)
-- 查看所有表格
    SHOW TABLES[ LIKE 'pattern']
    SHOW TABLES FROM 表名
-- 檢視表機構
    SHOW CREATE TABLE 表名
-- 檢視表機構
    SHOWOW CREATE T資訊更詳細)
    DESC 表名/ DESCRIBE 表名/ EXPLAIN 表名/ SHOW COLUMNS FROM 表名[LIKE 'PATTERN']
    SHOW TABLE STATUS [FROM db_name] [LIKE 'pattern']##- -
修改表

    -- 修改表本身的選項
        ALTER TABLE 表名表的選項
        EG  命名
        RENAME TABLE 原始表名TO 新表名
        RENAME TABLE 原始表名TO 庫名.表名##    -- 修改表的欄位機構        ALTER TABLE 表格名稱作業的欄位機構        ALTER TABLE 表格名稱作業名稱
        -- 作業名稱
                   AFTER 字段名稱            -- 表示增加在該欄位名後面
                FIRST              鍵
            ADD UNIQUE [索引名稱] (欄位名稱)-- 建立唯一索引
ADD INDEX [索引名] (字段名)    -- 建立普通索引
            ADD
              MODIFY[ COLUMN] 欄位名字段
屬性
        - - 支援將欄位屬性修改,無法修改欄位名稱(所有原有屬性也需寫上)
            CHANGE[ COLUMN] 原欄位名稱新欄位名稱屬性     -- 刪除主鍵(刪除主鍵前需刪除其AUTO_INCREMENT屬性)
DROP INDEX 索引名    -- 刪除索引
            DROP FOREIGN KEY 外鍵    -- 刪除外鍵

-- 刪除表名表名表清空表資料
    TRUNCATE [TABLE] 表名
-- 複製表結構
    CREATE TABLE 表格名稱LIKE 要複製的表名
-- 複製表結構與資料
    CREATE TABLE 表格名稱
-- 複製表結構與資料
    CREATE TABLE 表格名稱
-- 複製表結構與資料
   [AS] SELECT * FROM 要複製的表名
-- 檢查表是否有錯誤
    CHECK TABLE tbl_name [, tbl_name] ... [option] ...
-- 最佳化表
OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ...
-- 修復表
    REPAIR [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ... [QEND ##-- 分析表

    ANALYZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ...

## 

/* 資料操作*/ -- ------------------

-- 增加
    INSERT [INTO] 表名[(欄位清單)] VALUES (值列表)[, (值清單), ...]
        -- 若要插入的值清單包含所有欄位且順序一致,則可省略欄位清單。
        -- 可同時插入多筆資料記錄!
        REPLACE 與 INSERT 完全一樣,可互換。
    INSERT [INTO] 表名SET 欄位名稱=值[, 欄位名稱=值, ...]
-- 勾選
    SELECT 欄位清單FROM 表格名稱[ 其他子句]
    可來自多個表的多個欄位
        -- 其他子句可以不使用
        -- 欄位清單可用*代替,表示所有欄位
--    ##DELETETE # FROM 表名[ 刪除條件子句]
        沒有條件子句,則會刪除全部-- 改    UPDATE 表名SET 欄位名稱=新值[, 欄位名稱=新值] [
更新
條件]

/* 字元集編碼*/ ------------------

-- MySQL、資料庫、表格、欄位皆可設定編碼

-- 資料編碼與客戶端編碼不需一致

SHOW VARIABLES LIKE 'character_set_%' -- 檢視所有字元集編碼項目

    character_set_client        客戶端傳送資料時所使用的編碼

    character_set_results   層編碼


SET
變數名稱
= 變數值

    set character_set_client = gbk;    set character_set_results = gbk;    set character_set_results = gbk;

  於完成上述三個設定


-- 校對集

    校對集合使用排序

    SHOW CHARACTER SET [LIKE 'pattern']/SHOW CHARSET [LIKE 'pattern  檢視所有字符集

    SHOW COLLATION [LIKE 'pattern']        查看所有校對集

    charset 字符集編碼       

# #/* 資料型別(列型別) */ ------------------



#1. 數值型別

-- a. 整數---------

類型            位元組        範圍(有符號位元)
    tinyint        110 字節 1201875  #    smallint    2位元組    -32768 ~ 32767
    mediumint    3位元組    -8388608 ~ 8388607
    int            4位元組
    bigint       
##- 顯示寬度,如果某個數字不夠定義字段時設定的位數,則前面以0補填,zerofill 屬性修改

例:int(5)    插入一個數'123',補填後為'00123'

- 在滿足要求的情況下,越小越好。

- 1表示bool值真,0表示bool值假。 MySQL沒有布林類型,透過整數0和1表示。常用tinyint(1)表示布林型。

-- b. 浮點類型----------

類型                位元組     # #float(單一精確度)        4位元組#double(雙精確度)    8位元組浮點型既支援符號位元unsigned 屬性,也支援顯示寬度zerofill 屬性。

不同於整數,前後皆會補填0.

定義浮點型時,需指定總位數和小數位數。

float(M, D)        double(M, D)

M表示總位數,D表示小數位數。

M和D的大小會決定浮點數的範圍。不同於整型的固定範圍。

M既表示總位數(不包括小數點和正負號),也表示顯示寬度(所有顯示符號均包含)。

支援科學計數法表示。

浮點數表示近似值。

-- c. 定點數----------

#decimal    -- 可變長度

#decimal(M, D)    M也表示總位數,D表示小數位數。 保存一個精確的數值,不會發生資料的改變,不同於浮點數的四捨五入。 將浮點數轉換為

字串

來保存,每9位數字儲存為4個位元組。

2. 字串型別

-- a. char, varchar ----------

char    定長字串,速度快,但浪費空間varchar    變長字串,速度慢,但節省空間M表示能儲存的最大長度,此長度是字符數,非位元組數。

不同的編碼,所佔用的空間不同。

char,最多255個字符,與編碼無關。

varchar,最多65535字符,與編碼有關。

一筆有效記錄最大不能超過65535個位元組。

utf8 最大為21844個字符,gbk 最大為32766個字符,latin1 最大為65532個字符

varchar 是變長的,需要利用存儲空間保存varchar 的長度,如果數據小於255個位元組,則採用一個位元組來保存長度,反之需要兩個位元組來保存。

varchar 的最大有效長度由最大行大小和使用的字元集決定。

最大有效長度是65532字節,因為在varchar存字串時,第一個位元組是空的,不存在任何數據,然後還需兩個位元組來存放字串的長度,所以有效長度是64432-1-2=65532位元組。

例:若一個表定義為 CREATE TABLE tb(c1 int, c2 char(30), c3 varchar(N)) charset=utf8; 問N的最大值是多少? 答:(65535-1-2-4-30*3)/3

#-- b. blob, text ----------

#blob 二進位字串(位元組字串)

tinyblob, blob, mediumblob, longblobtext 非二進位字串(字元字串) tinytext, text, mediumtext, longtext

text 在定義時,不需要定義長度,也不會計算總長度。

text 類型在定義時,不可給default值

--

c. binary, varbinary ----------

#類似於char和varchar,用來保存二進位字串,也就是保存位元組字串而非字元字串。

char, varchar, text 對應binary, varbinary, blob.3. 日期時間型別

一般用整型儲存

時間戳記

,因為PHP可以很方便的將時間戳記進行格式化。

datetime    8位元組    日期及時間        1000-01-01 00:00:00 到9999-12-31 23:59:5910:00 至9999-12-31        1000-01-01 到9999- 12-31

timestamp    4位元組   時間戳        19700101000000 到2038-01-19 03:14:07

time          -838:59:59 至838:59:59

year        1字元hh:mm:ss”

            “YYYYMMDDhhmmss”

            “YYMMDDhhmmss”

            YYYYMMDDhhmmss
            YYMMDDhhmmss
date        “YYYY-MM-DD”
            “YY-MM-DD”
            “YYYYMMDD”
            “ YYMMDD」
            YYYYMMDD
            YYMMDD
time              hhmmss
year       「YYYY」
          #            YY



#4. 列舉與集合




--

枚舉(enum) ----- -----

enum(val1, val2, val3...)

在已知的值中進行單選。最大數量為65535.枚舉值在儲存時,以2個位元組的整數(smallint)儲存。每個枚舉值,依保存的位置順序,從1開始逐一遞增。

表現為字串型,儲存卻是整數型。

NULL值的索引是NULL。

空字串錯誤值的索引值是0。

-- 集合(設定) ----------

#set(val1, val2, val3 ...)create table tab ( gender set('男', '女', '無') );
insert into tab values ('男, 女');

最多可以有64個不同的成員。以bigint存儲,共8個位元組。採取

位元運算

的形式。

當建立表格時,SET成員值的尾部空格會自動被刪除。

/* 選擇類型*/

-- PHP角度1. 功能滿足2. 儲存空間盡量小,處理效率更高

3. 考慮相容問題


-- IP儲存----------


1. 只需存儲,可用字串

2. 若需計算,查找等,可儲存為4個位元組的無符號int,即unsigned#1)

PHP函數

轉換

ip2long可轉換為整數,但會出現攜帶符號問題。需格式化為無符號的整數。

利用sprintf函數格式化字串sprintf("%u", ip2long('192.168.3.134'));

然後用long2ip將整數轉回IP字串

2) MySQL函數轉換(無符號整數,UNSIGNED)

INET_ATON('127.0.0.1') 將IP轉為整數

INET_NTOA(2130706433) 將整數轉換為IP

       

/* 列屬性(列

約束
#) */ -------- ----------

1. 主鍵

#- 能唯一標識記錄的字段,可以作為主鍵。 - 一個表只能有一個主鍵。 - 主鍵具有唯一性。
- 宣告欄位時,以 primary key 標識。
  也可以在欄位清單之後宣告

範例:create table tab ( id int, stu varchar(10), primary key (id));
- 主鍵欄位的值不能為null。
- 主鍵可以由多個欄位共同組成。此時需要在欄位清單後聲明的方法。
範例:create table tab ( id int, stu varchar(10), age int, primary key (stu, age));

2. unique 唯一索引(唯一約束)

使得某欄位的值也不能重複。

3. null 約束

#    null不是資料類型,是資料列的屬性。
    表示目前欄位是否可以為null,表示什麼都沒有。
    null, 允許為空。預設.
    not null, 不允許為空。
    insert into 片

#4. default 預設值屬性

目前欄位的預設值。 insert into tab values (default, 'val');    -- 此時表示強制使用預設值

create table tab ( add_time timestamp default current_timestamp );
-- 表示將目前時間的時間戳設為預設值。 current_date, current_time


5. auto_increment 自動成長限制因素

##自動成長必須為索引(主鍵或unique)只能存在一個欄位為自動增長。

預設為1開始自動成長。可以通過表屬性auto_increment = x進行設置,或alter table tbl auto_increment = x;

6. comment 註釋

例:create table tab ( id int ) comment '註解內容';

7. foreign key 外鍵約束

##用於限制主表與從表資料完整性。 alter table t1 add constraint `t1_t2_fk` foreign key (t1_id) references t2(id);-- 將表t1的t1_id外鍵關聯到表t2的id欄位。 -- 每個外鍵都有一個名字,可以透過constraint 指定

存在外鍵的表,稱為從表(子表),外鍵指向的表,稱為主表(父表)。

作用:保持資料一致性,完整性,主要目的是控制儲存在外鍵表(從表)中的資料。在

MySQL中,可以對InnoDB引擎使用外鍵約束:

語法:

foreign key (外鍵欄位) references 主表名(關聯欄位) [主表記錄刪除時的動作] [主表記錄更新時的動作]

此時需要檢測一個從表的外鍵需要約束為主表的已存在的值。外鍵在沒有關聯的情況下,可以設定為null.前提是該外鍵列,沒有not null。 可以不指定主表記錄更改或更新時的動作,那麼此時主表的操作被拒絕。

如果指定了on update 或on delete:在刪除或更新時,有以下幾個操作可以選擇:

1. cascade ,級聯操作。主表資料被更新(主鍵值更新),從表也被更新(外鍵值更新)。主表記錄被刪除,從表相關記錄也被刪除。 2. set null,設定為null。主表資料被更新(主鍵值更新),從表的外鍵被設定為null。主表記錄被刪除,從表相關記錄外鍵被設定成null。但注意,要求該外鍵列,沒有not null屬性約束。 3. restrict,拒絕父表刪除和更新。

注意,外鍵只會被InnoDB儲存引擎所支援。其他引擎是不支援的。

/* 建表規格 */ ------------------

#

-- Normal Format, NF
        - 每個表保存一個實體資訊
        - 每個以ID欄位為主鍵
      #第一範式
        欄位無法再分,就符合第一個範式。     -- 2NF,
第二範式
        滿足第一範式的前提下,部分依賴不能出現。         消除符合主鍵可避免部分依賴。增加單列關鍵字。
    -- 3NF,
第三範式
        滿足第二範式的前提下,就無法出現傳遞依賴。         某個欄位依賴主鍵,而有其他欄位則依賴於該欄位。這就是傳遞依賴。
        將一個實體資訊的資料放在一個表內實作。

/* select */ ------------------#select [all |distinct] select_expr from -> where -> group by [合計函數] -> having -> order by -> limit

#a. select_expr
-- 可以用* 表示所有欄位。

        select * from tb;

    -- 可以使用
表達式
(計算公式、函數呼叫、欄位也是個表達式)        select stu, 29)5, now( from tb;    -- 可為每個欄位使用別名。適用於簡化列標識,避免多個列標識符重複。
        - 使用as 關鍵字,也可省略as.
        select stu+10 as add10 from tb;

b. from 子句
用於標識

查詢

來源。     -- 可為錶起別名。使用as關鍵字。         select * from tb1 as tt, tb2 as bb;
    -- from子句後,可同時出現多個表格。
        -- 多個表格會橫向疊加在一起,而資料會形成一個笛卡爾積。
        select * from tb1, tb2;

c. where 子句
-- 從from取得的資料來源中進行篩選。

    -- 整數1表示真,0表示假。

    -- 表達式由
運算子
和運算陣列成。         -- 運算子:變數(欄位)、值、函數傳回值        -- 運算子:
        ;, >=, >, !, &&, ||,
            in (not) null, (not) like, (not) in, (not) between and, is (not), and, or, not, xor
            is/is not          is/is not ”


d. group by 子句, 分組子句


group by 欄位/別名[排序方式]
    分組後會進行排序。升序:ASC,降序:DESC

   

    以下[合計函數]需搭配group by 使用:
   
count
# 傳回不同的非NULL值數目    count(*)、count
# 傳回不同的非NULL值數目    count(*)、count# 傳回不同的非NULL值數目    count(*)、count()
    sum 求和
    max 求最大值
    min 求最小值
    avg 求平均值
    group_concat 傳回具有來自一組的連接的非NULL值的字串結果。群組內字串連線

e. having 子句,條件子句

#

與 where 功能、用法相同,執行時機不同。
    where 在開始時執行偵測數據,並過濾原始資料。
    having 篩選出的結果再次進行過濾。
    having 欄位必須是查詢出來的,where 欄位必須是存在資料表的。
    where 不可以使用欄位的別名,having 可以。因為執行WHERE程式碼時,可能尚未確定列值。
    where 不可以使用總和函數。一般需用總和函數才會用 having
    SQL標準要求HAVING必須引用GROUP BY子句中的欄位或用於總和函數中的欄位。

f. order by 子句,排序子句

#order by 排序欄位/別名排序方式[,排序欄位/別名排序方式]...
    升序:ASC,降序:DESC
    支援多個欄位的排序。

g. limit 子句,限制結果數子句

#只對處理好的結果進行數量限制。將處理好的結果的看作是一個集合,依照記錄出現的順序,索引從0開始。
    limit 起始位置, 取得條數
    省略第一個參數,表示從索引0開始。 limit 取得條數

h. distinct, all 選項

distinct 移除重複記錄
    預設為all, 全部記錄

/* UNION */ ------------------

#將多個select查詢的結果組合成一個結果集合。
    SELECT ... UNION [ALL|DISTINCT] SELECT ...
    預設 DISTINCT 方式,即所有回傳的行都是唯一的
    建議,對每個SELECT查詢加上小號括號。
    ORDER BY 排序時,需加上 LIMIT 進行結合。
    需要各select查詢的欄位數量一樣。
    每個select查詢的欄位清單(數量、類型)應一致,因為結果中的欄位名稱以第一個select語句為準。

/* 子查詢*/ ------------------

#- 子查詢需用括號包裹。

-- from型

from後面要求是一個表,必須給子查詢結果取一個別名。
    - 簡化每個查詢內的條件。
    - from型需將結果產生一個臨時表格,可用以原表的鎖定的釋放。
    - 子查詢傳回一個表,表型子查詢。
    select * from (select * from tb where id>0) as subfrom where id>1;

-- where型






# #- 子查詢傳回一個值,標量子查詢。
    - 不需要給子查詢取別名。

    - where子查詢內的表,不能直接用以更新。

    select * from tb where money = (select max(money) from tb);



-- 列子查詢

#如果子查詢結果傳回的是一列。
        使用 in 或 not in 完成詢問
        exists 與 not exists 條件

          常用於判斷條件。

            select column1 from t1 where exists (select * from t2);


-- 行子查詢




查詢條件是一個行。
        select * from t1 where (id, gender) in (select id, gender from t2);

        行建構子:(col1, col2, ...) 或ROW(col1, col2, ...)

        行建構子通常用於與對能傳回兩個或兩個以上列的子查詢進行比較。
    -- 特殊運算子    != all()    相當於 not in
    = some()    相當於 in。 any 是 some 的別名
    != some()    不等同於 not in,且不等於其中某一個。
    all, some 可以搭配其他運算子一起使用。

############/* 連線查詢(join) */ ------------------######### ####

將多個表的欄位進行連接,可以指定連接條件。
-- 內連接(inner join)
    - 預設為內連接,可省略inner。
    - 只有在資料存在時才能傳送連線。即連接結果不能出現空白行。
    on 表示連線條件。其條件表達式與where類似。也可以省略條件(表示條件永遠為真)
    也可用where表示連結條件。
    還有 using, 但需欄位名稱相同。 using(字段名)

    -- 交叉連接 cross join
        即,並無條件的內連結。
        select * from tb1 cross join tb2;
-- 外連結(outer join)
    - 若資料不存在,也會出現在連結結果中。
    -- 左外連接left join
        若資料不存在,且左表記錄會出現,而右表為null填入
    -- 右外連接 right join#o 記錄會出現,而左表為null填入
-- 自然連結(natural join)
    自動判斷連結條件完成連結。
    相當於省略了using,會自動尋找相同欄位名稱。
    natural join
    natural left join
    natural right join

select info.id, info.name, info.stu_num, extra_info.ho, info.com stu_num = extra_info.stu_id;

/* 導入導出*/ ------------------

select * into out

file 檔案位址[控制格式] from 表名;    -- 匯出表格資料load data [local] infile 檔案位址[replace|ignore] into table 表名[控制格式];    -- 匯入資料
    產生的資料預設的分隔符號是製表符
    local未指定,則資料檔案必須在伺服器上
    replace 和ignore 關鍵字控制對現有的唯一鍵記錄的重複的處理
-- 控制格式

fields    控製字段格式
預設:fields terminated by '\t' enclosed by '' escaped by '\\'
    terminated by 'string'    -- 終止
    enclosed by 'char'        -- 
        SELECT a,b,a+b INTO OUTFILE '/tmp/result.text'
        FIELDS TERMIN        FROM test_table ;



lines    控制列格式

預設:lines terminated by '\n'    terminated by 'string'    -- 終止
   

/* insert */ ------------------


select語句所獲得的資料可以用insert插入。
可以省略對列的指定,要求 values () 括號內,提供給了按照列順序出現的所有欄位的值。
    或使用set文法。

    insert into tbl_name set field=value,...;

可以一次使用多個值,採用(), (), ();的形式。

    insert into tbl_name values (), (), ();

可以在列值指定時,使用表達式。

    insert into tbl_name values (field_value, 10+10, now());

可以使用一個特殊值 default,表示該欄位使用預設值。
    insert into tbl_name values (field_value, default);

可以透過一個查詢的結果,作為需要插入的值。
    insert into tbl_name select ...;

可以指定在插入的值出現主鍵(或唯一索引)衝突時,更新其他非主鍵列的資訊。

    insert into tbl_name values/set/select on duplicate key update 欄位=值, …;


/* delete */ ------------ ------

DELETE FROM tbl_name [WHERE where_definition] [ORDER BY ...] [LIMIT row_count]
#依條件刪除

指定刪除的最多記錄數。 Limit

可以透過排序條件刪除。 order by + limit

支援多表刪除,使用類似連線語法。
delete from 需要刪除資料多表1,表2 using 表連線操作 條件。

/* truncate */ ------------------

# TRUNCATE [TABLE] tbl_name
清空資料
刪除重建表

#區別:

##1,truncate 是刪除表再創建,delete 是逐條刪除

2,truncate 重置auto_increment的值。而delete不會

3,truncate 不知道刪除了幾條,而delete知道。

4,當用於有分割區的資料表時,truncate 會保留分割區


/* 備份與還原*/ ------ ------------

備份,將資料的結構與表內資料保存。

利用 mysqldump 指令完成。

-- 匯出

1. 匯出一張表

  mysqldump -u用戶名-p密碼庫名表名> 檔名(D :/a.sql)
2. 匯出多張表
  mysqldump -u用戶名-p密碼庫名表1 表2 表3 > 檔名(D:/a.sql)
3.匯出所有表格
  mysqldump -u使用者名稱-p密碼庫名稱> 檔案名稱(D:/a.sql)
4. 匯出一個函式庫
  mysqldump -u使用者名稱-p密碼-B 庫名> 檔名(D:/a.sql)

可以-w攜帶備份條件

#-- 導入

1 . 在登入mysql的情況下:

  source  備份檔案

2. 在不登入的情況下

  mysql -u使用者名稱-p密碼庫名稱< 備份檔案

/*
檢視 */ ------------------

#什麼是檢視:

檢視是一個虛擬表,其內容由查詢定義。同真實的表一樣,視圖包含一系列帶有名稱的列和行資料。但是,視圖並不在資料庫中以儲存的資料值集形式存在。行和列資料來自由定義視圖的查詢所引用的表,並且在引用視圖時動態產生。


檢視具有表格結構文件,但不存在資料檔案。


對其中所引用的基礎表來說,視圖的作用類似於篩選。定義視圖的篩選可以來自目前或

其它資料庫的一個或多個表,或者其它視圖。透過視圖進行查詢沒有任何限制,透過它們進行資料修改時的限制也很少。

視圖是儲存在資料庫中的查詢的sql語句,它主要出於兩種原因:

安全性原因,視圖可以隱藏一些數據,如:社會保險基金表,可以用視圖只顯示姓名,地址,而不顯示社會保險號碼和工資數等,另一個原因是可使複雜的查詢易於理解和使用。

-- 建立視圖

CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] VIEW view_name [(column_list)] AS select_statement

    - 視圖名必須唯一,同時不能與表重名。
    - 檢視可以使用select語句查詢到的列名,也可以自行指定對應的列名。
    - 可以指定視圖執行的演算法,透過ALGORITHM指定。
    - column_list如果存在,則數目必須等於SELECT語句檢索的列數

-- 查看結構

SHOW CREATE VIEW view_name

-- 刪除視圖

- 刪除視圖後,資料仍然存在。


- 可同時刪除多個視圖。

    DROP VIEW [IF EXISTS] view_name ...

-- 修改視圖結構
##- 一般不會修改視圖,因為不是所有的更新視圖都會映射到表上。

    ALTER VIEW view_name [(column_list)] AS select_statement


-- 檢視功能


1.簡化業務邏輯

 2. 對客戶端隱藏真實的表結構


-- 視圖演算法(ALGORITHM)
##MERGE        合併
            合併

      ,與外部查詢需要先合併再執行!

    TEMPTABLE    臨時表
        將檢視執行完畢後,並形成臨時表,然後再做外層查詢!
    UNDEFINED    未定義(預設),指的是MySQL自主化對應的演算法。

 

/* 事務(transaction) */ ----------------- -

事務是指邏輯上的一組操作,組成這組操作的各個單元,要不全成功要不全失敗。
    - 支援連續SQL的集體成功或集體撤銷。
    - 事務是資料庫在資料晚自習方面的功能。
    - 需要利用 InnoDB 或 BDB 儲存引擎,以自動提交的特性支援完成。
    - InnoDB稱為事務安全型引擎。

-- 事務開啟
    START TRANSACTION; 或 BEGIN;
    開啟事務後,所有執行的SQL語句都被認定為目前事務內的SQL語句。
-- 事務提交
    COMMIT;
-- 事務回溯
    ROLLBACK;
    若部分作業發生問題,對應至事務開啟前。

-- 事務的特性
    1. 原子性(Atomicity)
        事務是不可分割的工作單位,事務中的操作要麼都發生,要麼都發生,要麼都不會發生。
    2. 一致性(Consistency)
        事務前後資料的完整性必須一致。
        - 事務開始與結束時,外部資料一致
        - 在整個事務過程中,操作是連續的
    3. 隔離性(I 的事務不能被其它使用者的事物所干擾,多個並發事務之間的資料要相互隔離。
    4. 持久性(Durability)
        一個事務一旦被提交,它對資料庫中的資料變更就是永久性的。

-- 事務的實現

    1. 要求是事務支援的表格類型
    2. 執行一組相關的作業前開啟事務
    3. 整組作業完成後,皆成功,則提交;如果有失敗,選擇回滾,則會回到交易開始的備份點。

-- 事務的原則

    利用InnoDB的自動提交(autocommit)特性完成。
    普通的MySQL執行語句後,目前的資料提交操作皆可被其他客戶端可見。
    而事務是暫時關閉「自動提交」機制,需要commit提交持久化資料操作。

-- 注意

    1. 資料定義語言(D
DL)語句不能被回滾,例如建立或取消資料庫的語句,和建立、取消或變更表或儲存的子程序的語句。     2. 交易不能被巢狀

-- 保存點

    SAVEPOINT 保存點名稱-- 設定一個交易保存點
    ROLLBACK TO SAVEPOINT 保存點名稱-- 回滾到保存點
    RELEASE SAVEPOINT 保存點名稱-- 刪除保存點

#-- InnoDB自動提交特性設定

    SET autocommit = 0|1;    0表示關閉自動提交,1表示開啟自動提交。
    - 如果關閉了,那麼普通作業的結果對其他用戶端也不可見,需要commit提交後才能持久化資料操作。
    - 也可以關閉自動提交開啟事務。但與START TRANSACTION不同的是,
        SET autocommit是永久改變伺服器的設置,直到下次再修改設定。 (針對目前連線)
        而START TRANSACTION記錄開啟前的狀態,而一旦事務提交或回滾後就需要再次開啟事務。 (針對目前事務)

/* 鎖定表*/
表鎖定只用於防止其它客戶端進行不正當地讀取和寫入
MyISAM 支援表鎖,InnoDB 支持行鎖
-- 鎖定
    LOCK TABLES tbl_name [AS alias]
-- 解鎖
    UNLOCK TABLES

/* 觸發器*/ ------ ------------
    觸發程序是與表格相關的命名資料庫對象,當表格出現特定事件時,將啟動該對象
    監聽:記錄的增加、修改、刪除。

-- 建立觸發器
CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_stmt
    參數:
    trigger_time是觸發程式的動作時間。它可以是 before 或 after,以指明觸發程序是在啟動它的語句之前或之後觸發。
    trigger_event指明了啟動觸發程序的語句的類型
        INSERT:將新行插入表時啟動觸發程序
         時啟動觸發程序
    tbl_name:監聽的表,必須是永久性的表,不能將觸發程序與TEMPORARY表或視圖關聯起來。
    trigger_stmt:觸發程式啟動時執行的語句。執行多個語句,可使用BEGIN...END複合語句結構

-- 刪除

DROP TRIGGER [schema_name.]trigger_name

可以使用old和new來取代舊的和新的資料

    更新作業,更新前是old,更新後是new.
    刪除作業,只有old.
    增加操作,只有new.

-- 注意

    1.對於具有相同觸發程序動作時間和事件的給定表,不能有兩個觸發程序。

-- 字元連接函數
concat(str1[, str2,...])

-- 分支語句

if 條件then
    執行語句
elseif 條件then
    執行語句
else
    執行語句
end if;

-- 修改最外層語句結束符號

delimiter 自訂結束符號
    SQL語句
自訂結束符號

delimiter ;        -- 修改原來的分號

-- 語句區塊包裹

#begin
    語句區塊
#-- 語句區塊包
end

-- 特殊的執行
1. 只要新增記錄,就會觸發程式。
2. Insert into on duplicate key update 語法會觸發:
    如果沒有重複記錄,會觸發before insert, after insert;
    如果有重複記錄並更新,會觸發before insert, before update,   如果有重複記錄並更新,會觸發before insert, before update, after update;
    如果有重複記錄但是沒有發生更新,則觸發before insert, before update
3. Replace 語法如果有記錄,則執行before insert, before delete, after delete, after insert


/* SQL程式設計 */ ------------------

--// 局部變數---- ------
-- 變數宣告
    declare var_name[,...] type [default value]
    這個語句被用來宣告局部變數。若要提供變數預設值,請包含一個default子句。值可以被指定為一個表達式,不需要為一個常數。如果沒有default子句,初始值為null。

-- 賦值
    使用 set 和 select into 語句為變數賦值。

    - 注意:在函數內是可以使用全域變數(使用者自訂的變數)


--// 全域變數----------
-- 定義、賦值
set 語句可以定義並為變數賦值。
set @var = value;
也可以使用select into語句為變數初始化並賦值。這樣要求select語句只能傳回一行,但是可以是多個字段,就意味著同時為多個變數進行賦值,變數的數量需要與查詢的列數一致。
還可以把賦值語句看作一個表達式,透過select執行完成。此時為了避免=被當作關係運算子看待,使用:=代替。 (set語句可以使用= 和 :=)。
select @var:=20;
select @v1:=id, @v2=name from t1 limit 1;
select * from tbl_name where @var:=30;

select into 可以將表中查詢所獲得的資料賦給變數。
    -| select max(height) into @max_height from tb;

-- 自訂變數名稱
為了避免select語句中,使用者自訂的變數與系統識別碼(通常是字段名)衝突,使用者自訂變數在變數名前使用@作為開始符號。
@var=10;

    - 變數定義後,整個會話週期都有效(登入退出)


--// 控制結構---- ------
-- if語句
if search_condition then
    statement_list   
[elseif search_condition then
    statement_list]
...clist ]
end if;

-- case語句

CASE value WHEN [compare-value] THEN result

[WHEN [compare-value] THEN result ...]
[ ELSE result]
END

--

while循環
[begin_label:] while search_condition do    statement_list
end while [end_label];

- 如果需要在循環內提前終止 while循環,則需要使用標籤;標籤需要成對出現。

    -- 退出循環
       退出整個循環leave
        退出目前循環iterate
     #內建函數

----------

-- 數值函數
abs(x)            -- 絕對值abs(-10.9) = 10format(x, d) -- 格式化千分位數值format(1234567.456, 2) = 1,234,567.46ceil(x)            -- 向上取整ceil(10.1) = 11101oor ) = 10
round(x)        -- 四捨五入去整
mod(m, n)        -- m%n m mod n   #pow(m, n)        -- m^n
sqrt(x)            -- 算術平方根
rand()   
#-- 時間日期函數
now(), current_timestamp();     -- 當前日期時間
current_date();                       -- 目前時間
date('yyyy-mm-dd hh:ii:ss');    -- 取得日期部分
time('yyyy-mm-dd hh:ii:ss');    -- 取得時間部分

#date_format
('yyyy-mm-dd hh:ii:ss', '%d %y %a %d %m %b %j');    -- 格式化時間

unix_timestamp();   - 取得unix時間戳記

from_unixtime();               -- 從時間戳獲得時間

-- 字串函數
length(string) 名詞)        -- string的字元數量
substring(str, position [,length])        -- 從str的position開始,取length個字元##努#replace(str ,search_str. replace_str替換search_str
instr(string ,substring)    -- 返回substring首次在string中出現的位置
concat(string [,...])    -- 連接字串charset(str)    回傳字串字元集lcase(string)            -- 轉換成小寫
left(string, length)    -- 從string2中的左邊起取個字元 -- 取內容
locate(substring, string [,start_position])    -- 同instr,但可指定開始位置

lpad(string, length, pad)    -- 重複以pad加在string開頭,直到字串長度為length

ltrim(string)            -- 移除前端空格
repeat(string, count)    -- 重複count次
rpad(string, length, pad)    -- 重複count次
rpad(string, length, pad)  為length
rtrim(string)            -- 移除後端空格
strcmp(string1 ,string2)    -- 逐字元比較兩個字串大小

-- 流程函數##case when [condition

# ] then result [when [condition] then result ...] [else result] end   多重分支
if(expr1,expr2,expr3)  雙分支。

-- 聚合函數
count()
sum();
max();
min();
avg();

group_concat()


-- 其他常用函數
md5();

default();



#--// 儲存函數,
自訂函數
----------
-- 新建
    CREATE FUNCTION function_name (參數清單)

RETURN

S 傳回值型別
        函數體

    - 函數名,應該合法的識別符,且不應該與現有的關鍵字衝突。
    - 一個函數應該屬於某個資料庫,並且可以使用db_name.funciton_name的形式執行目前函數所屬資料庫,否則為目前資料庫。
    - 參數部分,由"參數名稱"和"參數類型"組成。多個參數用逗號隔開。
    - 函數體由多個可用的mysql語句,流程控制,變數宣告等語句構成。
    - 多條語句應該使用 begin...end 語句區塊包含。
    - 一定要有 return 回傳值語句。

-- 刪除
    DROP FUNCTION [IF EXISTS] function_name;

-- 查看
    SHOW FUNCTION STATUS LIKE 'partten'
    SHOW CREATE FUNCTION STATUS LIKE 'partten'

    SHOW CREATE FUNCTION function_name;

-- 修改
    ALTER FUNCTION function_name 函數選項


#--// 預存程序,自訂功能----------
-- 定義
儲存預存程序是一段程式碼(流程),儲存在資料庫中的sql組成。
一個預存程序通常用來完成一段業務邏輯,例如報名,交班費,訂單入庫等。
而一個函數通常專注與某個功能,視為其他程式服務的,需要在其他語句中調用函數才可以,而預存程序不能被其他調用,是自己執行 透過call執行。

-- 建立
CREATE PROCEDURE sp_name (參數列表)
    過程體

參數列表:不同於函數的參數列表,需要指示參數類型
IN,表示輸入型
OUT,表示輸出型
INOUT,表示混合型

注意,沒有傳回值。


/* 預存程序 */ ------------------

預存程序是一段可執行性程式碼的集合。相比函數,更偏向業務邏輯。
呼叫:CALL 過程名稱
-- 注意
- 沒有傳回值。
- 只能單獨調用,不可夾雜在其他語句中

-- 參數
IN|OUT|INOUT 參數名稱資料型別
IN        輸入:在呼叫過程中,將資料輸入到過程體內部的參數
OUT        輸出:在呼叫過程中,將過程體處理完的結果回到客戶端
INOUT    輸入輸出:既可輸入,也可輸出

--語法
CREATE PROCEDURE 過程名稱(參數清單)
BEGIN
    過程體
END

##/* 使用者和
權限管理 */ -- ----------------

使用者資訊表:mysql.user
-- 刷新權限
FLUSH PRIVILEGES
-- 增加使用者
CREATE USER 使用者名稱IDENTIFIED BY [PASSWORD] 密碼(字元字串)
    - 必須擁有mysql資料庫的全域CREATE USER權限,或擁有INSERT權限。
    - 只能建立用戶,無法賦予權限。
    - 用戶名,注意引號:如'user_name'@'192.168.1.1'
    - 密碼也需引號,純數字密碼也要加引號
    - 若要忽略在純文字中代碼,需忽略PASSWORD關鍵字。要把密碼指定為PASSWORD()函數傳回的混編值,需包含關鍵字PASSWORD
-- 重新命名使用者
RENAME USER old_user TO new_user
-- 設定密碼
SET PASSWORD = PASSWORD('密碼')    -- 為目前使用者設定密碼
SET PASSWORD FOR 使用者名稱= PASSWORD('密碼')    -- 為指定使用者設定密碼
-- 刪除使用者
DROP USER 使用者名稱
-- 分配權限/新增使用者
GRANT 權限清單ON 表名TO 使用者名稱[IDENTIFIED BY [PASSWORD] 'password']
    - all privileges 表示所有權限
    - *.* 表示所有函式庫的所有表格
    - 函式庫名.表名表示某庫下方的某表格
-- 查看權限
SHOW GRANTS FOR 使用者名稱
    -- 查看目前使用者權限
    SHOW GRANTS; 或SHOW GRANTS FOR CURRENT_USER; 或SHOW GRANTS FOR CURRENT_USER();
-- 撤銷權限
REVOKE 權限清單ON 表格名稱FROM 使用者名稱
REVOKE ALL PRIVEGEG -- 撤銷所有權限
-- 權限層級
-- 若要使用GRANT或REVOKE,您必須擁有GRANT OPTION權限,且您必須用於您正在授予或撤銷的權限。
全域層級:全域權限適用於一個給定伺服器中的所有資料庫,mysql.user
    GRANT ALL ON *.*和 REVOKE ALL ON *.*只授予和撤銷全域權限。
資料庫層級:資料庫權限適用於一個給定資料庫中的所有目標,mysql.db, mysql.host
    GRANT ALL ON db_name.*和REVOKE ALL ON db_name.*只授予和撤銷資料庫權限。
表格層級:表格權限適用於一個給定表格中的所有資料列,mysql.talbes_priv
    GRANT ALL ON db_name.tbl_name和REVOKE ALL ON db_name.tbl_name只授予和撤銷表格權限。
列層級:列權限適用於一個給定表中的單一資料列,mysql.columns_priv
    當使用REVOKE時,您必須指定與授權列相同的資料列。
-- 權限清單
ALL [PRIVILEGES]    -- 設定除GRANT OPTION以外的所有簡單權限
ALTER    -- 允許使用ALTER TABLE
ALTER ROUTINE    -- 變更或取消已儲存的子程序
CREATE    -- 允許使用CREATE TABLE
CREATE ROUTINE    -- 建立已儲存的子程式
CREATE TEMPORARY TABLES        -- ) TEMPORARYHABLE##. USER, RENAME USER和REVOKE ALL PRIVILEGES。
CREATE VIEW        -- 允許使用CREATE VIEW
DELETE    -- 提供使用DELETE
DROP    -- 允許使用DROP TABLE
EXECUTE      -- 允許使用DROP TABLE
EXECUTE c    -- 允許使用DROP TABLE
EXECUTE c    -- 允許使用DROP TABLE
EXECUTE #     -- 允許使用DROP TABLE
EXECUTE #   允許使用SELECT...INTO OUTFILE和LOAD DATA INFILE
INDEX     -- 允許使用CREATE INDEX和DROP INDEX
INSERT    -- 允許使用INSERT
LOCK TABLES EL     -- 允許使用INSERT
LOCK TABLES EL    LOCK TABLES
PROCESS     -- 允許使用SHOW FULL PROCESSLIST
REFERENCES    -- 未實施
RELOAD    -- 允許使用FLUSH
REPLICATION CLIENT #REPLICATION SLAVE    -- 複製型從屬伺服器(從主伺服器讀取二元日誌事件)
SELECT    -- 允許使用SELECT
SHOW DATABASES    -- 顯示所有資料庫SHOW VIEW  SHOW CREATE VIEWSHUTDOWN    -- 允許
使用mysqladmin shutdown
SUPER###    -- 允許使用CHANGE MASTER, KILL, PURGE MASTER LOGS和SET GLOBAL語句,mysqladmin語句,mysqladmin指令;允許您連線(一次),即使已達到max_connections。 ###UPDATE    -- 允許使用UPDATE
USAGE    -- 「無權限」的同義詞
GRANT OPTION    -- 允許授予權限


/* 表格維護*/
-- 分析與儲存表的關鍵字分佈
ANALYZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE 表名...
-- 檢查一個或多個表是否有錯誤
CHECK TABLE tbl_name [, tbl_name] ... [option ] ...
option = {QUICK | FAST | MEDIUM | EXTENDED | CHANGED}
-- 整理資料檔案的碎片
OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ...

/* 雜項*/ ------------------

1. 可用反引號(`)為識別符(庫名、表名、欄位名稱、索引、別名)包裹,以避免與關鍵字重名!中文也可以當標識符!

2. 每個庫目錄存在一個保存目前資料庫的選項檔db.opt。

3. 註解:

單行註解# 註解內容
多行註解/* 註解內容*/
單行註解-- 註解內容        (標準SQL註解風格,要求雙破折號後加一空格符(空格、TAB、換行等))

4. 模式通配符

_    任單一字元
%    任多個字元,甚至包括零字元
     單引號需要進行轉義\'

5. CMD命令列內的語句結束符號可以為";", "\G", "\g",僅影響顯示結果。其他地方還是用分號結束。 delimiter 可修改目前對話的語句結束符號。

6. SQL對大小寫不敏感

7. 清除已有語句:\c

以上是具體介紹MySql經常使用語句的全面總結的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn