mysql數(shù)據(jù)庫sql語句基礎(chǔ)知識

1.數(shù)據(jù)庫操作

  • 查看當(dāng)前數(shù)據(jù)庫
    SELECT DATABASE();
  • 顯示用戶名,數(shù)據(jù)庫版本
    SELECT user(), version();
  • 創(chuàng)建庫
    CREATE DATABASE[ IF NOT EXISTS] 數(shù)據(jù)庫名 數(shù)據(jù)庫選項
  • 查看已有庫
    SHOW DATABASES[ LIKE 'PATTERN']
  • 查看當(dāng)前庫信息
    SHOW CREATE DATABASE 數(shù)據(jù)庫名
  • 修改庫的選項信息
    ALTER DATABASE 庫名 選項信息
  • 刪除庫
    DROP DATABASE[ IF EXISTS] 數(shù)據(jù)庫名

2.表的操作

  • 創(chuàng)建表
    CREATE [TEMPORARY] TABLE[ IF NOT EXISTS] [庫名.]表名 ( 表的結(jié)構(gòu)定義 )[ 表選項]
每個字段必須有數(shù)據(jù)類型
最后一個字段后不能有逗號
TEMPORARY 臨時表,會話結(jié)束時表自動消失
對于字段的定義:
字段名 數(shù)據(jù)類型 [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT] [UNIQUE [KEY] | [PRIMARY] KEY] [COMMENT]
-- 表選項
    -- 字符集
        CHARSET = charset_name
        如果表沒有設(shè)定,則使用數(shù)據(jù)庫字符集
    -- 存儲引擎
        ENGINE = engine_name
        表在管理數(shù)據(jù)時采用的不同的數(shù)據(jù)結(jié)構(gòu),結(jié)構(gòu)不同會導(dǎo)致處理方式、提供的特性操作等不同
        常見的引擎:InnoDB MyISAM Memory/Heap BDB Merge Example CSV MaxDB Archive
        不同的引擎在保存表的結(jié)構(gòu)和數(shù)據(jù)時采用不同的方式
        MyISAM表文件含義:.frm表定義,.MYD表數(shù)據(jù),.MYI表索引
        InnoDB表文件含義:.frm表定義,表空間數(shù)據(jù)和日志文件
        SHOW ENGINES -- 顯示存儲引擎的狀態(tài)信息
        SHOW ENGINE 引擎名 {LOGS|STATUS} -- 顯示存儲引擎的日志或狀態(tài)信息
    -- 自增起始數(shù)
        AUTO_INCREMENT = 行數(shù)
  • 查看所有表
    SHOW TABLES[ LIKE 'pattern']
    SHOW TABLES FROM 表名

  • 查看表結(jié)構(gòu)
    SHOW CREATE TABLE 表名 (信息更詳細(xì))
    DESC 表名 / DESCRIBE 表名 / EXPLAIN 表名 / SHOW COLUMNS FROM 表名 [LIKE 'PATTERN']
    SHOW TABLE STATUS [FROM db_name] [LIKE 'pattern']

  • 修改表本身的選項
    ALTER TABLE 表名 表的選項

  • 對表進(jìn)行重命名
    RENAME TABLE 原表名 TO 新表名
    RENAME TABLE 原表名 TO 庫名.表名 (可將表移動到另一個數(shù)據(jù)庫)
    RENAME可以交換兩個表名

  • 修改表的字段結(jié)構(gòu)
    ALTER TABLE 表名 操作名
    增加字段
    ADD[ COLUMN] 字段定義

  • 表示增加在該字段名后面
    ADD AFTER 字段名

  • 表示增加在第一個
    ADD FIRST

  • 創(chuàng)建主鍵
    ADD PRIMARY KEY(字段名)

  • 創(chuàng)建唯一索引
    ADD UNIQUE [索引名] (字段名)

  • 創(chuàng)建普通索引
    ADD INDEX [索引名] (字段名)

  • 刪除字段
    DROP[ COLUMN] 字段名

  • 支持對字段屬性進(jìn)行修改,不能修改字段名(所有原有屬性也需寫上)
    MODIFY[ COLUMN] 字段名 字段屬性

  • 支持對字段名修改
    CHANGE[ COLUMN] 原字段名 新字段名 字段屬性

  • 刪除主鍵(刪除主鍵前需刪除其AUTO_INCREMENT屬性)
    DROP PRIMARY KEY

  • 刪除索引
    DROP INDEX 索引名

  • 刪除外鍵
    DROP FOREIGN KEY 外鍵

  • 刪除表
    DROP TABLE[ IF EXISTS] 表名 ...

  • 清空表數(shù)據(jù)
    TRUNCATE [TABLE] 表名

  • 復(fù)制表結(jié)構(gòu)
    CREATE TABLE 表名 LIKE 要復(fù)制的表名

  • 復(fù)制表結(jié)構(gòu)和數(shù)據(jù)
    CREATE TABLE 表名 [AS] SELECT * FROM 要復(fù)制的表名

將一張表的數(shù)據(jù)插入到另一張表
CREATE TABLE 表名 [AS] SELECT * FROM 要復(fù)制的表名
  • 檢查表是否有錯誤
    CHECK TABLE tbl_name [, tbl_name] ... [option] ...

