DML数据操作语言

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DML数据操作语言相关的知识,希望对你有一定的参考价值。

DML: 数据操作语言
INSERT, DELETE, UPDATE, SELECT 常用的语句,增、删、改、查;

    INSERT:
        一次插入一行或多行数据;
        Syntax:
        INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
            [INTO] tbl_name [(col_name,...)]
            {VALUES | VALUE} ({expr | DEFAULT},...),(...),...
            [ ON DUPLICATE KEY UPDATE
              col_name=expr
                [, col_name=expr] ... ]

        mysql>  INSERT tbl_name [(col1,...)] VALUES (val1,...), (val21,...)
    例如: mysql> INSERT INTO student (name,sex,register_date) VALUES (‘Jinjiao‘,‘M‘,‘2019-01-29‘);
        Query OK, 1 row affected (0.01 sec)
            mysql> SELECT * FROM student;
            +----+----------+---------------+------+
            | id | name     | register_date | sex  |
            +----+----------+---------------+------+
            |  1 | ZhanYang | 2018-06-20    | NULL |
            |  4 | LiuJia   | 2018-05-30    | NULL |
            |  8 | JiaLiu   | 2018-06-20    | NULL |
            |  9 | JiaLiu   | 2018-04-20    | NULL |
            | 10 | gaoyf    | 2018-04-20    | NULL |
            | 11 | zhujh    | 2018-04-20    | NULL |
            | 12 | zhouha   | 2018-04-20    | NULL |
            | 13 | hanzb    | 2018-04-21    | M    |
            | 16 | ZhanXing | 2018-05-21    | M    |
            | 17 | XingYan  | 2018-05-21    | M    |
            | 18 | Jinjiao  | 2019-01-29    | M    |
            +----+----------+---------------+------+
            11 rows in set (0.00 sec)

        Or:

        INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
            [INTO] tbl_name
            SET col_name={expr | DEFAULT}, ...
            [ ON DUPLICATE KEY UPDATE
              col_name=expr
                [, col_name=expr] ... ]
    例如: mysql> INSERT INTO student SET name=‘Yinjiao‘,sex=‘F‘,register_date=‘2019-01-28‘;
            Query OK, 1 row affected (0.01 sec)
        Or:

        INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE]
            [INTO] tbl_name [(col_name,...)]
            SELECT ...
            [ ON DUPLICATE KEY UPDATE
              col_name=expr
                [, col_name=expr] ... ]

    DELETE:

        DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name
            [WHERE where_condition]        #如果不指where条件,该表会被清空
            [ORDER BY ...]
            [LIMIT row_count]

        注意:一定要有限制条件,否则将清空表中的所有数据;
            限制条件:
                WHERE
                LIMIT

    UPDATE:

        UPDATE [LOW_PRIORITY] [IGNORE] table_reference
            SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...
            [WHERE where_condition]
            [ORDER BY ...]
            [LIMIT row_count]
        mysql> UPDATE student SET age=100 WHERE id=19;

        注意:一定要有限制条件,否则将修改所有行的指定字段;
            限制条件:
                WHERE
                LIMIT

    SELECT: 

        Query Cache  #查询缓存,在查询结果确定时,才进行缓存。
        mysql> SELECT NOW();    #显示当前系统时间。

        查询执行路径中的组件:查询缓存、解析器、预处理器、优化器、查询执行引擎、存储引擎;

        SELECT语句的执行流程:
            FROM Clause --> WHERE Clause --> GROUP BY --> HAVING Clause --> ORDER BY --> SELECT --> LIMIT

        单表查询:
            SELECT
                [ALL | DISTINCT | DISTINCTROW ]
                  [SQL_CACHE | SQL_NO_CACHE] 
                select_expr [, select_expr ...]
                [FROM table_references
                [WHERE where_condition]
                [GROUP BY {col_name | expr | position}
                  [ASC | DESC], ... [WITH ROLLUP]]
                [HAVING where_condition]
                [ORDER BY {col_name | expr | position}
                  [ASC | DESC], ...]
                [LIMIT {[offset,] row_count | row_count OFFSET offset}]
                [FOR UPDATE | LOCK IN SHARE MODE]

                DISTINCT: 数据去重;
                mysql> SELECT  DISTINCT sex FROM  student;
                +------+
                | sex  |
                +------+
                | NULL |
                | M    |
                | F    |
                +------+
                3 rows in set (0.00 sec)

                SQL_CACHE: 显式指定存储查询结果于缓存之中;
                SQL_NO_CACHE: 显式查询结果不予缓存;

                命中个数:mysql> SHOW GLOBAL VARIABLES LIKE ‘query%‘;
                +------------------------------+---------+
                | Variable_name                | Value   |
                +------------------------------+---------+
                | query_alloc_block_size       | 8192    |
                | query_cache_limit            | 1048576 |
                | query_cache_min_res_unit     | 4096    |
                | query_cache_size             | 1048576 |
                | query_cache_type             | OFF     |
                | query_cache_wlock_invalidate | OFF     |
                | query_prealloc_size          | 8192    |
                +------------------------------+---------+
                7 rows in set (0.00 sec)

                query_cache_type的值为‘ON‘时,查询缓存功能打开;
                    SELECT的结果符合缓存条件即会缓存,否则,不予缓存;
                    显式指定SQL_NO_CACHE,不予缓存;
                query_cache_type的值为‘DEMAND‘时,查询缓存功能按需进行;
                    显式指定SQL_CACHE的SELECT语句才会缓存;其它均不予缓存;

                缓存命中率查询:mysql> SHOW GLOBAL STATUS LIKE ‘Qcache%‘;
                +-------------------------+---------+
                | Variable_name           | Value   |
                +-------------------------+---------+
                | Qcache_free_blocks      | 1       |
                | Qcache_free_memory      | 1031352 |
                | Qcache_hits             | 0       |
                | Qcache_inserts          | 0       |
                | Qcache_lowmem_prunes    | 0       |
                | Qcache_not_cached       | 63      |
                | Qcache_queries_in_cache | 0       |
                | Qcache_total_blocks     | 1       |
                +-------------------------+---------+
                8 rows in set (0.00 sec)

                mysql> SHOW GLOBAL STATUS LIKE ‘Com_se%‘;
                +----------------+-------+
                | Variable_name  | Value |
                +----------------+-------+
                | Com_select     | 75    |
                | Com_set_option | 0     |
                +----------------+-------+
                2 rows in set (0.00 sec)

            字段显示可以使用别名:
                col1 AS alias1, col2 AS alias2, ...

            WHERE子句:指明过滤条件以实现“选择”的功能:
                过滤条件:布尔型表达式;

                算术操作符:+, -, *, /, %
                比较操作符:=, !=, <>, <=>, >, >=, <, <=
                mysql> SELECT name,age,id FROM student WHERE age >10;
                mysql> SELECT name,age,id FROM student WHERE age+10 >10;

                    BETWEEN min_num AND max_num     #取值区间
                    IN (element1, element2, ...)    #等值或条件表达式
                    mysql> SELECT name,age,id FROM student WHERE age  IN (18,100);
                    IS NULL                         #表达式取值为空
                    mysql> SELECT name,age,sex FROM student WHERE sex  IS NULL;
                    IS NOT NULL                     #表达式取值不为空
                    LIKE: 
                        %: 任意长度的任意字符;
                        _:任意单个字符;
                    RLIKE:
                    REGEXP:匹配字符串可用正则表达式书写模式;

                逻辑操作符:

                    NOT #|
                    AND #&&
                    OR  #|| 或
                    XOR #亦或,二者不同则为真,相同则为假

            GROUP:根据指定的条件把查询结果进行“分组”以用于做“聚合”运算:
                avg(), max(), min(), count(), sum()
            mysql> SELECT * FROM student GROUP BY sex;
            mysql> SELECT avg(age) FROM student GROUP BY sex;

                HAVING: 对分组聚合运算后的结果指定过滤条件;
            mysql> SELECT avg(age) as aage,sex FROM student GROUP BY sex HAVING aage>20;
                #aage 定义的字段别名
            mysql> SELECT count(id) AS NOS FROM student GROUP BY id;
            mysql> SELECT count(id) AS NOS,id FROM student GROUP BY id;
            mysql> SELECT count(id) AS NOS,id FROM student GROUP BY id HAVING NOS>2;

            ORDER BY: 根据指定的字段对查询结果进行排序;
                默认为升序
                升序:ASC
                降序:DESC
            mysql> SELECT count(id) AS NOS,id FROM student GROUP BY id HAVING NOS>2 ORDER BY NOS;
            mysql> SELECT count(id) AS NOS,id FROM student GROUP BY id HAVING NOS>2 ORDER BY age DESC;

            LIMIT [[offset,]row_count]:对查询的结果进行输出行数数量限制;
            #offset 偏移量  #row_count 显示多少行
            mysql> SELECT count(id) AS NOS,id FROM student GROUP BY id LIMIT 10;
            +-----+----+
            | NOS | id |
            +-----+----+
            |   1 |  1 |
            |   1 |  4 |
            |   1 |  8 |
            |   1 |  9 |
            |   1 | 10 |
            |   1 | 11 |
            |   1 | 12 |
            |   1 | 13 |
            |   1 | 16 |
            |   1 | 17 |
            +-----+----+
            10 rows in set (0.00 sec)

            mysql> SELECT count(id) AS NOS,id FROM student GROUP BY id LIMIT 10,10;
            +-----+----+
            | NOS | id |
            +-----+----+
            |   1 | 18 |
            |   1 | 19 |
            |   1 | 20 |
            +-----+----+
            3 rows in set (0.00 sec)

            对查询结果中的数据请求施加“锁”:
            [FOR UPDATE | LOCK IN SHARE MODE]]
                FOR UPDATE: 写锁,排他锁,独占锁;
                LOCK IN SHARE MODE: 读锁,共享锁

