初涉MySQL

啟動(dòng)/停止/重啟MySQL服務(wù)

  • 啟動(dòng)MySQL服務(wù):

      mysql.server start
    
  • 停止MySQL服務(wù):

      mysql.server stop
    
  • 重啟MySQL服務(wù):

       mysql.server restart  
    
  • 查看版本號(hào):

      mysql -V    /  mysql --version  
    
  • 登錄退出:

      mysql -u root -p            //登錄
      exit/quit                   //退出
    

MySQL 語句的規(guī)范

  1. 關(guān)鍵字和函數(shù)名稱全部大寫
  2. 數(shù)據(jù)庫(kù)名稱、表名稱、字段名稱全部小寫
  3. SQL 語句必須以分號(hào)結(jié)尾

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

  • 創(chuàng)建數(shù)據(jù)庫(kù)

      CREATE DATABASE db_test;            //創(chuàng)建名稱為tb_test的數(shù)據(jù)庫(kù)
      CREATE DATABASE  IF NOT EXISTS db_test;   //如果該數(shù)據(jù)庫(kù)已存在,則忽略警告信息
      CREATE DATABASE  IF NOT EXISTS db_test CHARACTER SET GBK;  //創(chuàng)建時(shí)候指定字符編碼
    
  • 查看警告信息

      SHOW WARNINGS ; 
    
  • 查看當(dāng)前服務(wù)器數(shù)據(jù)庫(kù)列表

      SHOW DATABASES; 
    
  • 查看數(shù)據(jù)庫(kù)創(chuàng)建方式

      SHOW CREATE DATABASE db_test;   
    
  • 修改數(shù)據(jù)庫(kù) -編碼字符集

      ALTER DATABASE db_test CHARACTER SET=utf8;
    
  • 從刪庫(kù)到跑路

      DROP DATABASE db_test;  
    

  • 使用數(shù)據(jù)庫(kù)

      USE db_test;            //db_test為數(shù)據(jù)庫(kù)名稱  
    
  • 查看當(dāng)前打開 的數(shù)據(jù)庫(kù)名稱

      SELECT DATABASE();
    

數(shù)據(jù)類型

  1. 整型

     TINYINT:    1字節(jié)  
     SMALLINT:   2字節(jié)    
     MEDIUMINT:  3字節(jié)
     INT:        4字節(jié)  
     BIGINT:     8字節(jié)
    

    以上取值范圍從小到大。

  2. 浮點(diǎn)型

     FLOAT 【M,D】  :  單精度,M是數(shù)字總位數(shù),D是小數(shù)點(diǎn)后面位數(shù),精確到大約7位小數(shù)位  
     DOUBLE【M,D】  :  雙精度
    
  3. 日期時(shí)間型

     YEAR:       年份,默認(rèn)4位也可存兩位,可以允許70~69(1970~2069之間)1
     TIME:      -8385959~8385959之間的一個(gè)時(shí)間類型  3
     DATE:     存儲(chǔ)日期范圍,支持范圍:1000年的1月1號(hào)到9999年的12月31號(hào)之間的日期 3
     DATETIME: 日期時(shí)間類型,同DATE范圍,多了時(shí)分秒   8
     TIMESTAMP:時(shí)間戳類型,1970年1月1號(hào)0點(diǎn)起到2037年的一個(gè)值 4
    
  4. 字符型

    CHAR(M):定長(zhǎng)字符,M個(gè)字節(jié),0 <=M <=255
    VARCHAR :變長(zhǎng)字符,

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

  • 創(chuàng)建表

      CREATE TABLE tb_test(   
    
          user_name varchar(20),
          age TINYINT UNSIGNED,           --  UNSIGNED表示無符號(hào)位
          salary FLOAT(8,2) UNSIGNED      -- (8,2)表示最多八位,小數(shù)點(diǎn)后2位 窮逼 T_T    
      );   
    
  • 查看表列表

      SHOW TABLES;                            //查看當(dāng)前數(shù)據(jù)庫(kù)表
      SHOW TABLES FROM mysql;             //查看指定數(shù)據(jù)庫(kù)表  
    
  • 查看表結(jié)構(gòu)

      DESC girl;
      SHOW COLUMNS FROM girl;
    
  • 增加記錄

      INSERT INTO girl VALUES(13,10,'E');      //省略掉列名的話 所有字段都要賦值
      INSERT girl (id,age) VALUES(808,99);     //一部分賦值
    
  • 查找記錄

      SELECT * FROM girl;     //查詢girl表下所有字段
    
  • 空值和非空

      NULL:字段值可以為空,不指定話默認(rèn)  
      NOT NULL:字段值禁止為空
      
      CREATE TABLE tb2(
    
          user_name VARCHAR(20) NOT NULL, -- 不允許為空
          age TINYINT UNSIGNED NULL           
    
      );
      
      當(dāng) 使用 INSERT INTO tb2 VALUES(NULL,16); 插入時(shí)候會(huì)報(bào)錯(cuò):
      
          Column 'user_name' cannot be null
    
  • 自動(dòng)編號(hào) AUTO_INCREMENT

    • 自動(dòng)編號(hào),必須和主鍵組合使用
    • 默認(rèn)起始值為1,每次增量為1(保證記錄唯一性,不會(huì)重復(fù))
  • 主鍵 PRIMARY KEY(非空+唯一)

    • 主鍵保證記錄的唯一性
    • 主鍵自動(dòng)為 NOT NULL
    • 不一定和 AUTO_INCREMENT 一起使用
    • 每張數(shù)據(jù)表只能存在一個(gè)主鍵
  • 唯一約束(UNIQUE KEY)

    • 唯一約束
    • 保證記錄唯一性
    • 字段可以為空值(NULL)
    • 每張數(shù)據(jù)表可以存在多個(gè)唯一約束
  • 默認(rèn)值約束
    默認(rèn)值,當(dāng)插入記錄時(shí),如果沒有明確為字段賦值,則自動(dòng)賦予默認(rèn)值。

         create table tb_test (
             id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
             user_name VARCHAR(20) NOT null unique key,
             sex enum('1','2','3') DEFAULT '3'
         ); 
         
         //插入時(shí)不指定sex的值 ,會(huì)默認(rèn)Wie‘3’
         insert tb5(user_name) values("Tom");
    