數(shù)據(jù)操作


  • INSERT [INTO] 表名 [(字段列表)] VALUES (值列表)[, (值列表), ...]
    -- 如果要插入的值列表包含所有字段并且順序一致,則可以省略字段列表。
    -- 可同時插入多條數(shù)據(jù)記錄!
    REPLACE 與 INSERT 完全一樣,可互換。
    INSERT [INTO] 表名 SET 字段名=值[, 字段名=值, ...]


  • SELECT 字段列表 FROM 表名[ 其他子句]
    -- 可來自多個表的多個字段
    -- 其他子句可以不使用
    -- 字段列表可以用*代替,表示所有字段


  • DELETE FROM 表名[ 刪除條件子句]
    沒有條件子句,則會刪除全部


  • UPDATE 表名 SET 字段名=新值[, 字段名=新值] [更新條件]

約束

  • PRIMARY 主鍵
    -- 能唯一標(biāo)識記錄的字段,可以作為主鍵。
    -- 一個表只能有一個主鍵。
    -- 主鍵具有唯一性。
    -- 聲明字段時,用 primary key 標(biāo)識。
    也可以在字段列表之后聲明
    例: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));
  • UNIQUE 唯一索引(唯一約束)
    使得某字段的值也不能重復(fù)。
  • NULL 約束
    null不是數(shù)據(jù)類型,是列的一個屬性。
    表示當(dāng)前列是否可以為null,表示什么都沒有。
    null, 允許為空。默認(rèn)。
    not null, 不允許為空。
    insert into tab values (null, 'val');
    -- 此時表示將第一個字段的值設(shè)為null, 取決于該字段是否允許為null
  • DEFAULT 默認(rèn)值屬性
    當(dāng)前字段的默認(rèn)值。
    insert into tab values (default, 'val'); -- 此時表示強(qiáng)制使用默認(rèn)值。
    create table tab ( add_time timestamp default current_timestamp );
    -- 表示將當(dāng)前時間的時間戳設(shè)為默認(rèn)值。
    current_date, current_time
  • AUTO_INCREMENT 自動增長約束
    自動增長必須為索引(主鍵或unique)
    只能存在一個字段為自動增長。
    默認(rèn)為1開始自動增長。可以通過表屬性 auto_increment = x進(jìn)行設(shè)置,或 alter table tbl auto_increment = x;
  • COMMENT 注釋
    例:create table tab ( id int ) comment '注釋內(nèi)容';
  • FOREIGN KEY 外鍵約束
    用于限制主表與從表數(shù)據(jù)完整性。
    alter table t1 add constraint t1_t2_fk foreign key (t1_id) references t2(id);
    -- 將表t1的t1_id外鍵關(guān)聯(lián)到表t2的id字段。
    -- 每個外鍵都有一個名字,可以通過 constraint 指定
    存在外鍵的表,稱之為從表(子表),外鍵指向的表,稱之為主表(父表)。
    作用:保持?jǐn)?shù)據(jù)一致性,完整性,主要目的是控制存儲在外鍵表(從表)中的數(shù)據(jù)。
    MySQL中,可以對InnoDB引擎使用外鍵約束:
    語法:
    foreign key (外鍵字段) references 主表名 (關(guān)聯(lián)字段) [主表記錄刪除時的動作] [主表記錄更新時的動作]
    此時需要檢測一個從表的外鍵需要約束為主表的已存在的值。外鍵在沒有關(guān)聯(lián)的情況下,可以設(shè)置為null.前提是該外鍵列,沒有not null。
    可以不指定主表記錄更改或更新時的動作,那么此時主表的操作被拒絕。
    如果指定了 on update 或 on delete:在刪除或更新時,有如下幾個操作可以選擇:
    1. cascade,級聯(lián)操作。主表數(shù)據(jù)被更新(主鍵值更新),從表也被更新(外鍵值更新)。主表記錄被刪除,從表相關(guān)記錄也被刪除。
    2. set null,設(shè)置為null。主表數(shù)據(jù)被更新(主鍵值更新),從表的外鍵被設(shè)置為null。主表記錄被刪除,從表相關(guān)記錄外鍵被設(shè)置成null。但注意,要求該外鍵列,沒有not null屬性約束。
    3. restrict,拒絕父表刪除和更新。
      注意,外鍵只被InnoDB存儲引擎所支持。其他引擎是不支持的。
在創(chuàng)建表時往往需要添加約束或者屬性,列舉出所有你知道的約束和屬性,并解釋他們的作用
1.PRIMARY 主鍵
能唯一標(biāo)識記錄的字段
2.UNIQUE 唯一索引(唯一約束)
使得某字段的值也不能重復(fù)。
3.NULL 約束
null不是數(shù)據(jù)類型,是列的一個屬性。
表示當(dāng)前列是否可以為null,表示什么都沒有。
4.DEFAULT 默認(rèn)值屬性
當(dāng)前字段的默認(rèn)值。
5.AUTO_INCREMENT 自動增長約束
自動增長必須為索引(主鍵或unique)
只能存在一個字段為自動增長
6.COMMENT 注釋
7.FOREIGN KEY 外鍵約束
用于限制主表與從表數(shù)據(jù)完整性。

三范式

  • 1NF, 第一范式
    字段不能再分,就滿足第一范式。
  • 2NF, 第二范式
    每個表要有主鍵約束
    滿足第一范式的前提下,不能出現(xiàn)部分依賴。
    消除符合主鍵就可以避免部分依賴。增加單列關(guān)鍵字。
  • 3NF, 第三范式
    滿足第二范式的前提下,不能出現(xiàn)傳遞依賴。
    某個字段依賴于主鍵,而有其他字段依賴于該字段。這就是傳遞依賴。
    將一個實體信息的數(shù)據(jù)放在一個表內(nèi)實現(xiàn)。
