1. 程式人生 > >mysql 命令的基本操作

mysql 命令的基本操作

mysql 資料庫的所有操作的基本命令彙總:

"""
菜鳥教程 mysql介紹
"""
# 技術部落格網站:
# https://blog.csdn.net/sinat_35861727/article/details/78866904

# https://www.cnblogs.com/cxxjohnson/p/5914583.html                  MySQL 常用語句大全

# https://www.2cto.com/database/201712/702968.html     mysql orm 網址

# 備註:一個數據表只可以有一個主鍵,所以不存在刪除某一列的主鍵

"""
一、MySQL的管理

    1、管理MySQL的命令

        SHOW DATABASES 列出 MySQL 資料庫管理系統的資料庫列表
        eg: show DATABASES;

        USE 資料庫名   選擇要操作的Mysql資料庫,使用該命令後所有Mysql命令都只針對該資料庫
        eg: use mydb;

        SHOW TABLES   顯示指定資料庫的所有表,使用該命令前需要使用 use 命令來選擇要操作的資料庫
        eg: use mydb; show tables;

        SHOW COLUMNS FROM 資料表  顯示資料表的屬性,屬性型別,主鍵資訊 ,是否為 NULL,預設值等其他資訊
        eg: use mydb; show columns from mydb.mytable;

        SHOW INDEX FROM   資料表  顯示資料表的詳細索引資訊,包括PRIMARY KEY(主鍵)
        eg: use mydb; show index from mydb.mytable;

        SHOW TABLE STATUS LIKE [FROM db_name] [LIKE 'pattern'] \G; 該命令將輸出Mysql資料庫管理系統的效能及統計資訊。
        eg:
            SHOW TABLE STATUS  FROM RUNOOB;   # 顯示資料庫 RUNOOB 中所有表的資訊

            SHOW TABLE STATUS from RUNOOB LIKE 'runoob%';     # 表名以runoob開頭的表的資訊

            SHOW TABLE STATUS from RUNOOB LIKE 'runoob%'\G;   # 加上 \G,查詢結果按列列印
"""
"""
二、 mysql連線

    1、pymysql 連線資料庫的兩種方式
        第一種寫法:
            import pymysql.cursors

            # Connect to the database
            connection = pymysql.connect(
                host='127.0.0.1',
                port=3306,
                user='root',
                password='root',
                db='haha',
                charset='utf8',

                cursorclass=pymysql.cursors.DictCursor
                # 如果不加這個,打印出來的result為元組,  加上這個 列印的result 結果為列表裡面包含字典。
             )
        第二種方法: 用字典進行連線引數的管理,這樣子更優雅,推薦使用
                import pymysql.cursors

                #連線配置資訊
                config = {
                          'host':'127.0.0.1',
                          'port':3306,
                          'user':'root',
                          'password':'root',
                          'db':'haha',
                          'charset':'utf8',
                          'cursorclass':pymysql.cursors.DictCursor,
                          }
                # 建立連線
                connection = pymysql.connect(**config)

                # 建立遊標方法1
                cursor = connection.cursor()

                # 建立遊標方法2 取別名為 cursor
                with connection.cursor() as cursor:
                    # 執行sql語句,插入記錄
                    sql = 'INSERT INTO employees (first_name, last_name, hire_date, gender, birth_date) VALUES (%s, %s, %s, %s, %s)'
                    cursor.execute(sql, ('Robin', 'Zhyea', tomorrow, 'M', date(1989, 6, 14)))

                # 沒有設定預設自動提交,需要主動提交,以儲存所執行的語句
                connection.commit()  # 連線提交事務
                cursor.close()       # 關閉遊標連線
                connection.close();  # 關閉連線,釋放記憶體
"""

"""
三、MySQL建立資料庫

    CREATE DATABASE 資料庫名;  建立一個數據庫
    eg: create  database  mydb charset='utf8';

四、MySQL刪除資料庫

    drop database <資料庫名>; drop 命令刪除資料庫
    eg:drop  database mydb;  刪除名字為 mydb的資料庫

五、MySQL選擇資料庫

    USE 資料庫名   選擇要操作的Mysql資料庫,使用該命令後所有Mysql命令都只針對該資料庫
    eg: use mydb;
"""
"""
六、MySQL 建立資料表

    建立MySQL資料表需要以下資訊: 表名、表字段名、定義每個表字段型別
    語法: CREATE TABLE table_name (column_name1 column_type1,column_name2 column_type2....);
    eg: mydb 資料庫中建立表名為 haha 的表
        USE mydb;
        CREATE TABLE 表名(欄位1,欄位2,欄位3...) CHARSET=utf8
        eg:
            CREATE TABLE IF NOT EXISTS `haha` (
                  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
                  `goods_name` varchar(255) NOT NULL,
                  `sku_id` int(11) NOT NULL,
                  `price` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '價格',
                  `quantity` decimal(15,6) NOT NULL COMMENT '採購噸數',
                  `quote_date` date NOT NULL COMMENT '日期',
                  PRIMARY KEY (`id`)
                ) ENGINE=InnoDB AUTO_INCREMENT=1966 DEFAULT CHARSET=utf8 COMMENT = '這是haha表';

        注: COMMENT 後面是加的註釋  可以給每行資料加上註釋,也可以給表加上註釋說明。  ENGINE=InnoDB 預設引擎都選這個。

七、MySQL 刪除資料表

    MySQL中刪除資料表是非常容易操作的, 但是你再進行刪除表操作時要非常小心,因為執行刪除命令後所有資料都會消失。
    語法: DROP TABLE table_name ;

    1、 delete 格式為:delete from 表名 where 刪除條件;  刪除表全部資料,表結構不變,
    對於 MyISAM 會立刻釋放磁碟空間,InnoDB 不會釋放磁碟空間;
    eg:刪除學生表內姓名為張三的記錄  delete from  student where  T_name = "張三";

    2、用truncate  格式為:truncate table 表名;         刪除表全部資料,保留表結構,立刻釋放磁碟空間 ,不管是 Innodb 和 MyISAM;
    eg:清除學生表內的所有資料  truncate  table  student;

    3、刪除表用 drop, 格式為:drop table 表名;          刪除表全部資料和表結構,立刻釋放磁碟空間,不管是 Innodb 和 MyISAM;
     eg:刪除學生表  drop table student;  執行後就是啥都沒了

    小結:
        1、當你不再需要該表時, 用 drop;                      執行後  ----->  表已經不存在了

        2、當你仍要保留該表,但要刪除所有記錄時, 用 truncate;  執行後  ----->  清除表內資料,儲存表結構。  id 從當前的開始

        3、當你要刪除部分記錄時, 用 delete。                  執行後  ----->  刪除表內資料,  id 會繼續增長,不會因為刪除而改變
"""
"""
八、MySQL 插入資料  (增)

    1、MySQL 表中使用 INSERT INTO SQL語句來插入資料。
    語法: INSERT INTO table_name ( field1, field2,...fieldN ) VALUES ( value1, value2,...valueN );
    eg:   INSERT INTO runoob_tbl  (runoob_title, runoob_author, submission_date) VALUES ("學習 PHP", "菜鳥教程", NOW());

    2、INSERT 插入多條資料
    INSERT INTO table_name  (field1, field2,...fieldN)  VALUES  (valueA1,valueA2,...valueAN),(valueB1,valueB2,...valueBN),(valueC1,valueC2,...valueCN)......;

    注: 插入一條資料的時候 values 和 value 都可以 ,插入多條用values,多條必須用 values(...),(...),(...)


  3、插入檢索出來的資料:

    >INSERT INTO tb_name(name,score) SELECT name,score FROM tb_name2;

    4、 有欄位設定預設值時,插入欄位的時候如果不插入值,使用預設值,但是 insert into table_name (field1,field2...)
        這個預設值欄位不能寫,寫了就要給值,既不寫都不寫,寫了都要寫。

九、MySQL 查詢資料  (查)

    MySQL 資料庫使用SQL SELECT語句來查詢資料。
    語法:
        SELECT
            column_name1,column_name2
        FROM
             table_name
        WHERE
            條件1,條件2, ...
        LIMIT N
        OFFSET M

    查詢語句中你可以使用一個或者多個表,表之間使用逗號(,)分割,並使用WHERE語句來設定查詢條件。
    注:
        SELECT 命令可以讀取一條或者多條記錄。
        你可以使用星號(*)來代替其他欄位,SELECT語句會返回表的所有欄位資料
        你可以使用 WHERE 語句來包含任何條件。
        你可以使用 LIMIT 屬性來設定返回的記錄數。
        你可以通過OFFSET指定SELECT語句開始查詢的資料偏移量。預設情況下偏移量為0

    limit (m,n) 也相當於 偏移m個  ,和 limit n,offset 是一致的。
    注意:
        limit是mysql的語法
        select * from table limit m,n
        其中m是指記錄開始的index,從0開始,表示第一條記錄
        n是指從第m+1條開始,取n條。
        select * from tablename limit 2,4
        即取出第3條至第6條,4條記錄

十、MySQL DELETE 刪除語句  (刪)

    使用SQL的 DELETE FROM 命令來刪除 MySQL 資料表中的記錄。
    語法: DELETE FROM table_name [WHERE 條件1,條件2...]
    eg:  DELETE FROM runoob_tbl WHERE runoob_id=3;

    注:
        如果 不寫WHERE 子句,MySQL 表中的所有記錄將被刪除。
        你可以在 WHERE 子句中指定任何條件

    示例:
        delete 語句用於刪除表中的資料, 基本用法為:

        delete from 表名稱 where 刪除條件;

        以下是在表 students 中的例項:

        刪除 id 為 3 的行: delete from students where id=3;

        刪除所有年齡小於 21 歲的資料: delete from students where age<20;

        刪除表中的所有資料: delete from students;

十一、MySQL UPDATE 查詢   (改)
    1、使用 SQL UPDATE 命令來操作。
        語法:UPDATE table_name SET field1=new-value1, field2=new-value2 [WHERE Clause]
        eg: UPDATE mytable SET title='學習 C++'  WHERE t_id=3;

    注意:
        你可以同時更新一個或多個欄位。
        你可以在 WHERE 子句中指定任何條件。
        你可以在一個單獨表中同時更新資料。

    示例:
        update 表名稱 set 列名稱=新值 where 更新條件;

        以下是在表 students 中的例項:

        將 id 為 5 的手機號改為預設的 - : update students settel=default where id=5;


        將所有人的年齡增加 1: update students set age=age+1;

        將手機號為 13288097888 的姓名改為 "小明", 年齡改為 19:
        update students set name="小明", age=19 where tel="13288097888";

    2、UPDATE替換某個欄位中的某個字元

        當我們需要將欄位中的特定字串批量修改為其他字串時,使用以下操作:
        UPDATE table_name SET field=REPLACE(field, 'old-string', 'new-string') [WHERE Clause]
        eg:
            以下例項將更新 t_id 為 3 title 欄位值的 "C++" 替換為 "Python":
            UPDATE mytable SET title = REPLACE(title, 'C++', 'Python') where t_id = 3;


"""