約束

約束:

  1. 約束保證數(shù)據(jù)的完整性和一致性
  2. 約束分為表級(jí)約束和列級(jí)約束
  3. 約束類型包括:
    NOT NULL    (非空約束)  
    PRIMARY KEY (主鍵約束)  
    UNIQUE KEY  (唯一約束)  
    DEFAULT     (默認(rèn)值約束)  
    FOREIGN KEY (外鍵約束)
  • 外鍵約束

    作用:保證數(shù)據(jù)一致性,完整性;實(shí)現(xiàn)一對(duì)一或多對(duì)多關(guān)系。
    要求:
    1. 父表和子表必須使用相同的存儲(chǔ)引擎,而且禁止使用臨時(shí)表。
    2. 數(shù)據(jù)表的存儲(chǔ)引擎只能為InnoDB。
    3. 外鍵列和參照列必須具有相似的數(shù)據(jù)類型。其中數(shù)字的長(zhǎng)度或是否有符號(hào)位必須相同;而字符的長(zhǎng)度則可以不同。
    4. 外鍵列和參照列必須創(chuàng)建索引。

    • 主鍵在創(chuàng)建的同時(shí)會(huì)自動(dòng)創(chuàng)建索引,所以如果參照列為主鍵的話,則會(huì)自動(dòng)創(chuàng)建索引(一般參照列就是作為主鍵存在);而如果參照列不是主鍵而又不存在索引的話,MySQL不會(huì)自動(dòng)創(chuàng)建索引;

    • 外鍵列不存在索引的話,MySQL會(huì)自動(dòng)創(chuàng)建索引。

        -- 父表(子表所參照的表叫父表)
        create table provinces(
            id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,        -- 參照列(主鍵在創(chuàng)建的同時(shí)會(huì)自動(dòng)創(chuàng)建索引,所以參照列其實(shí)已經(jīng)有了索引)
            p_name VARCHAR(20) NOT NULL
        
        );
        
        -- 子表(有外鍵的表稱為子表)
        create Table users(
            id smallint UNSIGNED PRIMARY KEY AUTO_INCREMENT,
            username VARCHAR(10) NOT NULL,
            pid SMALLINT UNSIGNED,                  -- 外鍵列(外鍵列上沒有創(chuàng)建索引,Mysql則會(huì)自動(dòng)創(chuàng)建索引)
            FOREIGN KEY (pid) REFERENCES provinces (id)
        
        );
        
        -- 查看某張表的索引
        SHOW INDEX FROM provinces;
      
  • 外鍵約束的參照操作

    • CASECADE:從父表刪除或更新且自動(dòng)刪除或更新子表中匹配的行
    • SET NULL:從父表刪除或更新行,并設(shè)置子表中的外鍵列為 NULL;如果使用該選項(xiàng),必須保證子表列沒有指定NOT NULL
    • RESTRICT:拒絕對(duì)父表的刪除和更新操作
    • NO ACTION:標(biāo)準(zhǔn) SQL 的關(guān)鍵字,在 MySQL 中與 RESTRICT 相同

在實(shí)際開放中,很少使用物理外鍵約束,很多都去使用邏輯的外鍵約束,因?yàn)槲锢淼耐怄I約束只有InnoDB這種引擎才得以支持;邏輯外鍵就是指:在定義兩張表的結(jié)構(gòu)的時(shí)候,我們是按照存在著某種結(jié)構(gòu)的方式去定義,但是不去使用 FOREIGN KEY 這個(gè)關(guān)鍵字

  • 表級(jí)約束和列級(jí)約束 (按參照數(shù)目劃分)
    • 表級(jí)約束:對(duì)一個(gè)數(shù)據(jù)列定義的約束
    • 表級(jí)約束:對(duì)多個(gè)數(shù)據(jù)列定義的約束
    • 列級(jí)約束即可以在列定義時(shí)聲明,也可以在列定以后聲明,表級(jí)約束只能在列定義后說明