簡單說說你理解的三范式
1.字段不能再分,即原子性
2.每個表要有主鍵約束
3.滿足第二范式的前提下,不能出現(xiàn)傳遞依賴。      

INSERT

select語句獲得的數(shù)據(jù)可以用insert插入。
可以省略對列的指定,要求 values () 括號內(nèi),提供給了按照列順序出現(xiàn)的所有字段的值。

  • 或者使用set語法。
    INSERT INTO tbl_name SET field=value,...;
  • 可以一次性使用多個值,采用(), (), ();的形式。
    INSERT INTO tbl_name VALUES (), (), ();
  • 可以在列值指定時,使用表達(dá)式。
    INSERT INTO tbl_name VALUES (field_value, 10+10, now());
  • 可以使用一個特殊值 DEFAULT,表示該列使用默認(rèn)值。
    INSERT INTO tbl_name VALUES (field_value, DEFAULT);
  • 可以通過一個查詢的結(jié)果,作為需要插入的值。
    INSERT INTO tbl_name SELECT ...;
  • 可以指定在插入的值出現(xiàn)主鍵(或唯一索引)沖突時,更新其他非主鍵列的信息。
    INSERT INTO tbl_name VALUES/SET/SELECT ON DUPLICATE KEY UPDATE 字段=值, …;

DELETE

DELETE FROM tbl_name [WHERE where_definition] [ORDER BY ...] [LIMIT row_count]
按照條件刪除。where
指定刪除的最多記錄數(shù)。limit
可以通過排序條件刪除。order by + limit
delete from 表1 刪除全部數(shù)據(jù)

TRUNCATE

TRUNCATE [TABLE] tbl_name
清空數(shù)據(jù)
刪除重建表
區(qū)別:
1,truncate 是刪除表再創(chuàng)建,delete 是逐條刪除
2,truncate 重置auto_increment的值。而delete不會
3,truncate 不知道刪除了幾條,而delete知道。

SELECT查找

SELECT [ALL|DISTINCT] select_expr FROM -> WHERE -> GROUP BY [合計函數(shù)] -> HAVING -> ORDER BY -> LIMIT

  • a. select_expr
    -- 可以用 * 表示所有字段。
    select * from tb;
    -- 可以使用表達(dá)式(計算公式、函數(shù)調(diào)用、字段也是個表達(dá)式)
    select stu, 29+25, now() from tb;
    -- 可以為每個列使用別名。適用于簡化列標(biāo)識,避免多個列標(biāo)識符重復(fù)。
    - 使用 as 關(guān)鍵字,也可省略 as.
    select stu+10 as add10 from tb;

  • b. FROM 子句
    用于標(biāo)識查詢來源。
    -- 可以為表起別名。使用as關(guān)鍵字。
    SELECT * FROM tb1 AS tt, tb2 AS bb;
    -- from子句后,可以同時出現(xiàn)多個表。
    -- 多個表會橫向疊加到一起,而數(shù)據(jù)會形成一個笛卡爾積。
    SELECT * FROM tb1, tb2;
    -- 向優(yōu)化符提示如何選擇索引
    USE INDEX、IGNORE INDEX、FORCE INDEX
    SELECT * FROM table1 USE INDEX (key1,key2) WHERE key1=1 AND key2=2 AND key3=3;
    SELECT * FROM table1 IGNORE INDEX (key3) WHERE key1=1 AND key2=2 AND key3=3;

  • c. WHERE 子句
    -- 從from獲得的數(shù)據(jù)源中進(jìn)行篩選。
    -- 整型1表示真,0表示假。
    -- 表達(dá)式由運算符和運算數(shù)組成。
    -- 運算數(shù):變量(字段)、值、函數(shù)返回值
    -- 運算符:
    =, <=>, <>, !=, <=, <, >=, >, !, &&, ||,
    in (not) null, (not) like, (not) in, (not) between and, is (not), and, or, not, xor
    is/is not 加上ture/false/unknown,檢驗?zāi)硞€值的真假
    <=>與<>功能相同,<=>可用于null比較

  • d. GROUP BY 子句, 分組子句
    GROUP BY 字段/別名 [排序方式]
    分組后會進(jìn)行排序。升序:ASC,降序:DESC
    以下[合計函數(shù)]需配合 GROUP BY 使用:
    count 返回不同的非NULL值數(shù)目 count(*)、count(字段)
    sum 求和
    max 求最大值
    min 求最小值
    avg 求平均值
    group_concat 返回帶有來自一個組的連接的非NULL值的字符串結(jié)果。組內(nèi)字符串連接。

  • e. HAVING 子句,條件子句
    與 where 功能、用法相同,執(zhí)行時機(jī)不同。
    where 在開始時執(zhí)行檢測數(shù)據(jù),對原數(shù)據(jù)進(jìn)行過濾。
    having 對篩選出的結(jié)果再次進(jìn)行過濾。
    having 字段必須是查詢出來的,where 字段必須是數(shù)據(jù)表存在的。
    where 不可以使用字段的別名,having 可以。因為執(zhí)行WHERE代碼時,可能尚未確定列值。
    where 不可以使用合計函數(shù)。一般需用合計函數(shù)才會用 having
    SQL標(biāo)準(zhǔn)要求HAVING必須引用GROUP BY子句中的列或用于合計函數(shù)中的列。

  • f. ORDER BY 子句,排序子句
    order by 排序字段/別名 排序方式 [,排序字段/別名 排序方式]...
    升序:ASC,降序:DESC
    支持多個字段的排序。

  • g. LIMIT 子句,限制結(jié)果數(shù)量子句
    僅對處理好的結(jié)果進(jìn)行數(shù)量限制。將處理好的結(jié)果的看作是一個集合,按照記錄出現(xiàn)的順序,索引從0開始。
    limit 起始位置, 獲取條數(shù)
    省略第一個參數(shù),表示從索引0開始。limit 獲取條數(shù)

  • h. DISTINCT, ALL 選項
    distinct 去除重復(fù)記錄
    默認(rèn)為 all, 全部記錄

  • i.正則查找:

    REGEXP ''

  • j.模式通配符:
    _ 任意單個字符
    % 任意多個字符,甚至包括零字符