"""
十二、MySQL WHERE 子句

    語法:WHERE 子句從資料表中讀取資料的通用語法:
        SELECT field1, field2,...fieldN FROM table_name1, table_name2...[WHERE condition1 [AND [OR]] condition2...

    注:
        查詢語句中你可以使用一個或者多個表,表之間使用逗號, 分割,並使用WHERE語句來設定查詢條件。
        你可以在 WHERE 子句中指定任何條件。
        你可以使用 AND 或者 OR 指定一個或多個條件。
        WHERE 子句也可以運用於 SQL 的 DELETE 或者 UPDATE 命令。
        WHERE 子句類似於程式語言中的 if 條件

    操作符	   描述	                        例項
    =	       等號          檢測兩個值是否相等,如果相等返回true	(A = B) 返回false。
    <>, !=    不等於        檢測兩個值是否相等,如果不相等返回true	(A != B) 返回 true。
    >	       大於號        檢測左邊的值是否大於右邊的值, 如果左邊的值大於右邊的值返回true	(A > B) 返回false。
    <	       小於號        檢測左邊的值是否小於右邊的值, 如果左邊的值小於右邊的值返回true	(A < B) 返回 true。
    >=	       大於等於號    檢測左邊的值是否大於或等於右邊的值, 如果左邊的值大於或等於右邊的值返回true (A >= B) 返回false。
    <=	       小於等於號    檢測左邊的值是否小於於或等於右邊的值, 如果左邊的值小於或等於右邊的值返回true (A <= B)


關鍵字 BINARY :  區分 WHERE 子句的字串大小寫

    因為MySQL 的 WHERE 子句的字串比較是不區分大小寫的。
    所以可以使用 BINARY 關鍵字來設定 WHERE 子句的字串比較是區分大小寫的。
    eg:
        1、
            mysql> SELECT * from runoob_tbl WHERE BINARY runoob_author='runoob.com';

            Empty set (0.01 sec)

        2、
            mysql> SELECT * from runoob_tbl WHERE BINARY runoob_author='RUNOOB.COM';

            +-----------+---------------+---------------+-----------------+
            | runoob_id | runoob_title  | runoob_author | submission_date |
            +-----------+---------------+---------------+-----------------+
            | 3         | JAVA 教程   | RUNOOB.COM    | 2016-05-06      |
            | 4         | 學習 Python | RUNOOB.COM    | 2016-03-06      |
            +-----------+---------------+---------------+-----------------+
            2 rows in set (0.01 sec)
        3、
            mysql> SELECT * from runoob_tbl WHERE  runoob_author='runoob.com';

            +-----------+---------------+---------------+-----------------+
            | runoob_id | runoob_title  | runoob_author | submission_date |
            +-----------+---------------+---------------+-----------------+
            | 3         | JAVA 教程   | RUNOOB.COM    | 2016-05-06      |
            | 4         | 學習 Python | RUNOOB.COM    | 2016-03-06      |
            +-----------+---------------+---------------+-----------------+
            2 rows in set (0.01 sec)
"""

"""
十三、MySQL LIKE 子句

    SQL LIKE 子句中使用百分號 %字元來表示任意字元,類似於UNIX或正則表示式中的星號 *。
    語法:SELECT field1, field2,...fieldN  FROM table_name WHERE field1 LIKE condition1 [AND [OR]] filed2 = 'somevalue'
    eg:  runoob_tbl 表中獲取 runoob_author 欄位中以 COM 為結尾的的所有記錄

        mysql> use RUNOOB;
        Database changed

        mysql> SELECT * from runoob_tbl  WHERE runoob_author LIKE '%COM';
        +-----------+---------------+---------------+-----------------+
        | runoob_id | runoob_title  | runoob_author | submission_date |
        +-----------+---------------+---------------+-----------------+
        | 3         | 學習 Java   | RUNOOB.COM    | 2015-05-01      |
        | 4         | 學習 Python | RUNOOB.COM    | 2016-03-06      |
        +-----------+---------------+---------------+-----------------+
        2 rows in set (0.01 sec)
    注:
        WHERE 子句中指定任何條件。
        WHERE 子句中使用LIKE子句。
        你可以使用LIKE子句代替等號 =。
        LIKE 通常與 % 一同使用,類似於一個元字元的搜尋。
        使用 AND 或者 OR 指定一個或多個條件。
        DELETE 或 UPDATE 命令中使用 WHERE...LIKE 子句來指定條件。

    示例:
        like 匹配/模糊匹配,會與 % 和 _ 結合使用。
        語法說明:
                '%a'     //以a結尾的資料
                'a%'     //以a開頭的資料
                '%a%'    //含有a的資料
                '_a_'    //三位且中間字母是a的
                '_a'     //兩位且結尾字母是a的
                'a_'     //兩位且開頭字母是a的

        查詢以 java 欄位開頭的資訊。
        SELECT * FROM position WHERE name LIKE 'java%';

        查詢包含 java 欄位的資訊。
        SELECT * FROM position WHERE name LIKE '%java%';

        查詢以 java 欄位結尾的資訊。
        SELECT * FROM position WHERE name LIKE '%java';
"""