修改數(shù)據(jù)表

  • 添加刪除列:

      -- 添加一列 默認(rèn)值添加在最后面
      ALTER TABLE users ADD COLUMN age TINYINT UNSIGNED NOT NULL DEFAULT 10;
      
      -- 添加一列  添加到 username 字段后面 默認(rèn)值為'龜孫子'
      ALTER TABLE users ADD COLUMN sex VARCHAR(20) NOT NULL DEFAULT '龜孫子' AFTER username;
      
      -- 添加一列  到第一列 
      ALTER TABLE users ADD COLUMN true_name VARCHAR(20) NOT NULL DEFAULT '超人' FIRST;
      
      
      -- 添加多列 不能指定位置關(guān)系,只能在原來數(shù)據(jù)表列的下方
      
      
      -- 刪除一列
      ALTER TABLE users DROP COLUMN true_name;
      
      -- 刪除多列
      ALTER TABLE users DROP COLUMN sex,DROP COLUMN age   
    
  • 添加、刪除約束

      -- 添加主鍵約束
      ALTER TABLE user2 ADD COLUMN id SMALLINT UNSIGNED;          -- 添加id字段
      ALTER TABLE user2 ADD CONSTRAINT PK_user2_id PRIMARY KEY(id);       -- 將id字段設(shè)置為主鍵
      
      -- 添加唯一約束  
      ALTER TABLE user2 ADD UNIQUE(username)
      
      -- 添加外鍵約束  
      ALTER TABLE user2 ADD FOREIGN KEY (pid) REFERENCES provinces (id);
      
      -- 添加或刪除默認(rèn)約束
      -- 設(shè)置age字段默認(rèn)值約束=15 
      ALTER TABLE user2 ALTER COLUMN age SET DEFAULT 15
      -- 刪除默認(rèn)值
      ALTER TABLE user2 ALTER COLUMN age DROP DEFAULT 
      
      
      --  刪除主鍵約束
      ALTER TABLE user2 DROP PRIMARY KEY ;
      
      -- 刪除唯一約束
      show INDEXES from user2;                                    -- 先查看指定約束
      ALTER TABLE user2 DROP INDEX username;      -- 再根據(jù)約束名稱刪除指定約束
      
      -- 刪除外鍵約束  
      ALTER TABLE user2 DROP FOREIGN KEY user2_ibfk_1;    
    
  • 修改列定義和更名數(shù)據(jù)表

    -- 修改列定義 位置放到第一個(gè) (注意大類型改為小類型會(huì)精度丟失)
    ALTER TABLE user2 MODIFY COLUMN id SMALLINT UNSIGNED NOT NULL FIRST;

    -- 修改列名稱 id改為user_id,類型改為INT
    ALTER TABLE user2 CHANGE COLUMN id user_id INT UNSIGNED NOT NULL ;  
    
    -- 修改數(shù)據(jù)表的名稱 為 user3
    ALTER TABLE user2 RENAME user3;
    -- 修改數(shù)據(jù)表的名稱 為 user2
    RENAME TABLE user3 TO  user2;   
  • 插入記錄 INSERT

      INSERT person VALUES(NULL,'tom','123',16,1);      -- id 為主鍵可用 null 或 default 替代
      INSERT person VALUES(NULL,'tom',MD5('123'),17,0)  -- MD5加密存儲(chǔ)
      INSERT person VALUES(NULL,'tom',MD5('123'),10*3-9,0);  -- 表達(dá)式
      INSERT person VALUES(NULL,'jerry','54321',17,1),(DEFAULT,'MARI','1993',18,0);                                -- 插入多個(gè)
      
      
      第二種方式:可以使用子查詢
      INSERT person SET user_name= 'Ben' , pass_word ='123456' ;
    
  • 單表更新記錄 UPDATE

      -- 更新 person 表 age 字段的值  省略where條件將操作全部列記錄
      UPDATE person SET age = age + 5;
      -- 更新多個(gè)字段  
      UPDATE person SET age = age + id,sex = 0;
      -- 設(shè)置id是偶數(shù)的  年齡+10
      UPDATE person SET age = age + 10 WHERE id % 2 = 0;
    
  • 單表刪除記錄 DELETE

      DELETE FROM person WHERE id = 6;     -- 從person表刪除id=6的那行
    

查詢 SELECT

-- 查找記錄  
SELECT select_expr[,select_expr ...]
[
    FROM table_reference
   [WHERE where_condition]
   [GROUP BY {col_name | position} [ASC|DESC],...]
   [HAVING where_condition]
   [ORDER BY {col_name | expr | position} [ASC|DESC],...]
   [LIMIT {[offset,] row_count | row_count OFFSET offset}]

]

select_expr:查詢表達(dá)式
每一個(gè)表達(dá)式表示想要的一列,必須有至少一個(gè)
每個(gè)列之間以英文逗號(hào)分隔
星號(hào)(*)表示所有列,tbl_name.*可以表示命名表的所有列
查詢表達(dá)式可以使用[AS] alias_name為其賦予別名
別名可用于GROUP BY,ORDER BY 或 HAVING 子句

基本查詢:

  • 查詢 person 表下所有字段

      SELECT * FROM person;                               
    
  • 查詢 person 表下部分字段

      SELECT user_name,pass_word FROM person;         
    
  • 查詢時(shí)指定結(jié)果集字段別名

      SELECT user_name AS '用戶名',pass_word AS '密碼' FROM person;    
    