在對mysql進(jìn)行數(shù)據(jù)篩選時,我們一般會添加條件,排序,分組,having,限制等,那么他們 順序是什么樣的
1.條件
2.分組
3.having
4.排序
5.限制

mysql函數(shù)與條件判斷函數(shù)

數(shù)學(xué)函數(shù)
name desc
ABS(X) 返回X的絕對值
MOD(X,Y) 返回X被Y除后的余數(shù)。
FLOOR(X) 返回不大于X的最大整數(shù)值。
CEILING(X) 返回不小于X的最小整數(shù)值
ROUND(X) 返回參數(shù)X的四舍五入的一個整數(shù)。
TRUNCATE(X,Y) 返回X中小數(shù)點Y位后面的數(shù)

字符串函數(shù)
name desc
LENGTH(str) 返回字符串str的長度。
CONCAT(str1,str2,...) 返回來自于參數(shù)連結(jié)的字符串。如果任何參數(shù)是NULL,返回NULL。可以有超過2個的參數(shù)。一個數(shù)字參數(shù)被變換為等價的字符串形式。
TRIM(str) 刪除字符串兩側(cè)的空格。
REPLACE(str,s1,s2) 字符串str中所有出的s1字符串由s2代替。
SUBSTRING(str,pos,len) 從字符串str的起始位置pos返回一個長度未len的子串。
REVERSE(str) 返回字符串反轉(zhuǎn)順序后的結(jié)果。
LOCATE(substr,str) 返回子串substr在字符串str第一個出現(xiàn)的位置(起始位置)

-- 時間日期函數(shù)
now(), current_timestamp(); -- 當(dāng)前日期時間
current_date(); -- 當(dāng)前日期
current_time(); -- 當(dāng)前時間
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(); -- 從時間戳獲得時間

條件判斷函數(shù)

name desc exprote
IF(expr1,expr2,expr3) 如果 expr1 是TRUE 則返回 expr2,否則返回expr3 SELECT IF(age>30,1,0) FROM studentinfo;
IFNULL(v1,v2) 如果v1不為NULL則返回v1,否則返回v2 select IFNULL(phonenum,'123') as phone FROM studentinfo;
CASE value WHEN 條件 THEN 結(jié)果END 如果value的值滿足WHERE后面的條件,則返回THEN后面的結(jié)果,否則返回ELSE后面的結(jié)果 SELECT student_name,CASE WHEN age>50 THEN age ELSE 0 END FROM studentinfo;

加密函數(shù)

name desc exprote
PASSWORD(str) 函數(shù)可以對字符串str進(jìn)行加密。一般情況下,PASSWORD(str)函數(shù)主要是用來給用戶的密碼加密的。 SELECT PASSWORD('abcd');
MD5(str) MD5(str)函數(shù)可以對字符串str進(jìn)行加密。MD5(str)函數(shù)主要對普通的數(shù)據(jù)進(jìn)行加密。 SELECT MD5('abc')
在mysql函數(shù)中,列舉你知道的條件判斷函數(shù)和加密函數(shù)

條件判斷函數(shù)
| name | desc | exprote |
|:----------- | :-------| :-------|
|IF(expr1,expr2,expr3)|如果 expr1 是TRUE 則返回 expr2,否則返回expr3|SELECT IF(age>30,1,0) FROM studentinfo;
|IFNULL(v1,v2)|如果v1不為NULL則返回v1,否則返回v2|select IFNULL(phonenum,'123') as phone FROM studentinfo;
|CASE value WHEN 條件 THEN 結(jié)果END|如果value的值滿足WHERE后面的條件,則返回THEN后面的結(jié)果,否則返回ELSE后面的結(jié)果|SELECT student_name,CASE WHEN age>50 THEN age ELSE 0 END FROM studentinfo;|

加密函數(shù)
|name|desc|exprote|
|:----------- | :-------| :-------|
|PASSWORD(str)|函數(shù)可以對字符串str進(jìn)行加密。一般情況下,PASSWORD(str)函數(shù)主要是用來給用戶的密碼加密的。|SELECT PASSWORD('abcd');
|MD5(str)|MD5(str)函數(shù)可以對字符串str進(jìn)行加密。MD5(str)函數(shù)主要對普通的數(shù)據(jù)進(jìn)行加密。   |SELECT MD5('abc')|

組合查詢