"""
十四、MySQL UNION 操作符

    一、UNION和UNION ALL的作用和語法

        UNION 用於合併兩個或多個 SELECT 語句的結果集,並消去表中任何重複行。
        UNION 內部的 SELECT 語句必須擁有相同數量的列,列也必須擁有相似的資料型別。
        同時,每條 SELECT 語句中的列的順序必須相同.

    二、union的用法及注意事項

        union:聯合的意思,即把兩次或多次查詢結果合併起來。
        要求:兩次查詢的列數必須一致
        推薦:列的型別可以不一樣,但推薦查詢的每一列,想對應的型別一樣
        可以來自多張表的資料:多次sql語句取出的列名可以不一致,此時以第一個sql語句的列名為準。
        如果不同的語句中取出的行,有完全相同(這裡表示的是每個列的值都相同),那麼union會將相同的行合併,最終只保留一行。也可以這樣理解,union會去掉重複的行。
        如果不想去掉重複的行,可以使用union all。
        如果子句中有order by,limit,需用括號()包起來。推薦放到所有子句之後,即對最終合併的結果來排序或篩選
        egg: (select * from a order by id) union (select * from b order id);

    描述:
        MySQL UNION 操作符用於連線兩個以上的 SELECT 語句的結果組合到一個結果集合中。
        多個 SELECT 語句會刪除重複的資料。
    語法:
        SELECT expression1, expression2, ... expression_n
        FROM tables [WHERE conditions]
            UNION [ALL | DISTINCT]
        SELECT expression1, expression2, ... expression_n
        FROM tables [WHERE conditions];

    注:
        引數:   expression1, expression2, ... expression_n: 要檢索的列
        tables: 要檢索的資料表
        WHERE conditions: 可選,檢索條件
        DISTINCT: 可選,刪除結果集中重複的資料。
        預設情況下 UNION 操作符已經刪除了重複資料,所以 DISTINCT 修飾符對結果沒啥影響。
        ALL: 可選,返回所有結果集,包含重複資料。

    註釋:
        UNION 只會選取不同的值。
        UNION ALL 返回結果集包含重複資料

    示例:
        select student_name stuName from student union select teacher_name teacherName from teacher;
        select student_name stuName from student union all select teacher_name teacherName from teacher;
        備註:第一條是union 查詢,會去重。別名會使用第一條select語句中出現別名
             第二條是union all查詢,全部查詢不會去重

        如果表1比表2欄位要多,但是你又非要查詢出表1的所有欄位還要使用union all來查詢的話,可以使用空字串來代替表2缺少的欄位。

        舉例:select person_id,person_name, person_age from person union all
             select teacher_id,teacher_name, 'null'  from teacher;
        聯合查詢使用場景:常用於資料類似的兩張或多張表查詢,如不同的資料分類表,或者是資料歷史表等.
"""

"""
十五、MySQL 排序
    描述:
        對讀取的資料進行排序,使用ORDER BY 子句 按哪個欄位哪種方式來進行排序
    語法:
        SELECT field1, field2,...fieldN table_name1, table_name2...
        ORDER BY field1, [field2...] [ASC [DESC]]
    eg:  # 預設按照升序排列,desc降序, asc 升序
        mysql> SELECT * from runoob_tbl ORDER BY submission_date ASC;

        +-----------+---------------+---------------+-----------------+
        | runoob_id | runoob_title  | runoob_author | submission_date |
        +-----------+---------------+---------------+-----------------+
        | 3         | 學習 Java   | RUNOOB.COM    | 2015-05-01      |
        | 4         | 學習 Python | RUNOOB.COM    | 2016-03-06      |
        | 1         | 學習 PHP    | 菜鳥教程  | 2017-04-12      |
        | 2         | 學習 MySQL  | 菜鳥教程  | 2017-04-12      |
        +-----------+---------------+---------------+-----------------+
        4 rows in set (0.01 sec)

    注 :
        你可以使用任何欄位來作為排序的條件,從而返回排序後的查詢結果。
        你可以設定多個欄位來排序。
        你可以使用 ASC 或 DESC 關鍵字來設定查詢結果是按升序或降序排列。
        預設情況下,它是按升序排列。
        你可以新增 WHERE...LIKE 子句來設定條件

    示例:
        如果字符集採用的是 gbk(漢字編碼字符集),直接在查詢語句後邊新增 ORDER BY:
        SELECT *
        FROM runoob_tbl
        ORDER BY runoob_title;

        如果字符集採用的是 utf8(萬國碼),需要先對欄位進行轉碼然後排序:
        SELECT *
        FROM runoob_tbl
        ORDER BY CONVERT(runoob_title using gbk);

十六、MySQL GROUP BY 分組

    GROUP BY 語句根據一個或多個列對結果集進行分組,分組列上可以使用 COUNT, SUM, AVG,等函式。
    GROUP BY 語法:
        SELECT column_name, function(column_name)
        FROM table_name
        WHERE column_name operator value
        GROUP BY column_name;

    表中的資料:
        mysql> SELECT * FROM employee_tbl;
        +----+--------+---------------------+--------+
        | id | name   | date                | singin |
        +----+--------+---------------------+--------+
        |  1 | 小明 | 2016-04-22 15:25:33 |      1 |
        |  2 | 小王 | 2016-04-20 15:25:47 |      3 |
        |  3 | 小麗 | 2016-04-19 15:26:02 |      2 |
        |  4 | 小王 | 2016-04-07 15:26:14 |      4 |
        |  5 | 小明 | 2016-04-11 15:26:40 |      4 |
        |  6 | 小明 | 2016-04-04 15:26:54 |      2 |
        +----+--------+---------------------+--------+
        6 rows in set (0.00 sec)

    示例1:
        我們使用 GROUP BY 語句 將資料表按名字進行分組,並統計每個人有多少條記錄:
            mysql> SELECT name, COUNT(*) FROM   employee_tbl GROUP BY name;
            +--------+----------+
            | name   | COUNT(*) |
            +--------+----------+
            | 小麗 |        1 |
            | 小明 |        3 |
            | 小王 |        2 |
            +--------+----------+
            3 rows in set (0.01 sec)

    示例2:
        WITH ROLLUP 可以實現在分組統計資料基礎上再進行相同的統計(SUM,AVG,COUNT…)。
        例如我們將以上的資料表按名字進行分組,再統計每個人登入的次數:

        mysql> SELECT name, SUM(singin) as singin_count FROM  employee_tbl GROUP BY name WITH ROLLUP;
        +--------+--------------+
        | name   | singin_count |
        +--------+--------------+
        | 小麗 |            2 |
        | 小明 |            7 |
        | 小王 |            7 |
        | NULL   |           16 |
        +--------+--------------+
        4 rows in set (0.00 sec)
"""

"""
十七、Mysql 連線的使用

    如何使用 MySQL 的 JOIN 在兩個或多個表中查詢資料。
    可以在 SELECT, UPDATE 和 DELETE 語句中使用 Mysql 的 JOIN 來聯合多表查詢。

    JOIN 按照功能大致分為如下三類:
        INNER JOIN(內連線,或等值連線):獲取兩個表中欄位匹配關係的記錄。
        LEFT JOIN(左連線):獲取左表所有記錄,即使右表沒有對應匹配的記錄。
        RIGHT JOIN(右連線): 與 LEFT JOIN 相反,用於獲取右表所有記錄,即使左表沒有對應匹配的記錄

    INNER JOIN
       SELECT a.runoob_id, b.runoob_count FROM runoob_tbl a INNER JOIN  tcount_tbl b ON a.runoob_author = b.runoob_author;

    LEFT JOIN
       SELECT a.runoob_id, b.runoob_count FROM runoob_tbl a LEFT JOIN   tcount_tbl b ON a.runoob_author = b.runoob_author;

    RIGHT JOIN
       SELECT a.runoob_id, b.runoob_count FROM runoob_tbl a RIGHT JOIN  tcount_tbl b ON a.runoob_author = b.runoob_author;
"""