條件表達(dá)式 WHERE:

對(duì)記錄進(jìn)行過濾,如果沒有指定 WHERE 子句,則顯示所有記錄。在 WHERE 表達(dá)式中,可以使用 MySQL 支持的函數(shù)或運(yùn)算符。

查詢結(jié)果分組 GROUP BY:

  • 查詢男女的人數(shù)

    select sex,COUNT(*) as '人數(shù)' from person GROUP BY sex;

  • 查詢總?cè)藬?shù)大于3的性別

      SELECT sex,COUNT(*) as '人數(shù)' FROM person GROUP BY sex HAVING COUNT(*)>3 ;    
    

排序 ORDER BY:

語法 : order by 字段 asc/desc
ASC : 順序,正序。數(shù)值:遞增,字母:自然順序(a-z)
DESC: 倒序,反序。數(shù)值:遞減,字母:自然反序 (z-a)

  • 默認(rèn)情況下,按照插入記錄順序排序

    select * from student;
    
  • 按照id排序

      select * from student order by id ASC;   //按照id順序排序
      select * from student order by id DESC;  //按照id倒序排序
    
  • 多個(gè)排序條件:按照英語成績(jī)正序順序,如果英語成績(jī)相同,按照語文成績(jī)倒序

      select * from student order by english ASC,chinese DESC;
    

限制查詢結(jié)果返回的數(shù)量 Limit(起始行,查詢幾行)(startRow,pageSize)

  • 起始行從0開始

  • 分頁:當(dāng)前頁 每頁顯示多少條

  • 分頁查詢當(dāng)前頁的數(shù)據(jù)的sql:

      SELECT * FROM student LIMIT (當(dāng)前頁-1)*每頁顯示多少條,每頁顯示多少條;
    
  • 例子

      查詢第1,2條記錄(第1頁的數(shù)據(jù)):SELECT * FROM student LIMIT 0,2;
      
      查詢第3,4條記錄(第2頁的數(shù)據(jù)):SELECT * FROM student LIMIT 2,2;
      
      查詢第5,6條記錄(第3頁的數(shù)據(jù)):SELECT * FROM student LIMIT 4,2;
      
      查詢第7,8條記錄 (沒有記錄不顯示):SELECT * FROM student LIMIT 6,2;
    

子查詢
子查詢(subQuery)是指出現(xiàn)在其他 SQL 語句內(nèi)的 SELECT 子句。
例如:
SELECT * FROM t1 WHERE col1= (SELECT col2 FROM t2);
其中,SELECT * FROM t1 稱為 Outer Query/OuterStatement (外層查詢、外層聲明)
SELECT col2 FROM t2,稱為 subQuery(子查詢)

子查詢指嵌套在查詢內(nèi)部,且必須始終出現(xiàn)在圓括號(hào)內(nèi)。
子查詢可以包含多個(gè)關(guān)鍵字或條件,
如 DISTINCY 、GROUP BY、ORDER BY、LIMIT,函數(shù)等
子查詢的外層查詢可以是 SELECT 、INSERT、UPDATE、SET、或DO。
子查詢可以返回標(biāo)量、一行、一列或子查詢

  1. 使用比較運(yùn)算符的子查詢

    =、>、<、>=、<=、<>、!=、<=> 這些運(yùn)算符可以引發(fā)子查詢
    如果要和子查詢結(jié)果做運(yùn)算,而子查詢結(jié)果為多條時(shí),使用ANY、SUM、ALL三個(gè)關(guān)鍵字:
    ANY、SUM:符合其中一個(gè)
    ALL:符合全部

     -- 查詢均價(jià) 
     SELECT AVG(`goods_price`) FROM `tdb_goods` ;
     
     -- 查詢均價(jià)     (四舍五入,保留兩位小數(shù))
     SELECT ROUND(AVG(`goods_price`), 2) AS '均價(jià)' FROM `tdb_goods` ;
     
     -- 查詢大于均價(jià)的商品
     SELECT `goods_id`,`goods_name`,`goods_price` FROM `tdb_goods`  WHERE `goods_price` > (SELECT ROUND(AVG(`goods_price`), 2) FROM `tdb_goods`);
     
     
     -- 查詢超極本的價(jià)格
     SELECT `goods_price` FROM `tdb_goods`  WHERE `goods_cate`='超級(jí)本';
     
     -- 查詢哪些商品的價(jià)格大于超極本 
     SELECT `goods_name`,`goods_price` FROM `tdb_goods`  WHERE `goods_price` >ANY (
     
         SELECT `goods_price` FROM `tdb_goods`  WHERE `goods_cate`='超級(jí)本'
     
     );
    
  2. 使用 [NOT] IN 的子查詢

    =ANY 運(yùn)算符與 IN 等效
    != ALL 或 <>ALL運(yùn)算符與 NOT IN 等效

  3. 使用 [NOT] EXISTS 的子查詢

    如果子查詢返回任何行,EXISTS 將返回 TRUE;否則返回 FALSE。