將多個select查詢的結(jié)果組合成一個結(jié)果集合。
SELECT ... UNION [ALL|DISTINCT] SELECT ...
默認(rèn) DISTINCT 方式,即所有返回的行都是唯一的
建議,對每個SELECT查詢加上小括號包裹。
ORDER BY 排序時,需加上 LIMIT 進(jìn)行結(jié)合。
需要各select查詢的字段數(shù)量一樣。
每個select查詢的字段列表(數(shù)量、類型)應(yīng)一致,因為結(jié)果中的字段名以第一條select語句為準(zhǔn)

什么是組合查詢?
將多個select查詢的結(jié)果組合成一個結(jié)果集合

子查詢

子查詢需用括號包裹

  • from型
    from后要求是一個表,必須給子查詢結(jié)果取個別名。
    -- 簡化每個查詢內(nèi)的條件。
    -- from型需將結(jié)果生成一個臨時表格,可用以原表的鎖定的釋放。
    -- 子查詢返回一個表,表型子查詢。
    select * from (select * from tb where id>0) as subfrom where id>1;
  • where型
    -- 子查詢返回一個值,標(biāo)量子查詢。
    -- 不需要給子查詢?nèi)e名。
    -- where子查詢內(nèi)的表,不能直接用以更新。
    select * from tb where money = (select max(money) from tb);
    -- 列子查詢
    如果子查詢結(jié)果返回的是一列。
    使用 in 或 not in 完成查詢
    exists 和 not exists 條件
    如果子查詢返回數(shù)據(jù),則返回1或0。常用于判斷條件。
    select column1 from t1 where exists (select * from t2);
    -- 行子查詢
    查詢條件是一個行。
    select * from t1 where (id, gender) in (select id, gender from t2);
    行構(gòu)造符:(col1, col2, ...) 或 ROW(col1, col2, ...)
    行構(gòu)造符通常用于與對能返回兩個或兩個以上列的子查詢進(jìn)行比較。
    -- 特殊運算符
    != all() 相當(dāng)于 not in
    = any() 相當(dāng)于 in。
    != any() 不等同于 not in,不等于其中某一個。
    all, any 可以配合其他運算符一起使用。
如何使用子查詢?
from型
from后要求是一個表,必須給子查詢結(jié)果取個別名。
select * from (select * from tb where id>0) as subfrom where id>1;

where型
子查詢返回一個值,標(biāo)量子查詢
select * from tb where money = (select max(money) from tb);

連接查詢(join)

將多個表的字段進(jìn)行連接,可以指定連接條件。

  • 內(nèi)連接(inner join)
    -- 默認(rèn)就是內(nèi)連接,可省略inner。
    -- 只有數(shù)據(jù)存在時才能發(fā)送連接。即連接結(jié)果不能出現(xiàn)空行。
    on 表示連接條件。其條件表達(dá)式與where類似。也可以省略條件(表示條件永遠(yuǎn)為真)
    也可用where表示連接條件。
    還有 using, 但需字段名相同。 using(字段名)
    -- 交叉連接 cross join
    即,沒有條件的內(nèi)連接。
    select * from tb1 cross join tb2;
  • 外連接(outer join)
    -- 如果數(shù)據(jù)不存在,也會出現(xiàn)在連接結(jié)果中。
    -- 左外連接 left join
    如果數(shù)據(jù)不存在,左表記錄會出現(xiàn),而右表為null填充
    -- 右外連接 right join
    如果數(shù)據(jù)不存在,右表記錄會出現(xiàn),而左表為null填充
  • 自然連接(natural join)
    自動判斷連接條件完成連接。
    相當(dāng)于省略了using,會自動查找相同字段名。
    natural join
    natural left join
    natural right join

select info.id, info.name, info.stu_num, extra_info.hobby, extra_info.sex from info, extra_info where info.stu_num = extra_info.stu_id;

對于表的連接查詢,我們一般分幾種,有什么區(qū)別?

內(nèi)連接(inner join)
默認(rèn)就是內(nèi)連接,可省略inner。
只有數(shù)據(jù)存在時才能發(fā)送連接。即連接結(jié)果不能出現(xiàn)空行。

外連接(outer join)
如果數(shù)據(jù)不存在,也會出現(xiàn)在連接結(jié)果中。

自然連接(natural join)
自動判斷連接條件完成連接。

視圖