"""
十八、MySQL NULL 值處理
    IS NULL: 當列的值是 NULL,此運算子返回 true。
    IS NOT NULL: 當列的值不為 NULL, 運算子返回 true。
    <=>: 比較操作符(不同於=運算子),當比較的的兩個值為 NULL 時返回 true

    注:
        NULL 的條件比較運算是比較特殊的,不能使用 = NULL 或 != NULL 在列中查詢 NULL 值,這樣是沒有作用的。
            eg:這個例項可以看到 = 和 != 運算子是不起作用的:
                mysql> SELECT * FROM runoob_test_tbl WHERE runoob_count = NULL;   沒作用

        NULL 值與任何其它值的比較(即使是 NULL)永遠返回 false,即 NULL = NULL 返回false 。

        正確的處理方式: NULL 使用 IS NULL 和 IS NOT NULL 運算子。
            eg: 查詢資料表中 runoob_test_tbl 列是否為 NULL,必須使用 IS NULL 和 IS NOT NULL
            正確操作:
                mysql> SELECT * FROM runoob_test_tbl WHERE runoob_count IS NULL;

                mysql> SELECT * from runoob_test_tbl WHERE runoob_count IS NOT NULL;
"""

"""
十九、 MySQL 正則表示式
        mysql的正則表示式 匹配的原則都一樣,對裡面某一個欄位的值用  正則匹配(REGEXP)

        eg:
            查詢name欄位中以'st'為開頭的所有資料:
            mysql> SELECT name FROM person_tbl WHERE name REGEXP '^st';

            查詢name欄位中以'ok'為結尾的所有資料:
            mysql> SELECT name FROM person_tbl WHERE name REGEXP 'ok$';

            查詢name欄位中包含'mar'字串的所有資料:
            mysql> SELECT name FROM person_tbl WHERE name REGEXP 'mar';

            查詢name欄位中以母音字元開頭或以'ok'字串結尾的所有資料:
            mysql> SELECT name FROM person_tbl WHERE name REGEXP '^[aeiou]|ok$';

            為了匹配特殊字元,必須用\\為前導。       \\-表示查詢-,         \\.表示查詢.

            MySQL要求兩個反斜槓(MySQL 自己解釋一個,正則表示式庫解釋另一個)

            匹配\ 為了匹配反斜槓(\)字元本身,需要使用\\\

            簡單的正則表示式測試	可以在不使用資料庫表的情況下:
                用SELECT來測試正則表示式。REGEXP檢查總是返回0(沒有匹配)或1(匹配)。
                可以用帶文字串的REGEXP來測試表達式,並試驗它們。相應的語法如下:
                select 'hello' regexp '[0-9]'
                這個例子顯然將返回0(因為文字hello中沒有數字)

"""

"""
二十、 MySQL 事務

    描述:
         MySQL 只有使用了 Innodb 資料庫引擎的資料庫或表才支援事務。
         事務用來管理 insert,update,delete 語句

   事務是必須滿足4個條件(ACID):
         原子性(Atomicity,或稱不可分割性)
         一致性(Consistency)
         隔離性(Isolation,又稱獨立性)
         永續性(Durability)

   注意:  (命令列的預設下事務都是自動提交,所以命令列操作會馬上顯示出資料)
        MySQL 命令列的預設下事務都是自動提交的,即執行 SQL 語句後就會馬上執行 COMMIT 操作。
        因此要顯式地開啟一個事務務須使用命令 BEGIN 或 START TRANSACTION,
        或者執行命令 SET AUTOCOMMIT=0,用來禁止使用當前會話的自動提交。

   事務控制語句:
        BEGIN或START TRANSACTION;顯式地開啟一個事務;
        COMMIT;也可以使用COMMIT WORK,不過二者是等價的。COMMIT會提交事務,並使已對資料庫進行的所有修改成為永久性的;
        ROLLBACK;有可以使用ROLLBACK WORK,不過二者是等價的。回滾會結束使用者的事務,並撤銷正在進行的所有未提交的修改;
        SAVEPOINT identifier;SAVEPOINT允許在事務中建立一個儲存點,一個事務中可以有多個SAVEPOINT;
        RELEASE SAVEPOINT identifier;刪除一個事務的儲存點,當沒有指定的儲存點時,執行該語句會丟擲一個異常;
        ROLLBACK TO identifier;把事務回滾到標記點;
        SET TRANSACTION;用來設定事務的隔離級別。InnoDB儲存引擎提供事務的隔離級別有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ和SERIALIZABLE。

   MYSQL 事務處理主要有兩種方法:
        1、用 BEGIN, ROLLBACK, COMMIT 來實現
            CK 事務回滾
            COMMIT 事務確認

        2、直接用 SET 來改變 MySQL 的自動提交模式:
            SET AUTOCOMMIT=0 禁止自動提交
            SET AUTOCOMMIT=1 開啟自動提交

   事務測試:
        mysql> use RUNOOB;
        Database changed
        mysql> CREATE TABLE runoob_transaction_test( id int(5)) engine=innodb;  # 建立資料表
        Query OK, 0 rows affected (0.04 sec)

        mysql> select * from runoob_transaction_test;
        Empty set (0.01 sec)

        mysql> begin;  # 開始事務
        Query OK, 0 rows affected (0.00 sec)

        mysql> insert into runoob_transaction_test value(5);
        Query OK, 1 rows affected (0.01 sec)

        mysql> insert into runoob_transaction_test value(6);
        Query OK, 1 rows affected (0.00 sec)

        mysql> commit; # 提交事務
        Query OK, 0 rows affected (0.01 sec)

        mysql>  select * from runoob_transaction_test;
        +------+
        | id   |
        +------+
        | 5    |
        | 6    |
        +------+
        2 rows in set (0.01 sec)

        mysql> begin;    # 開始事務
        Query OK, 0 rows affected (0.00 sec)

        mysql>  insert into runoob_transaction_test values(7);
        Query OK, 1 rows affected (0.00 sec)

        mysql> rollback;   # 回滾
        Query OK, 0 rows affected (0.00 sec)

        mysql>   select * from runoob_transaction_test;   # 因為回滾所以資料沒有插入
        +------+
        | id   |
        +------+
        | 5    |
        | 6    |
        +------+
        2 rows in set (0.01 sec)
"""