將查詢結(jié)果寫入數(shù)據(jù)表:INSERT...SELECT

    INSERT [INTO] tbl_name [(col_name ,...)]  
    SELECT ...  
    
    --  1. 創(chuàng)建分類空表
    CREATE TABLE IF NOT EXISTS tdb_goods_cates(
    
        cate_id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
        cate_name VARCHAR(40) NOT NULL
    
    );
    
    
    -- 2. 將查詢到的分類 goods_cate 數(shù)據(jù) 插入到 tdb_goods_cates 表中的 cate_name 字段
    INSERT INTO `tdb_goods_cates` (cate_name)  SELECT `goods_cate` FROM `tdb_goods`GROUP BY `goods_cate`;  
    
    -- 查詢商品表
    SELECT * FROM `tdb_goods_cates` 
  • 多表更新:參照另外一張表來更新當(dāng)前表的記錄

      UPDATE table_references                -- 表參照關(guān)系  
      SELECT col_name1={expr1|DEFAULT}  
      [col_name2={expr2|DEFAULT} ]...   
      [WHERE where_condition]
    
  • 表的參照關(guān)系 :表通過 INNER JOIN 或 LEFT JOIN 去連接另外一張表

     table_references            -- 表1
     {[INNER|CROSS] JOIN | {LEFT | RIGHT} [OUTER] JOIN}  -- 連接類型
     table_references            -- 表2
     ON conditional_expr         -- 連接條件
    

    連接類型:

    • INNER JOIN:內(nèi)連接 【用的較多】
      顯示左表和右表中交集(公共)的部分(僅顯示符合連接條件的記錄)
    • LEFT [OUTER] JOIN:左外連接
      顯示左表的全部記錄及右表符合連接條件的記錄。
    • RIGHT [OUTER] JOIN:右外連接
      顯示右表的全部記錄及左表符合連接條件的記錄。
    • 自身連接
      電商分類,虛擬一張相同的表,使用內(nèi)連接
    3. 使用內(nèi)連接更新:
    UPDATE tdb_goods INNER JOIN `tdb_goods_cates` ON `goods_cate`=`cate_name` SET `goods_cate`=`cate_id`;       -- ON... 連接條件   
    
連接條件:  
使用 ON 關(guān)鍵字來設(shè)定連接條件,也可以使用 WHERE 來代替。  
通常使用 ON 關(guān)鍵字來設(shè)定連接條件  
使用 WHERE 關(guān)鍵字進(jìn)行結(jié)果集記錄的過濾  
  • 表連接:
    外鍵的逆向操作,外鍵把數(shù)據(jù)分開來存儲(chǔ),通過連接又將多張表聯(lián)系在一起。
    外連接:

    子查詢和連接這里有點(diǎn)模糊 ,后面有時(shí)間再屢一下...

運(yùn)算符和函數(shù)