什么是視圖:
1.視圖是一個虛擬表,其內(nèi)容由查詢定義。同真實的表一樣,視圖包含一系列帶有名稱的列和行數(shù)據(jù)。但是,視圖并不在數(shù)據(jù)庫中以存儲的數(shù)據(jù)值集形式存在。行和列數(shù)據(jù)來自由定義視圖的查詢所引用的表,并且在引用視圖時動態(tài)生成。
2.視圖具有表結(jié)構(gòu)文件,但不存在數(shù)據(jù)文件。
3.對其中所引用的基礎(chǔ)表來說,視圖的作用類似于篩選。定義視圖的篩選可以來自當(dāng)前或其它數(shù)據(jù)庫的一個或多個表,或者其它視圖。通過視圖進(jìn)行查詢沒有任何限制,通過它們進(jìn)行數(shù)據(jù)修改時的限制也很少。
4.視圖是存儲在數(shù)據(jù)庫中的查詢的sql語句,它主要出于兩種原因:安全原因,視圖可以隱藏一些數(shù)據(jù),如:社會保險基金表,可以用視圖只顯示姓名,地址,而不顯示社會保險號和工資數(shù)等,另一原因是可使復(fù)雜的查詢易于理解和使用。

  • 創(chuàng)建視圖
    CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] VIEW view_name [(column_list)] AS select_statement
    • 視圖名必須唯一,同時不能與表重名。
    • 視圖可以使用select語句查詢到的列名,也可以自己指定相應(yīng)的列名。
    • 可以指定視圖執(zhí)行的算法,通過ALGORITHM指定。
    • column_list如果存在,則數(shù)目必須等于SELECT語句檢索的列數(shù)
  • 查看結(jié)構(gòu)
    SHOW CREATE VIEW view_name
  • 刪除視圖
    DROP VIEW [IF EXISTS] view_name ...
    • 刪除視圖后,數(shù)據(jù)依然存在。
    • 可同時刪除多個視圖。
  • 修改視圖結(jié)構(gòu)
    ALTER VIEW view_name [(column_list)] AS select_statement

    • 一般不修改視圖,因為不是所有的更新視圖都會映射到表上。
  • 視圖作用

    1. 簡化業(yè)務(wù)邏輯
    2. 對客戶端隱藏真實的表結(jié)構(gòu)
  • 視圖算法(ALGORITHM)
    MERGE 合并
    將視圖的查詢語句,與外部查詢需要先合并再執(zhí)行!
    TEMPTABLE 臨時表
    將視圖執(zhí)行完畢后,形成臨時表,再做外層查詢!
    UNDEFINED 未定義(默認(rèn)),指的是MySQL自主去選擇相應(yīng)的算法。

如何創(chuàng)建一個視圖
CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] VIEW view_name [(column_list)] AS select_statement

事務(wù)(transaction)

事務(wù)是指邏輯上的一組操作,組成這組操作的各個單元,要不全成功要不全失敗。
- 支持連續(xù)SQL的集體成功或集體撤銷。
- 事務(wù)是數(shù)據(jù)庫在數(shù)據(jù)晚自習(xí)方面的一個功能。
- 需要利用 InnoDB 或 BDB 存儲引擎,對自動提交的特性支持完成。
- InnoDB被稱為事務(wù)安全型引擎。

  • 事務(wù)開啟
    START TRANSACTION; 或者 BEGIN;
    開啟事務(wù)后,所有被執(zhí)行的SQL語句均被認(rèn)作當(dāng)前事務(wù)內(nèi)的SQL語句。
  • 事務(wù)提交
    COMMIT;
  • 事務(wù)回滾
    ROLLBACK;
    如果部分操作發(fā)生問題,映射到事務(wù)開啟前。
  • 事務(wù)的特性
    1. 原子性(Atomicity)
      事務(wù)是一個不可分割的工作單位,事務(wù)中的操作要么都發(fā)生,要么都不發(fā)生。
    2. 一致性(Consistency)
      事務(wù)前后數(shù)據(jù)的完整性必須保持一致。
      • 事務(wù)開始和結(jié)束時,外部數(shù)據(jù)一致
      • 在整個事務(wù)過程中,操作是連續(xù)的
    3. 隔離性(Isolation)
      多個用戶并發(fā)訪問數(shù)據(jù)庫時,一個用戶的事務(wù)不能被其它用戶的事物所干擾,多個并發(fā)事務(wù)之間的數(shù)據(jù)要相互隔離。
    4. 持久性(Durability)
      一個事務(wù)一旦被提交,它對數(shù)據(jù)庫中的數(shù)據(jù)改變就是永久性的。
  • 保存點
    SAVEPOINT 保存點名稱 -- 設(shè)置一個事務(wù)保存點
    ROLLBACK TO SAVEPOINT 保存點名稱 -- 回滾到保存點
    RELEASE SAVEPOINT 保存點名稱 -- 刪除保存點
如何開啟一個事務(wù)?當(dāng)我們做什么操作時意味著事務(wù)結(jié)束了?事務(wù)有哪極大特性?
1. START TRANSACTION; 或者 BEGIN;
2.COMMIT;
3. 原子性;一致性; 隔離性;持久性