"""
二十一、MySQL ALTER命令

    修改資料表名或者修改資料表字段時,使用 ALTER

    1、刪除,新增或修改表字段
        ALTER 命令及 DROP 子句來刪除以上建立表的 i 欄位,但是當只剩餘一個欄位則無法使用DROP來刪除欄位
        mysql> ALTER TABLE testalter_tbl  DROP i;

    2、增加欄位 :預設新增到末尾
        使用 ADD 子句來向資料表中新增列,執行命令後,i 欄位會自動新增到資料表字段的末尾。
        如下例項在表 testalter_tbl 中新增 i 欄位,並定義資料型別
        mysql> ALTER TABLE testalter_tbl ADD i INT;

    3、指定增加的欄位插入的位置

        指定新增欄位的位置,可以使用MySQL提供的關鍵字 FIRST (設定位第一列)
        eg:ALTER TABLE testalter_tbl ADD i INT FIRST;  設定為第一列

        AFTER TABLE 欄位名(設定位於某個欄位之後)
        eg:ALTER TABLE testalter_tbl ADD i INT AFTER c;

    注:
        SHOW COLUMNS 查看錶結構的變化
        FIRST 和 AFTER 關鍵字只佔用於 ADD 子句。
        所以如果你想重置資料表字段的位置就需要先使用 DROP 刪除欄位,
        然後使用 ADD 來新增欄位並設定位置。

    4、修改欄位型別及名稱

        修改欄位型別及名稱, ALTER命令使用 MODIFY 或 CHANGE 子句

        eg:把欄位 c 的型別從 CHAR(1) 改為 CHAR(10),可以執行以下命令:
        mysql> ALTER TABLE testalter_tbl MODIFY c CHAR(10);

        語法:
         在 CHANGE 關鍵字之後,緊跟著的是你要修改的欄位名,然後指定新欄位名及型別。
        嘗試如下例項: CHANGE 欄位名稱,新的欄位名稱,新的型別
            mysql> ALTER TABLE testalter_tbl CHANGE i j BIGINT;
            mysql> ALTER TABLE testalter_tbl CHANGE j j INT;

    5、ALTER TABLE 對 Null 值和預設值的影響

        當你修改欄位時,你可以指定是否包含值或者是否設定預設值。
        以下例項,指定欄位 j 為 NOT NULL 且預設值為100 。

        mysql> ALTER TABLE testalter_tbl
            -> MODIFY j BIGINT NOT NULL DEFAULT 1000;
        如果你不設定預設值,MySQL會自動設定該欄位預設為 NULL

    6、修改欄位預設值

        ALTER TABLE testalter_tbl ALTER i SET DEFAULT 1000;
        eg:
            mysql> SHOW COLUMNS FROM testalter_tbl;
            +-------+---------+------+-----+---------+-------+
            | Field | Type    | Null | Key | Default | Extra |
            +-------+---------+------+-----+---------+-------+
            | c     | char(1) | YES  |     | NULL    |       |
            | i     | int(11) | YES  |     | 1000    |       |
            +-------+---------+------+-----+---------+-------+
            2 rows in set (0.00 sec)

        使用 ALTER 命令及 DROP子句來刪除欄位的預設值,如下例項:
        eg:
            mysql> ALTER TABLE testalter_tbl ALTER i DROP DEFAULT;
            mysql> SHOW COLUMNS FROM testalter_tbl;
            +-------+---------+------+-----+---------+-------+
            | Field | Type    | Null | Key | Default | Extra |
            +-------+---------+------+-----+---------+-------+
            | c     | char(1) | YES  |     | NULL    |       |
            | i     | int(11) | YES  |     | NULL    |       |
            +-------+---------+------+-----+---------+-------+
            2 rows in set (0.00 sec)


        7、修改表名

            如果需要修改資料表的名稱,可以在 ALTER TABLE 語句中使用 RENAME  TO 子句

            嘗試以下例項將資料表 testalter_tbl 重新命名為 alter_tbl:

                mysql> ALTER TABLE testalter_tbl RENAME TO alter_tbl;


        新增外來鍵:

            alter table 從表 add constraint 外來鍵名稱(形如:FK_從表_主表) foreign key 從表(外來鍵欄位) references 主表(主鍵欄位);

        刪除外來鍵:

            alter table 表名 drop foreign key 外來鍵名稱

        修改預設值:

            ALTER TABLE testalter_tbl ALTER i SET DEFAULT 1000;

        刪除預設值:

            ALTER TABLE testalter_tbl ALTER i DROP DEFAULT;

"""

"""
二十一、MySQL 索引

        描述:
            MySQL索引的建立對於MySQL的高效執行是很重要的,索引可以大大提高MySQL的檢索速度。

            建立索引時,你需要確保該索引是應用在SQL 查詢語句的條件(一般作為 WHERE 子句的條件)。

        缺點:
            建立索引會佔用磁碟空間的索引檔案。


        普通索引
            建立索引
            這是最基本的索引,它沒有任何限制。它有以下幾種建立方式:

            CREATE INDEX indexName ON mytable(username(length));
            如果是CHAR,VARCHAR型別,length可以小於欄位實際長度;如果是BLOB和TEXT型別,必須指定 length。

            修改表結構(新增索引)
            ALTER table tableName ADD INDEX indexName(columnName)

            建立表的時候直接指定
                CREATE TABLE mytable(
                    ID INT NOT NULL,
                    username VARCHAR(16) NOT NULL,
                    INDEX [indexName] (username(length))
                );

            刪除索引的語法
                    DROP INDEX [indexName] ON mytable;

        唯一索引
            它與前面的普通索引類似,不同的就是:索引列的值必須唯一,但允許有空值。
            如果是組合索引,則列值的組合必須唯一。

            它有以下幾種建立方式:

            建立索引
                CREATE UNIQUE INDEX indexName ON mytable(username(length))

                修改表結構
                    ALTER table mytable ADD UNIQUE [indexName] (username(length))

                建立表的時候直接指定
                    CREATE TABLE mytable(
                        ID INT NOT NULL,
                        username VARCHAR(16) NOT NULL,
                        UNIQUE [indexName] (username(length))
                    );

        使用ALTER 命令新增和刪除索引
            有四種方式來新增資料表的索引:
                ALTER TABLE tbl_name ADD PRIMARY KEY (column_list): 該語句新增一個主鍵,這意味著索引值必須是唯一的,且不能為NULL。
                ALTER TABLE tbl_name ADD UNIQUE index_name (column_list): 這條語句建立索引的值必須是唯一的(除了NULL外,NULL可能會出現多次)。
                ALTER TABLE tbl_name ADD INDEX index_name (column_list): 新增普通索引,索引值可出現多次。
                ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list):該語句指定了索引為 FULLTEXT ,用於全文索引。

        以下例項為在表中新增索引
            mysql> ALTER TABLE testalter_tbl ADD INDEX (c);

        ALTER 命令中使用 DROP 子句來刪除索引
            mysql> ALTER TABLE testalter_tbl DROP INDEX c;

        ALTER 命令新增 和 刪除主鍵
            主鍵只能作用於一個列上,新增主鍵索引時,你需要確保該主鍵預設不為空(NOT NULL)
            mysql> ALTER TABLE testalter_tbl MODIFY i INT NOT NULL;
            mysql> ALTER TABLE testalter_tbl ADD PRIMARY KEY (i);
            你也可以使用 ALTER 命令刪除主鍵:

            mysql> ALTER TABLE testalter_tbl DROP PRIMARY KEY;
            刪除主鍵時只需指定PRIMARY KEY,但在刪除索引時,你必須知道索引名。

            顯示索引資訊
            你可以使用 SHOW INDEX 命令來列出表中的相關的索引資訊。可以通過新增 \G 來格式化輸出資訊。

            嘗試以下例項:

            mysql> SHOW INDEX FROM table_name; \G


"""


"""
二十二、MySQL 臨時表  SalesSummary
    描述:
        MySQL臨時表只在當前連線可見,如果當前連線退出,該臨時表也會自動銷燬。
        如果你使用了其他MySQL客戶端程式連線MySQL資料庫伺服器來建立臨時表,
        那麼只有在關閉客戶端程式時才會銷燬臨時表,也可以手動銷燬(drop)
    eg:

        建立表:
            mysql> CREATE TEMPORARY TABLE SalesSummary (
                -> product_name VARCHAR(50) NOT NULL
                -> , total_sales DECIMAL(12,2) NOT NULL DEFAULT 0.00
                -> , avg_unit_price DECIMAL(7,2) NOT NULL DEFAULT 0.00
                -> , total_units_sold INT UNSIGNED NOT NULL DEFAULT 0
            );
            Query OK, 0 rows affected (0.00 sec)

        插入資料:

            mysql> INSERT INTO SalesSummary
                -> (product_name, total_sales, avg_unit_price, total_units_sold)
                -> VALUES
                -> ('cucumber', 100.25, 90, 2);
        查詢資料:

            mysql> SELECT * FROM SalesSummary;
            +--------------+-------------+----------------+------------------+
            | product_name | total_sales | avg_unit_price | total_units_sold |
            +--------------+-------------+----------------+------------------+
            | cucumber     |      100.25 |          90.00 |                2 |
            +--------------+-------------+----------------+------------------+
            1 row in set (0.00 sec)

        如果:
            exit()
            mysql> SELECT * FROM SalesSummary;
            ERROR 1146: Table 'RUNOOB.SalesSummary' doesn't exist

            報錯: 這個表已經被銷燬,不存在了。

        注意:
            1、當你使用 SHOW TABLES命令顯示資料表列表時,你將無法看到 SalesSummary表,因為它是一個臨時表

            2、如果你退出當前MySQL會話,即exit(),再使用 SELECT命令來讀取原先建立的臨時表資料,
               那你會發現資料庫中沒有該表的存在,因為在你退出時該臨時表已經被銷燬了。
"""