內(nèi)置函數(shù)庫(kù)

  1. 字符函數(shù)

    • CONCAT() : 字符連接

        SELECT CONCAT('A', 'B');          -- 結(jié)果:AB
        SELECT CONCAT('1','-','2');       -- 結(jié)果:1-2
        SELECT CONCAT(first_name,last_name) AS 'full name' FROM tb_name; --拼接姓名
      
    • CONCAT_WS(): 使用指定的分隔符進(jìn)行字符連接

        SELECT CONCAT_WS('|', 'A','B','C')  -- 結(jié)果 A|B|C   
        SELECT CONCAT_WS('-',first_name,last_name) AS 'full name' FROM tb_name -- 結(jié)果:sun-wukong
      
    • FORMAT(): 數(shù)字格式化

        SELECT FORMAT(120.24,0)         -- 120
        SELECT FORMAT(120.25,1)         -- 120.3
        SELECT FORMAT(120.24,1)         -- 120.2
        SELECT FORMAT(120.24,3)         -- 120.240
      
    • LOWER(): 轉(zhuǎn)換成小寫

        SELECT LOWER('MySQL')           -- mysql
      
    • UPPER(): 轉(zhuǎn)換成大寫

        SELECT UPPER('MySQL')           -- MYSQL 
      
    • LEFT(): 獲取左側(cè)字符

        SELECT LEFT('MySQL',2)          -- My
        SELECT UPPER(LEFT('MySQL',2))   -- 函數(shù)嵌套
      
    • RIGHT(): 獲取右側(cè)字符

        SELECT RIGHT('MySQL',3)         -- SQL
        SELECT LOWER(RIGHT('MySQL',3)   -- sql  
      
    • LENGTH(): 獲取字符長(zhǎng)度

        SELECT LENGTH("MySQL")      -- 5
        SELECT LENGTH("My SQL")     -- 6
      
    • LTRIM(): 刪除左邊空格

    • RTRIM(): 刪除右邊空格

    • TRIM (): 刪除左邊&&右邊的空格

    • REPLACE(): 字符替換

        SELECT REPLACE('???My??SQL??','?','')     -- MySQL
        SELECT REPLACE('???My??SQL??','?','-')    -- ---My--SQL--
        SELECT REPLACE('???My??SQL??','?','!!')    -- !!!!!!My!!!!SQL!!!!
        SELECT REPLACE('???My??SQL??','?','!*')    -- !*!*!*My!*!*SQL!*!*
      
    • SUBSTRING(): 截取

        SELECT SUBSTRING('MySQL',1,2)    -- My   從1開始,不是從0開始
        SELECT SUBSTRING('MySQL',3)  -- SQL         SELECT SUBSTRING('MySQL',-1)     -- L
        SELECT SUBSTRING('MySQL',-3)     -- SQL  
      
    • LIKE: 模式匹配

        SELECT 'MYSQL' LIKE 'M%'    -- 1 %指任意字符、_代表任意一個(gè)字符 
      

  2. 數(shù)值運(yùn)算符和函數(shù)

    • CEIL(): 向上取整 / 進(jìn)一取整

        SELECT CEIL(3.01)       -- 4
        SELECT CEIL(3.99)       -- 4
      
    • FLOOR(): 向下取整 / 舍一取整

        SELECT FLOOR(3.01)      -- 3
        SELECT FLOOR(3.99)      -- 3  
      
    • DIV: 整數(shù)除法(類似java中的除法)

        SELECT 3/4                -- 0.7500
        SELECT 3 DIV 4              -- 0
        SELECT 4 DIV 3              -- 1  
      
    • MOD(%): 取余數(shù) (模)

        SELECT 2 MOD 5;     -- 2
        SELECT 5 MOD 2;    -- 1
        SELECT 5.3 % 3;     -- 2.3
        
* POWER():    冪運(yùn)算 m的n次方   

        SELECT POWER(3, 3)      -- 3的3次方  3*3*3 
        
* ROUND():      四舍五入  

        SELECT ROUND(3.652,1)       -- 3.7
        SELECT ROUND(3.652,2)       -- 3.65
        SELECT ROUND(3.655,2)       -- 3.66
        SELECT ROUND(3.655,0)       -- 4
  1. 比較運(yùn)算符和函數(shù)

    • [NOT] BETWEEN ... AND ... [不]在范圍內(nèi)

        SELECT 35 BETWEEN 1 AND 22  -- 0
        SELECT 35 BETWEEN 1 AND 36  -- 1
        SELECT 35 NOT BETWEEN 1 AND 34  -- 1
      
    • [NOT] IN() [不]在列出值范圍之內(nèi)

        SELECT 10 IN(5,10,15,20)        -- 1
        SELECT 30 IN(5,10,15,20)        -- 0
      
    • IS [NOT] NULL [不]為空

       SELECT NULL IS NULL     -- 1
       SELECT '' IS NULL          -- 0
       SELECT 0 IS NULL           -- 0 
      
  2. 時(shí)間日期函數(shù)

    • NOW(): 當(dāng)前日期和時(shí)間

        SELECT NOW()            --  2018-03-22 17:08:26
      
    • CURDATE(): 當(dāng)前時(shí)間

        SELECT CURDATE()        --  2018-03-22
      
    • CURTIME(): 當(dāng)前時(shí)間

        SELECT CURTIME()         --     17:08:58
      
    • DATE_ADD(): 日期變化

        SELECT DATE_ADD('2018-03-22',INTERVAL 365 DAY)   -- 2019-03-22
        SELECT DATE_ADD('2018-03-22',INTERVAL -365 DAY)  -- 2017-03-22
        SELECT DATE_ADD('2018-03-22',INTERVAL 1 YEAR)    -- 2019-03-22
        SELECT DATE_ADD('2018-03-22',INTERVAL 3 WEEK)    -- 2018-04-12
      
    • DATEDIFF(): 日期差值

        SELECT DATEDIFF('2018-03-22','2019-03-22')  -- -365
        SELECT DATEDIFF('2018-03-22','2017-03-22    -- 365
      
    • DATE_FORMAT(): 日期格式化

        SELECT DATE_FORMAT('2018-03-22', '%m/%d/%Y')    -- 03/22/2018
      
  3. 信息函數(shù)

        --   返回當(dāng)前連接的id(線程id)
        SELECT CONNECTION_ID()
        
        --    當(dāng)前打開的數(shù)據(jù)庫(kù)
        SELECT DATABASE()
        
        -- 最后插入記錄的ID號(hào)
        SELECT LAST_INSERT_ID()
        
        -- 當(dāng)前用戶  root@localhost
        SELECT USER()
        
        -- 當(dāng)前數(shù)據(jù)庫(kù)版本信息 5.7.21
        SELECT VERSION()
    
  4. 聚合函數(shù)
    特點(diǎn):只有一個(gè)返回值

    * AVG():    平均值
    * COUNT():  計(jì)數(shù)
    * MAX():    最大值
    * MIN:     最小值
    * SUM():    求和
    
  5. 加密函數(shù)

    • MD5():信息摘要算法
    • PASSWORD():密碼算法

自定義函數(shù)

用戶自定義函數(shù)(UDF),是一種對(duì)MySQL擴(kuò)展的途徑,其用法與內(nèi)置函數(shù)相同
作用:將一些經(jīng)常使用的方法提前定義好,方便調(diào)用

  • 創(chuàng)建自定義函數(shù)

      CREATE FUNCTION function_name    
      RETURNS                                 -- 返回值類型
      {STRING | INTEGER | REAL | DECIMAL}  
      routine_body                            -- 函數(shù)體
    
  • 關(guān)于函數(shù)體

    1). 由合法的 SQL 語句構(gòu)成,
    2). 也可以是簡(jiǎn)單的 SELECT 或 INSERT 語句
    3). 如果為復(fù)合結(jié)構(gòu)則使用 BEGIN...END 語句
    4). 復(fù)合結(jié)構(gòu)可以包含聲明,循環(huán),控制結(jié)構(gòu)

  • 創(chuàng)建不帶參數(shù)的自定義函數(shù)

      SELECT DATE_FORMAT(NOW(), '%Y年%m月%d日 %H時(shí):%i分:%s秒')   -- 2018年03月22日 19時(shí):19分:16秒
      
      //自定義函數(shù)
      CREATE FUNCTION f1() RETURNS VARCHAR(30)
      RETURN DATE_FORMAT(NOW(), '%Y年%m月%d日 %H時(shí):%i分:%s秒');
    
      //調(diào)用  
      SELECT f1();    -- 2018年03月22日 19時(shí):19分:16秒  
    
      //刪除方法
      DROP FUNCTION f1();
    
  • 創(chuàng)建帶有參數(shù)的自定義函數(shù)

      //新建帶參函數(shù)
      CREATE FUNCTION f2(num1 SMALLINT UNSIGNED,num2 SMALLINT UNSIGNED)
      RETURNS FLOAT(10,2)             
      RETURN (num1 + num2)/2;         -- 返回兩個(gè)參數(shù)和除以2
    
      //調(diào)用
      SELECT f2(1,5);
    