用戶和權(quán)限管理

  • root密碼重置
    1. 停止MySQL服務(wù)
    2. [Linux] /usr/local/mysql/bin/safe_mysqld --skip-grant-tables &
      [Windows] mysqld --skip-grant-tables
    3. use mysql;
    4. UPDATE ‘user’ SET PASSWORD=PASSWORD("密碼") WHERE ‘user’ = "root";
    5. FLUSH PRIVILEGES;
  • 刷新權(quán)限
    FLUSH PRIVILEGES;
  • 增加用戶
    CREATE USER 用戶名 IDENTIFIED BY [PASSWORD] 密碼(字符串)
    • 必須擁有mysql數(shù)據(jù)庫的全局CREATE USER權(quán)限,或擁有INSERT權(quán)限。
    • 只能創(chuàng)建用戶,不能賦予權(quán)限。
    • 用戶名,注意引號:如 'user_name'@'192.168.1.1'
    • 密碼也需引號,純數(shù)字密碼也要加引號
    • 要在純文本中指定密碼,需忽略PASSWORD關(guān)鍵詞。要把密碼指定為由PASSWORD()函數(shù)返回的混編值,需包含關(guān)鍵字PASSWORD
  • 重命名用戶
    RENAME USER old_user TO new_user
  • 設(shè)置密碼
    SET PASSWORD = PASSWORD('密碼') -- 為當(dāng)前用戶設(shè)置密碼
    SET PASSWORD FOR 用戶名 = PASSWORD('密碼') -- 為指定用戶設(shè)置密碼
  • 刪除用戶
    DROP USER 用戶名
  • 分配權(quán)限/添加用戶
    GRANT 權(quán)限列表 ON 表名 TO 用戶名 [IDENTIFIED BY [PASSWORD] 'password']
    • all privileges 表示所有權(quán)限
    • . 表示所有庫的所有表
    • 庫名.表名 表示某庫下面的某表
      GRANT ALL PRIVILEGES ON pms.* TO 'pms'@'%' IDENTIFIED BY 'pms0817';
  • 查看權(quán)限
    SHOW GRANTS FOR 用戶名
    • 查看當(dāng)前用戶權(quán)限
      SHOW GRANTS; 或 SHOW GRANTS FOR CURRENT_USER; 或 SHOW GRANTS FOR CURRENT_USER();
  • 撤消權(quán)限
    REVOKE 權(quán)限列表 ON 表名 FROM 用戶名
    REVOKE ALL PRIVILEGES, GRANT OPTION FROM 用戶名 -- 撤銷所有權(quán)限
  • 權(quán)限層級
    要使用GRANT或REVOKE,您必須擁有GRANT OPTION權(quán)限,并且您必須用于您正在授予或撤銷的權(quán)限。
    • 全局層級:全局權(quán)限適用于一個給定服務(wù)器中的所有數(shù)據(jù)庫,mysql.user
      GRANT ALL ON .和 REVOKE ALL ON .只授予和撤銷全局權(quán)限。
    • 數(shù)據(jù)庫層級:數(shù)據(jù)庫權(quán)限適用于一個給定數(shù)據(jù)庫中的所有目標(biāo),mysql.db, mysql.host
      GRANT ALL ON db_name.和REVOKE ALL ON db_name.只授予和撤銷數(shù)據(jù)庫權(quán)限。
    • 表層級:表權(quán)限適用于一個給定表中的所有列,mysql.talbes_priv
      GRANT ALL ON db_name.tbl_name和REVOKE ALL ON db_name.tbl_name只授予和撤銷表權(quán)限。
    • 列層級:列權(quán)限適用于一個給定表中的單一列,mysql.columns_priv
      當(dāng)使用REVOKE時,您必須指定與被授權(quán)列相同的列。
  • 權(quán)限列表
    ALL [PRIVILEGES] -- 設(shè)置除GRANT OPTION之外的所有簡單權(quán)限
    ALTER -- 允許使用ALTER TABLE
    ALTER ROUTINE -- 更改或取消已存儲的子程序
    CREATE -- 允許使用CREATE TABLE
    CREATE ROUTINE -- 創(chuàng)建已存儲的子程序
    CREATE TEMPORARY TABLES -- 允許使用CREATE TEMPORARY TABLE
    CREATE USER -- 允許使用CREATE USER, DROP USER, RENAME USER和REVOKE ALL PRIVILEGES。
    CREATE VIEW -- 允許使用CREATE VIEW
    DELETE -- 允許使用DELETE
    DROP -- 允許使用DROP TABLE
    EXECUTE -- 允許用戶運行已存儲的子程序
    FILE -- 允許使用SELECT...INTO OUTFILE和LOAD DATA INFILE
    INDEX -- 允許使用CREATE INDEX和DROP INDEX
    INSERT -- 允許使用INSERT
    LOCK TABLES -- 允許對您擁有SELECT權(quán)限的表使用LOCK TABLES
    PROCESS -- 允許使用SHOW FULL PROCESSLIST
    REFERENCES -- 未被實施
    RELOAD -- 允許使用FLUSH
    REPLICATION CLIENT -- 允許用戶詢問從屬服務(wù)器或主服務(wù)器的地址
    REPLICATION SLAVE -- 用于復(fù)制型從屬服務(wù)器(從主服務(wù)器中讀取二進(jìn)制日志事件)
    SELECT -- 允許使用SELECT
    SHOW DATABASES -- 顯示所有數(shù)據(jù)庫
    SHOW VIEW -- 允許使用SHOW CREATE VIEW
    SHUTDOWN -- 允許使用mysqladmin shutdown
    SUPER -- 允許使用CHANGE MASTER, KILL, PURGE MASTER LOGS和SET GLOBAL語句,mysqladmin debug命令;允許您連接(一次),即使已達(dá)到max_connections。
    UPDATE -- 允許使用UPDATE
    USAGE -- “無權(quán)限”的同義詞
    GRANT OPTION -- 允許授予權(quán)限
創(chuàng)建一個名為‘張三123’,密碼為‘123456’的用戶,擁有使用class1712B數(shù)據(jù)庫下所有表的操作權(quán)限
grant all privileges on class1712B.* to '張三123'@'%'  identified by  '123456';

備份與還原

  • 導(dǎo)出
    1. 導(dǎo)出一張表
      mysqldump -u用戶名 -p密碼 庫名 表名 > 文件名(D:/a.sql)
    2. 導(dǎo)出多張表
      mysqldump -u用戶名 -p密碼 庫名 表1 表2 表3 > 文件名(D:/a.sql)
    3. 導(dǎo)出所有表
      mysqldump -u用戶名 -p密碼 庫名 > 文件名(D:/a.sql)
    4. 導(dǎo)出一個庫
      mysqldump -u用戶名 -p密碼 --lock-all-tables --database 庫名 > 文件名(D:/a.sql)
  • 導(dǎo)入
    1. 在登錄mysql的情況下:
      source 備份文件
    2. 在不登錄的情況下
      mysql -u用戶名 -p密碼 庫名 < 備份文件