"""
二十三、MySQL 複製表

    如果我們需要完全的複製MySQL的資料表,包括表的結構,索引,預設值等。
    如果僅僅使用CREATE TABLE ... SELECT 命令,是無法實現的。

    完整的複製MySQL資料表,步驟如下:
        1、使用 SHOW CREATE TABLE 命令獲取建立資料表(CREATE TABLE) 語句,該語句包含了原資料表的結構,索引等。
        2、複製以下命令顯示的SQL語句,修改資料表名,並執行SQL語句,通過以上命令 將完全的複製資料表結構。
        3、如果你想複製表的內容,你就可以使用 INSERT INTO ... SELECT 語句來實現。


    示例:
        嘗試以下例項來複製表 runoob_tbl

        步驟一:
        獲取資料表的完整結構。
            mysql> SHOW CREATE TABLE runoob_tbl \G;
            *************************** 1. row ***************************
                   Table: runoob_tbl
            Create Table: CREATE TABLE `runoob_tbl` (
              `runoob_id` int(11) NOT NULL auto_increment,
              `runoob_title` varchar(100) NOT NULL default '',
              `runoob_author` varchar(40) NOT NULL default '',
              `submission_date` date default NULL,
              PRIMARY KEY  (`runoob_id`),
              UNIQUE KEY `AUTHOR_INDEX` (`runoob_author`)
            ) ENGINE=InnoDB
            1 row in set (0.00 sec)

        ERROR:
        No query specified

        步驟二:
        修改SQL語句的資料表名,並執行SQL語句。
            mysql> CREATE TABLE `clone_tbl` (
              -> `runoob_id` int(11) NOT NULL auto_increment,
              -> `runoob_title` varchar(100) NOT NULL default '',
              -> `runoob_author` varchar(40) NOT NULL default '',
              -> `submission_date` date default NULL,
              -> PRIMARY KEY  (`runoob_id`),
              -> UNIQUE KEY `AUTHOR_INDEX` (`runoob_author`)
            -> ) ENGINE=InnoDB;
            Query OK, 0 rows affected (1.80 sec)

        步驟三:
        執行完第二步驟後,你將在資料庫中建立新的克隆表 clone_tbl。 如果你想拷貝資料表的資料你
        可以使用 INSERT INTO... SELECT 語句來實現。
            mysql> INSERT INTO clone_tbl (runoob_id,
                ->                        runoob_title,
                ->                        runoob_author,
                ->                        submission_date)
                -> SELECT runoob_id,runoob_title,
                ->        runoob_author,submission_date
                -> FROM runoob_tbl;
            Query OK, 3 rows affected (0.07 sec)
            Records: 3  Duplicates: 0  Warnings: 0
        執行以上步驟後,你將完整的複製表,包括表結構及表資料。


    注:
        1、另一種完整複製表的方法:
                CREATE TABLE targetTable LIKE sourceTable;
                INSERT INTO targetTable SELECT * FROM sourceTable;

    其他:
        1、可以拷貝一個表中其中的一些欄位:
            CREATE TABLE newadmin AS
            (
                SELECT username, password FROM admin
            )

        2、可以將新建的表的欄位改名:
            CREATE TABLE 新表 AS
            (
                SELECT id, username AS uname, password AS pass FROM 舊錶
            )

        3、可以拷貝一部分資料:
            CREATE TABLE 新表 AS
            (
                SELECT * FROM 舊錶 WHERE LEFT(username,1) = 's'
            )

        4、可以在建立表的同時定義表中的欄位資訊,  (這個是自我定義欄位的---自己測試一下,不太確定)
            CREATE TABLE 新表
            (
                id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY
            )
            AS
            (
                SELECT * FROM 舊錶
            )

    重點:
        區分下mysql複製表的兩種方式:

        第一、只複製表結構到新表
            create table 新表 select * from 舊錶 where 1=2
        或者
            create table 新表 like 舊錶

        第二、複製表結構及資料到新表
            create table 新表 select * from 舊錶


        第三、另一種完整複製表的方法:
            先建立和原表的表結構一致的表
                CREATE TABLE targetTable LIKE sourceTable;
            然後插入資料
                INSERT INTO targetTable SELECT * FROM sourceTable;

        第四、
            # 插入部分資料:
                insert into b(a, b, c) select d,e,f from b;
"""

"""
二十四、MySQL 序列使用
    描述:
        MySQL序列是一組整數:1, 2, 3, ...,由於一張資料表只能有一個欄位自增主鍵
        如果你想實現其他欄位也實現自動增加,就可以使用MySQL序列來實現

    1、AUTO_INCREMENT:
        MySQL中最簡單使用序列的方法就是使用 MySQL AUTO_INCREMENT 來定義列。
        以下例項中建立了資料表 insert, insect 中 id 無需指定值可實現自動增長。
        eg:
            mysql> CREATE TABLE insect
                -> (
                -> id INT UNSIGNED NOT NULL AUTO_INCREMENT,
                -> PRIMARY KEY (id),
                -> name VARCHAR(30) NOT NULL, # type of insect
                -> date DATE NOT NULL, # date collected
                -> origin VARCHAR(30) NOT NULL # where collected
            );
            Query OK, 0 rows affected (0.02 sec)
            mysql> INSERT INTO insect (id,name,date,origin) VALUES
                -> (NULL,'housefly','2001-09-10','kitchen'),
                -> (NULL,'millipede','2001-09-10','driveway'),
                -> (NULL,'grasshopper','2001-09-10','front yard');
            Query OK, 3 rows affected (0.02 sec)
            Records: 3  Duplicates: 0  Warnings: 0
            mysql> SELECT * FROM insect ORDER BY id;
            +----+-------------+------------+------------+
            | id | name        | date       | origin     |
            +----+-------------+------------+------------+
            |  1 | housefly    | 2001-09-10 | kitchen    |
            |  2 | millipede   | 2001-09-10 | driveway   |
            |  3 | grasshopper | 2001-09-10 | front yard |
            +----+-------------+------------+------------+
            3 rows in set (0.00 sec)

    2、設定序列的開始值:
        一般情況下序列的開始值預設為1,但如果你需要指定一個開始值100,那我們可以通過以下語句來實現:
        eg:
            mysql> CREATE TABLE insect
                -> (
                -> id INT UNSIGNED NOT NULL AUTO_INCREMENT,
                -> PRIMARY KEY (id),
                -> name VARCHAR(30) NOT NULL,
                -> date DATE NOT NULL,
                -> origin VARCHAR(30) NOT NULL
            )engine=innodb auto_increment=100 charset=utf8;

        或者你也可以在表建立成功後,通過以下語句來實現:
            mysql> ALTER TABLE insect AUTO_INCREMENT = 100;

    3、重置序列的值
        如果你刪除了資料表中的多條記錄,並希望對剩下資料的AUTO_INCREMENT列進行重新排列,那麼你可以通過刪除自增的列,
        然後重新新增來實現,不過該操作要非常小心,如果在刪除的同時又有新記錄新增,有可能會出現資料混亂.

        操作步驟如下所示:                         # 特別注意:在刪除欄位的時候,不要插入新的資料,否則資料就亂了
            mysql> ALTER TABLE insect DROP id;    # 首先刪除原來的序列欄位,修改表的結構
            mysql> ALTER TABLE insect             # 然後再次修改表的結構,把刪除的欄位給加上去,
                -> ADD id INT UNSIGNED NOT NULL AUTO_INCREMENT FIRST,
                -> ADD PRIMARY KEY (id);
"""