多表查询:
交叉连接:笛卡尔乘积;
mysql> SELECT FROM student,study_record;
内连接:
等值连接:让表之间的字段以“等值”建立连接关系;
mysql> SELECT
FROM students,teachers WHERE student,TeacherID=teachers.TID
不等值连接
自然连接
自连接
外连接:
左外连接:
FROM tb1 LEFT JOIN tb2 ON tb1.col=tb2.col
右外连接
FROM tb1 RIGHT JOIN tb2 ON tb1.col=tb2.col

        子查询:在查询语句嵌套着查询语句 
            基于某语句的查询结果再次进行的查询

            用在WHERE子句中的子查询:
                (1) 用于比较表达式中的子查询;子查询仅能返回单个值;
                    mysql> SELECT Name,Age FROM students WHERE Age>(SELECT avg(Age) FROM students);
                    mysql> SELECT avg(age) FROM student WHERE age>(SELECT avg(age) FROM student);
                (2) 用于IN中的子查询:子查询应该单键查询并返回一个或多个值从构成列表;
                    mysql> SELECT Name,Age FROM students WHERE Age IN (SELECT Age FROM teachers);
                (3) 用于EXISTS;

            用于FROM子句中的子查询;
                使用格式:SELECT tb_alias.col1,... FROM (SELECT clause) AS tb_alias WHERE Clause; 
                示例:
                mysql> SELECT s.aage,s.ClassID FROM (SELECT avg(Age) AS aage,ClassID FROM students WHERE ClassID IS NOT NULL GROUP BY ClassID) AS s WHERE s.aage>30;

        联合查询:UNION
            mysql> SELECT Name,Age FROM students UNION SELECT Name,Age FROM teachers;

以上是关于DML数据操作语言的主要内容,如果未能解决你的问题,请参考以下文章

MySQL之DML数据操作语言

MySQL之DML数据操作语言

MySQL数据库的简单操作指令之DML语言

SQL DML数据操作语言 教程

DML数据操作语言

SQL入门-DML数据操作语言