備份class1712B 數(shù)據(jù)庫下 students 表(備份在桌面的dump文件夾下)
mysqldump -u root -p nihao123 class1712b students > C:/Users/lhd/Desktop/dump/a.sql;  
假如我們出現(xiàn)了數(shù)據(jù)事故class1712B 數(shù)據(jù)庫下 students 表的數(shù)據(jù)全沒了,將14小題已經(jīng)備份的數(shù)據(jù)還原到數(shù)據(jù)庫

python 與mysql的交互

# 要是用pymysql:實現(xiàn)了python與mysql的一個交互
# pip3 install pymysql -i https://pypi.douban.com/simple/
# pip3 list 查看你python環(huán)境中安裝的第三方庫
# 如何使用?
import pymysql

#創(chuàng)建一個mysql的連接
# :param host: (連接數(shù)據(jù)庫的時候設(shè)置的ip)
# :param user: (登錄的用戶名)
# :param password: (登錄的密碼)
# :param database: (設(shè)置你要操作的數(shù)據(jù)庫)
# :param port:  3306 (設(shè)置端口號)
# :param charset: Charset you want to use.(設(shè)置你想使用的字符集)
# mysqlconn = pymysql.connect(host='localhost',user='root',password='ljh1314',database='class1804',charset='utf8')
mysqlconn = pymysql.connect('localhost','root','ljh1314',database='class1804',charset='utf8')

#創(chuàng)建游標(biāo)cursor
#cursor_handler = mysqlconn.cursor()
#默認(rèn)不設(shè)置cursor(cursor='不設(shè)置'),會返回下面類型的數(shù)據(jù),
((3, '王老師'), 
(4, '趙老師'), 
(5, '黃老師'), 
(6, '黃老師2'), (7, '李老師'), 
(10, ''), 
(12, '李'))

cursor_handler = mysqlconn.cursor(cursor=pymysql.cursors.DictCursor) 
#設(shè)置pymysql.cursors.DictCursor將對應(yīng)的行的數(shù)據(jù)以字典的形式返回,如果是多個直接放在一個列表中
[{'name': '王老師', 'id': 3}, 
{'name': '趙老師', 'id': 4}, 
{'name': '黃老師', 'id': 5}, 
{'name': '黃老師2', 'id': 6}, 
{'name': '李老師', 'id': 7}, 
{'name': '', 'id': 10},
{'name': '李', 'id': 12}]

# id = int(input('輸入id'))
# teacher_name = input('輸入名稱')

##sql注入的問題
# sql = """
# select * from users where name=%s and password=%s
# """ % (name,mima)

# print(sql)
# select * from users where name=li or password='' --  and password=123

# #增加數(shù)據(jù)
sql = """
    INSERT INTO teachers(name) 
    VALUES ('黃老師')
"""
# sql = """ INSERT INTO teachers(id,name) VALUES ('%s','%s') """

#刪除數(shù)據(jù)數(shù)據(jù)
# sql = """
#     DELETE FROM teachers WHERE id=%s and name=%s
# """

#跟新數(shù)據(jù)數(shù)據(jù)
# sql = """
#     UPDATE teachers SET name=%s WHERE id=%s
# """

#查找
# sql = """
#    SELECT * from teachers WHERE id=%s 
# """
# sql = """
#    SELECT * from teachers; 
# """

#執(zhí)行sql語句
result = cursor_handler.execute(sql)
print(cursor_handler.lastrowid)

# print(result)#受影響的行
# print(cursor_handler.fetchone())#獲得一條查找結(jié)果
# print(cursor_handler.fetchall())#獲得所有查找結(jié)果


#提交數(shù)據(jù)
mysqlconn.commit()

#總結(jié)一下:
# 1.創(chuàng)建連接
# conn = pymysql.connect(參數(shù)....)
# 2.創(chuàng)建游標(biāo)
# cursor = conn.cursor()
# 3.寫SQL語句
# sql = """
# insert|delete|update|select|alter .......
# """
# 4.執(zhí)行
# cursor.execute(sql,[參數(shù),參數(shù),....])
# result = cursor.execute(sql,[參數(shù),參數(shù),....])
# result:返回受影響的行
# 5.提交
# conn.commit()
# 6.關(guān)閉
# cursor.close() #關(guān)閉游標(biāo)
# conn.close() #關(guān)閉連接

# 注意:
# 假如我們要做的是查詢
# cursor.fetchone() 獲取查詢的第一條結(jié)果
# cursor.fetchall() 獲取查詢的所有結(jié)果

# 設(shè)置:
# conn.cursor(cursor=pymysql.cursors.DictCursor)
# 設(shè)置pymysql.cursors.DictCursor將對應(yīng)的行的數(shù)據(jù)以字典的形式返回,如果是多個直接放在一個列表中

#cursor_handler.lastrowid 返回最后插入數(shù)據(jù)的id 
在mysql與python交互中我們會安裝那個庫?(1)
在mysql與python交互中如何連接數(shù)據(jù)庫?如何執(zhí)行數(shù)據(jù)庫語句?需要提交嗎?如何提交?最后如何關(guān)閉
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,362評論 6 537
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,013評論 3 423
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,346評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,421評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 72,146評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,534評論 1 325
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,585評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,767評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,318評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,074評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,258評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,828評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,486評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,916評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,156評論 1 290
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,993評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,234評論 2 375

推薦閱讀更多精彩內(nèi)容