存儲(chǔ)過程

  • 存儲(chǔ)過程是 SQL 語句和控制語句的預(yù)編譯集合,以一個(gè)名稱存儲(chǔ)并作為一個(gè)單元處理。存儲(chǔ)過程存儲(chǔ)在數(shù)據(jù)庫(kù)內(nèi),省略了 MySQL引擎對(duì)SQL語句語法分析和編譯,客戶端調(diào)用則直接調(diào)用編譯的結(jié)果,所以執(zhí)行速度較快,同時(shí)增強(qiáng)了 SQL 語句的功能和靈活性,減少了網(wǎng)絡(luò)流量。

  • 參數(shù)

    • IN:表示改參數(shù)的值必須在調(diào)用存儲(chǔ)過程中指定
    • OUT:表示該參數(shù)的值可以被存儲(chǔ)過程改變,并且可以返回
    • INOUT:表示該參數(shù)的調(diào)用時(shí)指定,并且可以被改變了返回(都可以)
  • 過程體

    • 過程體由合法的SQL語句構(gòu)成
    • 過程體可以是任意SQl語句
    • 過程體如果我復(fù)合結(jié)構(gòu),則使用 BEGIN...END語句
    • 復(fù)合結(jié)構(gòu)可以包含聲明、循環(huán)、控制結(jié)構(gòu)。
  • 創(chuàng)建不帶參數(shù)的存儲(chǔ)過程

      CREATE PROCEDURE test_pro()
      SELECT VERSION();
      
      //調(diào)用
      CALL test_pro();
    
  • 創(chuàng)建帶有IN類型參數(shù)的存儲(chǔ)過程

      DELIMITER $             -- 定界符
      CREATE PROCEDURE delPersonById(p_id INT UNSIGNED)
      BEGIN
      DELETE FROM person WHERE id = p_id;         -- 過程體
      END $ 
      
      -- 調(diào)用存儲(chǔ)過程
      CALL delPersonById(5);
    
  • 創(chuàng)建帶有OUT類型參數(shù)的存儲(chǔ)過程

      -- 從 person 表中根據(jù)id刪除一條數(shù)據(jù),并將 剩余總數(shù)設(shè)置到輸出參數(shù) num 字段
      DELIMITER $ 
      CREATE PROCEDURE delUserReturnNums(IN p_id INT,OUT userNums INT)
      BEGIN
      
      DELETE FROM person WHERE id = p_id;
      SELECT COUNT(id) FROM person INTO userNums;     -- 將 SELECT 表達(dá)式的結(jié)果放入到 userNums 變量
      
      END $
      
      -- 調(diào)用存儲(chǔ)過程
      CALL `delUserReturnNums`(4,@nums);
      
      -- 查看 nums 的值
      SELECT @nums 
      
      -- 聲明一個(gè)用戶變量:跟MySQL客戶端綁定,這種方式設(shè)定的變量只對(duì)當(dāng)前用戶所使用的客戶端生效
      SET @i = 8; 
    
  • 創(chuàng)建帶有多個(gè)OUT類型參數(shù)的存儲(chǔ)過程

      -- 根據(jù)年齡刪除用戶:返回兩個(gè)參數(shù) 1.刪除的用戶數(shù)量 2. 剩余的用戶數(shù)量
      DELIMITER $
      CREATE PROCEDURE delUsersByAgeReturnInfos(IN p_age INT,OUT delUsers INT,OUT userCount INT)
      BEGIN
      DELETE FROM person WHERE age = p_age;   -- 根據(jù)年齡刪除用戶 
      SELECT ROW_COUNT() INTO delUsers;                           -- 返回上一次操作影響的行數(shù)
      SELECT COUNT(id) FROM person INTO userCount;
      END $
      
      
      
      -- 調(diào)用存儲(chǔ)過程
      CALL delUsersByAgeReturnInfos(14,@A,@B);
      
      -- 查看返回結(jié)果變量
      SELECT @A;
      SELECT @B;
    
  • 存儲(chǔ)過程與自定義函數(shù)的區(qū)別

    • 存儲(chǔ)過程實(shí)現(xiàn)相對(duì)復(fù)雜;而函數(shù)針對(duì)性較強(qiáng)
    • 存儲(chǔ)過程可以返回多個(gè)值;函數(shù)只能有一個(gè)返回值
    • 存儲(chǔ)過程一般是獨(dú)立的來執(zhí)行;而函數(shù)可以作為其他SQL語句的組成部分來實(shí)現(xiàn)。