"""
二十五、MySQL 處理重複資料
    描述:
        有些 MySQL 資料表中可能存在重複的記錄,有些情況我們允許重複資料的存在,但有時候我們也需要刪除這些重複的資料。
        如何防止資料表出現重複資料及如何刪除資料表中的重複資料?

    防止表中出現重複資料:
        你可以在MySQL資料表中設定指定的欄位為 PRIMARY KEY(主鍵) 或者 UNIQUE(唯一) 索引來保證資料的唯一性

    1、讓我們嘗試一個例項: 下表中無索引及主鍵,所以該表允許出現多條重複記錄
        eg:
            CREATE TABLE person_tbl
                (
                    first_name CHAR(20),
                    last_name CHAR(20),
                    sex CHAR(10)
                );

    2、如果你想設定表中欄位 first_name,last_name 資料不能重複,你可以設定雙主鍵模式來設定資料的唯一性
       如果你設定了雙主鍵,那麼那個鍵的預設值不能為NULL,可設定為NOT NULL。如下所示:
        CREATE TABLE person_tbl
            (
               first_name CHAR(20) NOT NULL,
               last_name CHAR(20) NOT NULL,
               sex CHAR(10),
               PRIMARY KEY (last_name, first_name)
            );

    3、如果我們設定了唯一索引,那麼在插入重複資料時,SQL語句將無法執行成功,並丟擲錯。
       INSERT IGNORE INTO與INSERT INTO的區別就是INSERT IGNORE會忽略資料庫中已經存在的資料,如果資料庫沒有資料,
       就插入新的資料,如果有資料的話就跳過這條資料.這樣就可以保留資料庫中已經存在資料,達到在間隙中插入資料的目的。
insert ignore into tablename field values () ,(),()...
    4、以下例項使用了INSERT IGNORE INTO,執行後不會出錯,也不會向資料表中插入重複資料:
        eg:
            mysql> INSERT IGNORE INTO person_tbl (last_name, first_name)
                -> VALUES( 'Jay', 'Thomas');
            Query OK, 1 row affected (0.00 sec)

            mysql> INSERT IGNORE INTO person_tbl (last_name, first_name)
                -> VALUES( 'Jay', 'Thomas');
            Query OK, 0 rows affected (0.00 sec)

    5、insert into 、  insert ignore into 、 replace into 、插入資料的區別:

        INSERT  INTO當插入資料時,在設定了記錄的唯一性後,SQL語句將無法執行成功,並丟擲錯

        INSERT IGNORE INTO當插入資料時,在設定了記錄的唯一性後,如果插入重複資料,將不返回錯誤,只以警告形式返回

        REPLACE INTO into如果存在primary 或 unique相同的記錄,則先刪除掉。再插入新記錄


    6、另一種設定資料的唯一性方法是新增一個UNIQUE索引,如下所示:

        CREATE TABLE person_tbl
            (
               first_name CHAR(20) NOT NULL,
               last_name CHAR(20) NOT NULL,
               sex CHAR(10)
               UNIQUE (last_name, first_name)
            );
    7、統計重複資料
        以下我們將統計表中 first_name 和 last_name的重複記錄數:
        eg:
            mysql> SELECT COUNT(*) as repetitions, last_name, first_name
                -> FROM person_tbl
                -> GROUP BY last_name, first_name
                -> HAVING repetitions > 1;
        註釋:以上查詢語句將返回 person_tbl 表中重複的記錄數。

        一般情況下,查詢重複的值,請執行以下操作:
            確定哪一列包含的值可能會重複。
            在列選擇列表使用COUNT(*)列出的那些列。        計算數量
            在GROUP BY子句中列出的列。                    聚合
            HAVING子句設定重複數大於1。                   篩選資料

    8、過濾重複資料
        方法一:
            如果你需要讀取不重複的資料可以在 SELECT 語句中使用 DISTINCT 關鍵字來過濾重複資料。
            eg:
                mysql> SELECT DISTINCT last_name, first_name
                    -> FROM person_tbl;
        方法二:
            你也可以使用 GROUP BY 來讀取資料表中不重複的資料:
            mysql> SELECT last_name, first_name
                -> FROM person_tbl
                -> GROUP BY (last_name, first_name)
    8、刪除重複資料
        如果你想刪除資料表中的重複資料,你可以使用以下的SQL語句:
        三步:
        eg:
            mysql> CREATE TABLE tmp SELECT last_name,first_name,sex FROM person_tbl GROUP BY (last_name,first_name,sex);
            # 首先複製表的結構和資料到另外一個表中

            mysql> DROP TABLE person_tbl;
            # 刪除原來的表(舊錶)

            mysql> ALTER TABLE tmp RENAME TO person_tbl;
            # 對生成的 新表 修改表的名稱為 舊錶

    9、可以在資料表中新增 INDEX(索引) 和 PRIMAY KEY(主鍵)這種簡單的方法來刪除表中的重複記錄.
       方法如下:
            mysql> ALTER IGNORE TABLE person_tbl
                -> ADD PRIMARY KEY (last_name, first_name);
"""
"""
二十六、MySQL 及SQL注入
    如果您通過網頁獲取使用者輸入的資料並將其插入一個MySQL資料庫,那麼就有可能發生SQL注入安全的問題。

    防止SQL注入,我們需要注意以下幾個要點:
        1.永遠不要信任使用者的輸入。對使用者的輸入進行校驗,可以通過正則表示式,或限制長度;對單引號和 雙"-"進行轉換等。
        2.永遠不要使用動態拼裝sql,可以使用引數化的sql或者直接使用儲存過程進行資料查詢存取。
        3.永遠不要使用管理員許可權的資料庫連線,為每個應用使用單獨的許可權有限的資料庫連線。
        4.不要把機密資訊直接存放,加密或者hash掉密碼和敏感的資訊。
        5.應用的異常資訊應該給出儘可能少的提示,最好使用自定義的錯誤資訊對原始錯誤資訊進行包裝
        6.sql注入的檢測方法一般採取輔助軟體或網站平臺來檢測,軟體一般採用sql注入檢測工具jsky,網站平臺就有億思網站安全平臺檢測工具。
          MDCSOFT SCAN等。採用MDCSOFT-IPS可以有效的防禦SQL注入,XSS攻擊等。
"""
"""
        這兩個用的不是很多,自我感覺。詳細的還是去看教程吧。
二十七、 MySQL 匯出資料

    MySQL中你可以使用SELECT...INTO OUTFILE語句來簡單的匯出資料到文字檔案上。
    使用 SELECT ... INTO OUTFILE 語句匯出資料

    以下例項中我們將資料表 runoob_tbl 資料匯出到 /tmp/runoob.txt 檔案中:
        eg:
            mysql-> SELECT * FROM runoob_tbl
                 -> INTO OUTFILE '/tmp/runoob.txt';

    你可以通過命令選項來設定資料輸出的指定格式,以下例項為匯出 CSV 格式:
        eg:
            mysql> SELECT * FROM passwd INTO OUTFILE '/tmp/runoob.txt'
                -> FIELDS TERMINATED BY ',' ENCLOSED BY '"'
                -> LINES TERMINATED BY '\r\n';

    在下面的例子中,生成一個檔案,各值用逗號隔開。這種格式可以被許多程式使用。
        eg:
            SELECT a,b,a+b INTO OUTFILE '/tmp/result.text'
            FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
            LINES TERMINATED BY '\n'
            FROM test_table;

    SELECT ... INTO OUTFILE 語句有以下屬性:
        LOAD DATA INFILE是SELECT ... INTO OUTFILE的逆操作,SELECT句法。為了將一個數據庫的資料寫入一個檔案,使用SELECT ... INTO OUTFILE,為了將檔案讀回資料庫,使用LOAD DATA INFILE。
        SELECT...INTO OUTFILE 'file_name'形式的SELECT可以把被選擇的行寫入一個檔案中。該檔案被建立到伺服器主機上,因此您必須擁有FILE許可權,才能使用此語法。
        輸出不能是一個已存在的檔案。防止檔案資料被篡改。
        你需要有一個登陸伺服器的賬號來檢索檔案。否則 SELECT ... INTO OUTFILE 不會起任何作用。
        在UNIX中,該檔案被建立後是可讀的,許可權由MySQL伺服器所擁有。這意味著,雖然你就可以讀取該檔案,但可能無法將其刪除。

"""

