搜尋
首頁資料庫mysql教程具體介紹MySql經常使用語句的全面總結

下面小編就為大家帶來一篇對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
图文详解mysql架构原理图文详解mysql架构原理May 17, 2022 pm 05:54 PM

本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了关于架构原理的相关内容,MySQL Server架构自顶向下大致可以分网络连接层、服务层、存储引擎层和系统文件层,下面一起来看一下,希望对大家有帮助。

mysql的msi与zip版本有什么区别mysql的msi与zip版本有什么区别May 16, 2022 pm 04:33 PM

mysql的msi与zip版本的区别:1、zip包含的安装程序是一种主动安装,而msi包含的是被installer所用的安装文件以提交请求的方式安装;2、zip是一种数据压缩和文档存储的文件格式,msi是微软格式的安装包。

mysql怎么去掉第一个字符mysql怎么去掉第一个字符May 19, 2022 am 10:21 AM

方法:1、利用right函数,语法为“update 表名 set 指定字段 = right(指定字段, length(指定字段)-1)...”;2、利用substring函数,语法为“select substring(指定字段,2)..”。

mysql怎么替换换行符mysql怎么替换换行符Apr 18, 2022 pm 03:14 PM

在mysql中,可以利用char()和REPLACE()函数来替换换行符;REPLACE()函数可以用新字符串替换列中的换行符,而换行符可使用“char(13)”来表示,语法为“replace(字段名,char(13),'新字符串') ”。

MySQL复制技术之异步复制和半同步复制MySQL复制技术之异步复制和半同步复制Apr 25, 2022 pm 07:21 PM

本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了关于MySQL复制技术的相关问题,包括了异步复制、半同步复制等等内容,下面一起来看一下,希望对大家有帮助。

mysql怎么将varchar转换为int类型mysql怎么将varchar转换为int类型May 12, 2022 pm 04:51 PM

转换方法:1、利用cast函数,语法“select * from 表名 order by cast(字段名 as SIGNED)”;2、利用“select * from 表名 order by CONVERT(字段名,SIGNED)”语句。

mysql怎么判断是否是数字类型mysql怎么判断是否是数字类型May 16, 2022 am 10:09 AM

在mysql中,可以利用REGEXP运算符判断数据是否是数字类型,语法为“String REGEXP '[^0-9.]'”;该运算符是正则表达式的缩写,若数据字符中含有数字时,返回的结果是true,反之返回的结果是false。

mysql怎么删除unique keymysql怎么删除unique keyMay 12, 2022 pm 03:01 PM

在mysql中,可利用“ALTER TABLE 表名 DROP INDEX unique key名”语句来删除unique key;ALTER TABLE语句用于对数据进行添加、删除或修改操作,DROP INDEX语句用于表示删除约束操作。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器