存儲(chǔ)引擎

MySQL 可以將數(shù)據(jù)以不同的技術(shù)存儲(chǔ)在文件(內(nèi)存)中,這種技術(shù)成為存儲(chǔ)引擎。
每一種存儲(chǔ)引擎使用了不同的存儲(chǔ)機(jī)制、索引技巧、鎖定水平、最終提供廣泛且不同的功能。
關(guān)系型數(shù)據(jù)庫(kù)中數(shù)據(jù)的存儲(chǔ)是以表的形式來實(shí)現(xiàn)的,所以說存儲(chǔ)引擎也可以稱為表類型。
一種技術(shù):一種存儲(chǔ)數(shù)據(jù)

  • MySQL 支持的存儲(chǔ)引擎

    • MyISAM:
      存儲(chǔ)限制可達(dá)256TB,支持索引,表級(jí)鎖定,數(shù)據(jù)壓縮;適用于事務(wù)的處理不多的情況。
    • InnoDB:
      存儲(chǔ)限制可達(dá)64TB,支持事務(wù)和索引,鎖顆粒為行鎖;適用于事務(wù)處理比較多,需要有外鍵支持的情況 。
      其他等等...
  • 并發(fā)控制

    • 當(dāng)多個(gè)連接對(duì)記錄進(jìn)行修改時(shí)保證數(shù)據(jù)的一致性和完整性
    • 在處理并發(fā)讀或并發(fā)寫時(shí),系統(tǒng)會(huì)使用一套鎖機(jī)制來解決這個(gè)問題
  • 鎖:

    • 共享鎖(讀鎖):
      在某一資源上 讀鎖是共享的(互不阻塞),在同一時(shí)間段內(nèi),多個(gè)用戶可以同時(shí)讀取同一個(gè)資源,讀取過程中數(shù)據(jù)不會(huì)發(fā)生任何變化。

    • 排他鎖(寫鎖):
      在任何時(shí)候,只能有一個(gè)用戶來寫入資源,當(dāng)進(jìn)行寫鎖時(shí)會(huì)阻塞其他的讀鎖或者寫鎖操作。

    • 鎖顆粒

      • 表鎖:是一種開銷最小的鎖策略
      • 行鎖:是一種開銷最大的鎖策略(支持最大并發(fā)操作處理)
        • 怎么理解呢,就是每條記錄都要加,所以開銷最大
  • 事務(wù)

    • 用于保證數(shù)據(jù)庫(kù)的完整性
    • 特征:
      • 原子性
      • 一致性
      • 隔離性
      • 持久性
  • 外鍵

    • 是保證數(shù)據(jù)一致性的策略
  • 索引

    • 是對(duì)數(shù)據(jù)表中一列或者多列的值進(jìn)行排序的一種結(jié)構(gòu)。

使用索引可以快速的訪問數(shù)據(jù)表中的特定信息,索引是進(jìn)行記錄快速定位的一種方法,好比是書的目錄,如果我們要快速找到這本書的某一部分內(nèi)容,那么我們應(yīng)該首先在目錄當(dāng)中查找相應(yīng)的章節(jié),然后看一下他在第幾頁,再快速定位到相應(yīng)的頁碼查找想看的內(nèi)容。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 第1章 初涉MySQL 1.1 MySQL文件 (1)MySQL目錄結(jié)構(gòu) (2)MySQL配置向?qū)募ò惭b后配置...
    凜0_0閱讀 992評(píng)論 1 0
  • 1、MySQL啟動(dòng)和關(guān)閉(安裝及配置請(qǐng)參照百度經(jīng)驗(yàn),這里不再記錄。MySQL默認(rèn)端口號(hào):3306;默認(rèn)數(shù)據(jù)類型格式...
    強(qiáng)壯de西蘭花閱讀 761評(píng)論 0 1
  • 閑修連月宏圖起,直取黃龍夢(mèng)日邊。 莫教玉笛飛月夜,書山學(xué)海一游仙。 (新韻)
    晴鶴1閱讀 223評(píng)論 0 6
  • 期待了很久,2018年終于來到了。新的一年,我是從加班開始的。其實(shí)我對(duì)加班這件事情并沒有太多的怨言,尤其是在我算過...
    夏煙閱讀 165評(píng)論 0 1
  • 1.區(qū)分觀察與評(píng)論 你是否也曾將自己的意見與觀察混為一談的說出來,是否感受到不同語言表達(dá)式帶給別人的不同感受,區(qū)分...
    fish__dora閱讀 217評(píng)論 0 2

友情鏈接更多精彩內(nèi)容