"""
二十八、 MySQL 匯入資料

    1、mysql 命令匯入
        使用 mysql 命令匯入語法格式為:  mysql -u使用者名稱    -p密碼    <  要匯入的資料庫資料(runoob.sql)
        eg:
            # mysql -uroot -p123456 < runoob.sql
            以上命令將將備份的整個資料庫 runoob.sql 匯入。

    2、source 命令匯入
        source 命令匯入資料庫需要先登入到數庫終端
        eg:
            mysql> create database abc;      # 建立資料庫
            mysql> use abc;                  # 使用已建立的資料庫
            mysql> set names utf8;           # 設定編碼
            mysql> source /home/abc/abc.sql  # 匯入備份資料庫

    3、使用 LOAD DATA 匯入資料

          MySQL 中提供了LOAD DATA INFILE語句來插入資料. 以下例項中將從當前目錄中讀取檔案 dump.txt
          將該檔案中的資料插入到當前資料庫的 mytbl 表中.

          mysql> LOAD DATA LOCAL INFILE 'dump.txt' INTO TABLE mytbl;
             如果指定LOCAL關鍵詞,則表明從客戶主機上按路徑讀取檔案。如果沒有指定,
              則檔案在伺服器上按路徑讀取檔案.

          你能明確地在LOAD DATA語句中指出列值的分隔符和行尾標記,但是預設標記是定位符和換行符。

          兩個命令的 FIELDS 和 LINES 子句的語法是一樣的。兩個子句都是可選的,但是如果兩個同時被指定,FIELDS 子句必須出現在 LINES 子句之前。

          如果使用者指定一個 FIELDS 子句,它的子句 (TERMINATED BY、[OPTIONALLY] ENCLOSED BY 和 ESCAPED BY) 也是可選的,不過,使用者必須至少指定它們中的一個。

          mysql> LOAD DATA LOCAL INFILE 'dump.txt' INTO TABLE mytbl
            -> FIELDS TERMINATED BY ':'
            -> LINES TERMINATED BY '\r\n';

          LOAD DATA 預設情況下是按照資料檔案中列的順序插入資料的,如果資料檔案中的列與插入表中的列不一致,則需要指定列的順序。
          在資料檔案中的列順序是 a,b,c,但在插入表的列順序為b,c,a,則資料匯入語法如下:
             mysql> LOAD DATA LOCAL INFILE 'dump.txt'
                -> INTO TABLE mytbl (b, c, a);
"""

# https://blog.csdn.net/qq_17011423/article/details/69220231
# SELECT * FROM timeline WHERE username = ‘Allen’ AND logTime BETWEEN ‘2017-04-01’ AND DATE_ADD(‘2017-04-04’,INTERVAL 1 DAY);

# MySQL 日期加減:
# DATE_ADD(date,INTERVAL expr type) –加法
# DATE_SUB(date,INTERVAL expr type) –減法

# between a and b  包含左右邊界     not between  and  不包含左右邊界

# select * from user where userId between 5 and 7;
# 查詢userId為5、6,7的user,userId範圍是包含邊界值的,也等同如下查詢:
# select * from user where userId >= 5 and userId <= 7;

# 另外 not between的範圍是不包含邊界值。

"""
通過刪除資料右側多餘的空格來整理資料,這可以使用MySQL的 RTrim()函式來完成
select num,RTrim(name) from table_name
"""
"""
子	句	說	明	是否必須使用
SELECT	要返回的列或表示式	是
FROM	從中檢索資料的表	僅在從表選擇資料時使用
WHERE	行級過濾	否
GROUP BY	分組說明	僅在按組計算聚集時使用
HAVING	組級過濾	否
ORDER BY	輸出排序順序	否
LIMIT	要檢索的行數	否
"""

"""
mysql中的where和having子句的區別:
    mysql中的where和having子句都可以實現過濾記錄的功能,但他們的用法還是有一些區別的,看一例子:
    用group by和having子句聯合來查出不重複的記錄,sql如下:
    select uid,email,count(*) as ct from `edm_user081217` GROUP BY email
    然後看這個,就容易理解了
    select uid,email,count(*) as ct from `edm_user081217` GROUP BY email HAVING ct > 1
    先用group by 對email進行分組,在用having來過濾大於1的,這樣查找出來的就是重複的記錄了.

以下是having和where的區別:
    Select city FROM weather WHERE temp_lo = (SELECT max(temp_lo) FROM weather);
    作用的物件不同。WHERE 子句作用於表和檢視,HAVING 子句作用於組。
    WHERE 在分組和聚集計算之前選取輸入行(因此,它控制哪些行進入聚集計算), 而 HAVING 在分組和聚集之後選取分組的行。因此,WHERE 子句不能包含聚集函式; 因為試圖用聚集函式判斷那些行輸入給聚集運算是沒有意義的。 相反,HAVING 子句總是包含聚集函式。(嚴格說來,你可以寫不使用聚集的 HAVING 子句, 但這樣做只是白費勁。同樣的條件可以更有效地用於 WHERE 階段。)
    在前面的例子裡,我們可以在 WHERE 裡應用城市名稱限制,因為它不需要聚集。 這樣比在 HAVING 裡增加限制更加高效,因為我們避免了為那些未通過 WHERE 檢查的行進行分組和聚集計算

綜上所述:
    having一般跟在group by之後,執行記錄組選擇的一部分來工作的。
    where則是執行所有資料來工作的。
    再者having可以用聚合函式,如having sum(qty)>1000
"""

"""
InnoDB是一個可靠的事務處理引擎(參見第26章),它不支援全文字搜尋;
MEMORY在功能等同於MyISAM,但由於資料儲存在記憶體(不是磁碟) 中,速度很快(特別適合於臨時表);
MyISAM是一個性能極高的引擎,它支援全文字搜尋(參見第18章),但不支援事務處理。

本書中的樣例表都使用InnoDB。原因是作者希望支援事務處理(因此,使用InnoDB),
但也需要在productnotes中支援全文字搜尋(因此,使用MyISAM)。

# 將多個表給重新命名 rename  old_name  to  new_name, table_a to table_b;

rename table  table_a to tabel_b,
table_c to table_d;


7、表重新命名:

    >RENAME TABLE name_old TO name_new;

    還可以使用:

    >ALTER TABLE name_old RENAME name_new;



檢視用CREATE VIEW語句來建立。
使用SHOW CREATE VIEW viewname;來檢視建立檢視的語句。
用DROP刪除檢視,其語法為DROP VIEW viewname;。
建立檢視:
-- CREATE VIEW hhh  AS
-- SELECT
-- 	*
-- FROM
-- 	cc;


刪除檢視:drop view viewname


# 此時的資料 都在視圖裡面了
select * from view

--version



十二、全文檢索——MATCH和AGAINST

  1、SELECT MATCH(note_text)AGAINST('PICASO') FROM tb_name;

  2、InnoDB引擎不支援全文檢索,MyISAM可以;
"""

"""
選擇:select * from table1 where 範圍

插入:insert into table1(field1,field2) values(value1,value2)

刪除:delete from table1 where 範圍

更新:update table1 set field1=value1 where 範圍

查詢:select * from table1 where field1 like ’%value1%’ ---like的語法很精妙,查資料!

排序:select * from table1 order by field1,field2 [desc]

總數:select count as totalcount from table1

求和:select sum(field1) as sumvalue from table1

平均:select avg(field1) as avgvalue from table1

最大:select max(field1) as maxvalue from table1

最小:select min(field1) as minvalue from table1
"""

"""
12、說明:使用外連線

A、left (outer) join:

左外連線(左連線):結果集幾包括連線表的匹配行,也包括左連線表的所有行。

SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c

B:right (outer) join:

右外連線(右連線):結果集既包括連線表的匹配連線行,也包括右連線表的所有行。

C:full/cross (outer) join:

全外連線:不僅包括符號連線表的匹配行,還包括兩個連線表中的所有記錄


1=1,1=2的使用,在SQL語句組合時用的較多

“where 1=1” 是表示選擇全部    “where 1=2”全部不選,
"""

"""
mysql 的5種連線方式:
    1、內連線   inner  join
    2、外連線   left join , right join, full join
    3、全連線   union
    4、自連線
    5、交叉連線
"""

"""
sql 語句實現 5 種連線方式 :  本地資料庫 ccc,表的名字 a, b, c

        SELECT * FROM a LEFT OUTER JOIN b ON a.id = b.id1;  # 左連線
        SELECT * FROM a RIGHT OUTER JOIN b ON a.id = b.id1; # 右連線

        # 注意: LEFT JOIN 和 LEFT OUTER JOIN 一致的,沒有區別
        SELECT * FROM a