NSD DBA1 DAY04

  1. 查询及匹配条件
  2. MySQL存储引擎的配置

1 查询及匹配条件

1.1 问题

练习常见的SQL查询及条件设置

  1. 创建stu_info表,并插入数据
  2. 练习常见SQL查询及条件设置

1.2 步骤

实现此案例需要按照如下步骤进行。

步骤一:根据任务要求建立员工档案表stu_info(如上个实验已创建,可将上个实验stu_info表中记录清除后继续使用)

1)在userdb库中创建stu_info表

以root用户登入MySQL服务器:

1. [root@dbsvr1 ~]# mysql -u root -p
2. Enter password:
3. Welcome to the MySQL monitor. Commands end with ; or \g.
4. Your MySQL connection id is 5
5. Server version: 5.6.15 MySQL Community Server (GPL)
6. 
7. Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
8. 
9. Oracle is a registered trademark of Oracle Corporation and/or its
10. affiliates. Other names may be trademarks of their respective
11. owners.
12. 
13. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
14. 
15. mysql>

打开test库:

1. mysql> USE userdb;
2. Reading table information for completion of table and column names
3. You can turn off this feature to get a quicker startup with -A
4. 
5. Database changed

创建stu_info表,包括name、gender、age三个字段:

1. mysql> CREATE TABLE stu_info(
2. -> name varchar(12) NOT NULL,
3. -> gender enum('boy','girl') DEFAULT 'boy',
4. -> age int(3) NOT NULL
5. -> );
6. Query OK, 0 rows affected (0.03 sec)

确认表结构:

1. mysql> DESC stu_info;
2. +--------+--------------------+------+-----+---------+-------+
3. | Field | Type | Null | Key | Default | Extra |
4. +--------+--------------------+------+-----+---------+-------+
5. | name | varchar(12) | NO | | NULL | |
6. | gender | enum('boy','girl') | YES | | boy | |
7. | age | int(3) | NO | | NULL | |
8. +--------+--------------------+------+-----+---------+-------+
9. 3 rows in set (0.01 sec)

2)准备测试表格

向建立的stu_info表插入几条测试记录

1. mysql> INSERT INTO stu_info VALUES
2. -> ('Jim','girl',24),
3. -> ('Tom','boy',21),
4. -> ('Lily','girl',20),
5. -> ('Jerry','boy',27),
6. -> ('Mike','boy',21)
7. -> ;
8. Query OK, 5 rows affected (0.06 sec)
9. Records: 5 Duplicates: 0 Warnings: 0

确认stu_info表的所有记录内容:

1. mysql> SELECT * FROM stu_info;
2. +-------+--------+-----+
3. | name | gender | age |
4. +-------+--------+-----+
5. | Jim | girl | 24 |
6. | Tom | boy | 21 |
7. | Lily | girl | 20 |
8. | Jerry | boy | 27 |
9. | Mike | boy | 21 |
10. +-------+--------+-----+
11. 5 rows in set (0.00 sec)

步骤二:练习常见SQL查询及条件设置

1)常用的表记录统计函数

查询stu_info表一共有多少条记录(本例中为5条):

1. mysql> SELECT count(*) FROM stu_info;
2. +----------+
3. | count(*) |
4. +----------+
5. | 5 |
6. +----------+
7. 1 row in set (0.00 sec)

计算stu_info表中各学员的平均年龄、最大年龄、最小年龄:

1. mysql> SELECT avg(age),max(age),min(age) FROM stu_info;
2. +----------+----------+----------+
3. | avg(age) | max(age) | min(age) |
4. +----------+----------+----------+
5. | 22.6000 | 27 | 20 |
6. +----------+----------+----------+
7. 1 row in set (0.00 sec)

计算stu_info表中男学员的个数:

1. mysql> SELECT count(gender) FROM stu_info WHERE gender='boy';
2. +---------------+
3. | count(gender) |
4. +---------------+
5. | 3 |
6. +---------------+
7. 1 row in set (0.00 sec)

2)字段值的数值比较

列出stu_info表中年龄为21岁的学员记录:

    1. mysql> SELECT * FROM stu_info WHERE age=21;
    2. +------+--------+-----+
    3. | name | gender | age |
    4. +------+--------+-----+
    5. | Tom | boy | 21 |
    6. | Mike | boy | 21 |
    7. +------+--------+-----+
    8. 2 rows in set (0.00 sec)

    列出stu_info表中年龄超过21岁的学员记录:

    1. mysql> SELECT * FROM stu_info WHERE age>21;
    2. +-------+--------+-----+
    3. | name | gender | age |
    4. +-------+--------+-----+
    5. | Jim | girl | 24 |
    6. | Jerry | boy | 27 |
    7. +-------+--------+-----+
    8. 2 rows in set (0.00 sec)

    列出stu_info表中年龄大于或等于21岁的学员记录:

    1. mysql> SELECT * FROM stu_info WHERE age>=21;
    2. +-------+--------+-----+
    3. | name | gender | age |
    4. +-------+--------+-----+
    5. | Jim | girl | 24 |
    6. | Tom | boy | 21 |
    7. | Jerry | boy | 27 |
    8. | Mike | boy | 21 |
    9. +-------+--------+-----+
    10. 4 rows in set (0.00 sec)

    列出stu_info表中年龄在20岁和24岁之间的学员记录:

    1. mysql> SELECT * FROM stu_info WHERE age BETWEEN 20 and 24;
    2. +------+--------+-----+
    3. | name | gender | age |
    4. +------+--------+-----+
    5. | Jim | girl | 24 |
    6. | Tom | boy | 21 |
    7. | Lily | girl | 20 |
    8. | Mike | boy | 21 |
    9. +------+--------+-----+
    10. 4 rows in set (0.00 sec)

    3)多个条件的组合

    列出stu_info表中年龄小于23岁的女学员记录:

    1. mysql> SELECT * FROM stu_info WHERE age < 23 AND gender='girl';
    2. +------+--------+-----+
    3. | name | gender | age |
    4. +------+--------+-----+
    5. | Lily | girl | 20 |
    6. +------+--------+-----+
    7. 1 row in set (0.00 sec)

    列出stu_info表中年龄小于23岁的学员,或者女学员的记录:

    1. mysql> SELECT * FROM stu_info WHERE age < 23 OR gender='girl';
    2. +------+--------+-----+
    3. | name | gender | age |
    4. +------+--------+-----+
    5. | Jim | girl | 24 |
    6. | Tom | boy | 21 |
    7. | Lily | girl | 20 |
    8. | Mike | boy | 21 |
    9. +------+--------+-----+
    10. 4 rows in set (0.00 sec)

    如果某个记录的姓名属于指定范围内的一个,则将其列出:

    1. mysql> SELECT * FROM stu_info WHERE name IN
    2. -> ('Jim','Tom','Mickey','Minnie');
    3. +------+--------+-----+
    4. | name | gender | age |
    5. +------+--------+-----+
    6. | Jim | girl | 24 |
    7. | Tom | boy | 21 |
    8. +------+--------+-----+
    9. 2 rows in set (0.00 sec)

    4)使用SELECT做数学计算

    计算1234与5678的和:

    1. mysql> SELECT 1234+5678;
    2. +-----------+
    3. | 1234+5678 |
    4. +-----------+
    5. | 6912 |
    6. +-----------+
    7. 1 row in set (0.00 sec)

    计算1234与5678的乘积:

    1. mysql> SELECT 1234*5678;
    2. +-----------+
    3. | 1234*5678 |
    4. +-----------+
    5. | 7006652 |
    6. +-----------+
    7. 1 row in set (0.00 sec)

    计算1.23456789除以3的结果:

    1. mysql> SELECT 1.23456789/3;
    2. +----------------+
    3. | 1.23456789/3 |
    4. +----------------+
    5. | 0.411522630000 |
    6. +----------------+
    7. 1 row in set (0.00 sec)

    输出stu_info表各学员的姓名、15年后的年龄:

    1. mysql> SELECT name,age+15 FROM stu_info;
    2. +-------+--------+
    3. | name | age+15 |
    4. +-------+--------+
    5. | Jim | 39 |
    6. | Tom | 36 |
    7. | Lily | 35 |
    8. | Jerry | 42 |
    9. | Mike | 36 |
    10. +-------+--------+
    11. 5 rows in set (0.00 sec)

    5)使用模糊查询,LIKE引领

    以下划线 _ 匹配单个字符,% 可匹配任意多个字符。

    列出stu_info表中姓名以“J”开头的学员记录:

    1. mysql> SELECT * FROM stu_info WHERE name LIKE 'J%';
    2. +-------+--------+-----+
    3. | name | gender | age |
    4. +-------+--------+-----+
    5. | Jim | girl | 24 |
    6. | Jerry | boy | 27 |
    7. +-------+--------+-----+
    8. 2 rows in set (0.00 sec)

    列出stu_info表中姓名以“J”开头且只有3个字母的学员记录:

    1. mysql> SELECT * FROM stu_info WHERE name LIKE 'J__';
    2. +------+--------+-----+
    3. | name | gender | age |
    4. +------+--------+-----+
    5. | Jim | girl | 24 |
    6. +------+--------+-----+
    7. 1 row in set (0.00 sec)

    6)使用正则表达式,REGEXP引领

    列出stu_info表中姓名以“J”开头且以“y”结尾的学员记录:

    1. mysql> SELECT * FROM stu_info WHERE name REGEXP '^J.*y$';
    2. +-------+--------+-----+
    3. | name | gender | age |
    4. +-------+--------+-----+
    5. | Jerry | boy | 27 |
    6. +-------+--------+-----+
    7. 1 row in set (0.00 sec)

    效果等同于:

    1. mysql> SELECT * FROM stu_info WHERE name Like 'J%y';
    2. +-------+--------+-----+
    3. | name | gender | age |
    4. +-------+--------+-----+
    5. | Jerry | boy | 27 |
    6. +-------+--------+-----+
    7. 1 row in set (0.00 sec)

    列出stu_info表中姓名以“J”开头或者以“y”结尾的学员记录:

    1. mysql> SELECT * FROM stu_info WHERE name REGEXP '^J|y$';
    2. +-------+--------+-----+
    3. | name | gender | age |
    4. +-------+--------+-----+
    5. | Jim | girl | 24 |
    6. | Lily | girl | 20 |
    7. | Jerry | boy | 27 |
    8. +-------+--------+-----+
    9. 3 rows in set (0.00 sec)

    效果等同于:

    1. mysql> SELECT * FROM stu_info WHERE name Like 'J%' OR name Like '%y';
    2. +-------+--------+-----+
    3. | name | gender | age |
    4. +-------+--------+-----+
    5. | Jim | girl | 24 |
    6. | Lily | girl | 20 |
    7. | Jerry | boy | 27 |
    8. +-------+--------+-----+
    9. 3 rows in set (0.00 sec)

    7)按指定的字段排序,ORDER BY

    列出stu_info表的所有记录,按年龄排序:

    1. mysql> SELECT * FROM stu_info GROUP BY age;
    2. +-------+--------+-----+
    3. | name | gender | age |
    4. +-------+--------+-----+
    5. | Lily | girl | 20 |
    6. | Tom | boy | 21 |
    7. | Jim | girl | 24 |
    8. | Jerry | boy | 27 |
    9. +-------+--------+-----+
    10. 4 rows in set (0.00 sec)

    因默认为升序(Ascend)排列,所以上述操作等效于:

    1. mysql> SELECT * FROM stu_info GROUP BY age ASC;
    2. +-------+--------+-----+
    3. | name | gender | age |
    4. +-------+--------+-----+
    5. | Lily | girl | 20 |
    6. | Tom | boy | 21 |
    7. | Jim | girl | 24 |
    8. | Jerry | boy | 27 |
    9. +-------+--------+-----+
    10. 4 rows in set (0.00 sec)

    若要按降序(Descend)排列,则将ASC改为DESC即可:

    1. mysql> SELECT * FROM stu_info GROUP BY age DESC;
    2. +-------+--------+-----+
    3. | name | gender | age |
    4. +-------+--------+-----+
    5. | Jerry | boy | 27 |
    6. | Jim | girl | 24 |
    7. | Tom | boy | 21 |
    8. | Lily | girl | 20 |
    9. +-------+--------+-----+
    10. 4 rows in set (0.00 sec)

    8)限制查询结果的输出条数,LIMIT

    查询stu_info表的所有记录,只列出前3条:

    1. mysql> SELECT * FROM stu_info LIMIT 3;
    2. +------+--------+-----+
    3. | name | gender | age |
    4. +------+--------+-----+
    5. | Jim | girl | 24 |
    6. | Tom | boy | 21 |
    7. | Lily | girl | 20 |
    8. +------+--------+-----+
    9. 3 rows in set (0.00 sec)

    列出stu_info表中年龄最大的3条学员记录:

    1. mysql> SELECT * FROM stu_info GROUP BY age DESC LIMIT 3;
    2. +-------+--------+-----+
    3. | name | gender | age |
    4. +-------+--------+-----+
    5. | Jerry | boy | 27 |
    6. | Jim | girl | 24 |
    7. | Tom | boy | 21 |
    8. +-------+--------+-----+
    9. 3 rows in set (0.00 sec)

    9)分组查询结果,GROUP BY

    针对stu_info表,按性别分组,分别统计出男、女学员的人数:

    1. mysql> SELECT gender,count(gender) FROM stu_info GROUP BY gender;
    2. +--------+---------------+
    3. | gender | count(gender) |
    4. +--------+---------------+
    5. | boy | 3 |
    6. | girl | 2 |
    7. +--------+---------------+
    8. 2 rows in set (0.00 sec)

    列出查询字段时,可以通过AS关键字来指定显示别名,比如上述操作可改为:

    1. mysql> SELECT gender AS '性别',count(gender) AS '人数'
    2. -> FROM stu_info GROUP BY gender;
    3. +--------+--------+
    4. | 性别 | 人数 |
    5. +--------+--------+
    6. | boy | 3 |
    7. | girl | 2 |
    8. +--------+--------+
    9. 2 rows in set (0.00 sec)

    2 MySQL存储引擎的配置

    2.1 问题

    本案例要求MySQL数据存储引擎的使用,完成以下任务操作:

    • 查看服务支持的存储引擎
    • 查看默认存储类型
    • 更改表的存储引擎
    • 设置数据库服务默认使用的存储引擎

    2.2 步骤

    实现此案例需要按照如下步骤进行。

    步骤一:查看存储引擎信息

    登入MySQL服务器,查看当前支持哪些存储引擎。

    使用mysql命令连接,以root用户登入:

    1. [root@dbsvr1 ~]# mysql -u root –p
    2. Enter password: 
    3. Welcome to the MySQL monitor. Commands end with ; or \g.
    4. Your MySQL connection id is 9
    5. Server version: 5.7.17 MySQL Community Server (GPL)
    6. 
    7. Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
    8. 
    9. Oracle is a registered trademark of Oracle Corporation and/or its
    10. affiliates. Other names may be trademarks of their respective
    11. owners.
    12. 
    13. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    14. 
    15. mysql>

    执行SHOW ENGINES\G指令可列表查看,MySQL 5.6可用的存储引擎有9种(除最后的FEDERATED以外,其他8种都支持),其中默认采用的存储引擎为InnoDB:

    1. mysql> SHOW ENGINES\G
    2. *************************** 1. row ***************************
    3. Engine: InnoDB
    4. Support: DEFAULT //此存储引擎为默认
    5. Comment: Supports transactions, row-level locking, and foreign keys
    6. Transactions: YES
    7. XA: YES
    8. Savepoints: YES
    9. *************************** 2. row ***************************
    10. Engine: MRG_MYISAM
    11. Support: YES
    12. Comment: Collection of identical MyISAM tables
    13. Transactions: NO
    14. XA: NO
    15. Savepoints: NO
    16. *************************** 3. row ***************************
    17. Engine: MEMORY
    18. Support: YES
    19. Comment: Hash based, stored in memory, useful for temporary tables
    20. Transactions: NO
    21. XA: NO
    22. Savepoints: NO
    23. *************************** 4. row ***************************
    24. Engine: BLACKHOLE
    25. Support: YES
    26. Comment: /dev/null storage engine (anything you write to it disappears)
    27. Transactions: NO
    28. XA: NO
    29. Savepoints: NO
    30. *************************** 5. row ***************************
    31. Engine: MyISAM
    32. Support: YES
    33. Comment: MyISAM storage engine
    34. Transactions: NO
    35. XA: NO
    36. Savepoints: NO
    37. *************************** 6. row ***************************
    38. Engine: CSV
    39. Support: YES
    40. Comment: CSV storage engine
    41. Transactions: NO
    42. XA: NO
    43. Savepoints: NO
    44. *************************** 7. row ***************************
    45. Engine: ARCHIVE
    46. Support: YES
    47. Comment: Archive storage engine
    48. Transactions: NO
    49. XA: NO
    50. Savepoints: NO
    51. *************************** 8. row ***************************
    52. Engine: PERFORMANCE_SCHEMA
    53. Support: YES
    54. Comment: Performance Schema
    55. Transactions: NO
    56. XA: NO
    57. Savepoints: NO
    58. *************************** 9. row ***************************
    59. Engine: FEDERATED
    60. Support: NO //此引擎不被支持
    61. Comment: Federated MySQL storage engine
    62. Transactions: NULL
    63. XA: NULL
    64. Savepoints: NULL
    65. 9 rows in set (0.01 sec)

    步骤二:查看默认存储类型

    查看系统变量default_storage_engine 的值,确认默认采用的存储引擎是InnoDB:

    1. mysql> SHOW VARIABLES LIKE 'default_storage_engine';
    2. +------------------------+--------+
    3. | Variable_name | Value |
    4. +------------------------+--------+
    5. | default_storage_engine | InnoDB |
    6. +------------------------+--------+
    7. 1 row in set (0.00 sec)

    步骤三:修改默认存储引擎

    在 mysql> 环境中,可以直接通过SET指令更改默认的存储引擎(只在本次连接会话过程中有效,退出重进即失效) 。比如临时修改为MyISAM,可执行下列操作:

    1. mysql> SET default_storage_engine=MyISAM;             //改用MyISAM引擎
    2. Query OK, 0 rows affected (0.00 sec)
    3. 
    4. mysql> SHOW VARIABLES LIKE 'default_storage_engine';         //确认结果
    5. +------------------------+--------+
    6. | Variable_name | Value |
    7. +------------------------+--------+
    8. | default_storage_engine | MyISAM |
    9. +------------------------+--------+
    10. 1 row in set (0.00 sec)

    若希望直接修改MySQL服务程序所采用的默认存储引擎,应将相关设置写入配置文件/etc/my.cnf,并重启服务后生效。比如:

    1. [root@dbsvr1 ~]# vim /etc/my.cnf
    2. [mysqld]
    3. .. ..
    4. default_storage_engine=MEMORY                             //改用MEMORY引擎
    5. 
    6. [root@dbsvr1 ~]# systemctl restart mysqld.service         //重启服务

    重新登入 mysql> 确认修改结果:

    1. [root@dbsvr1 ~]# mysql -u root -p
    2. Enter password: 
    3. Welcome to the MySQL monitor. Commands end with ; or \g.
    4. Your MySQL connection id is 3
    5. Server version: 5.7.17 MySQL Community Server (GPL)
    6. 
    7. Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
    8. 
    9. Oracle is a registered trademark of Oracle Corporation and/or its
    10. affiliates. Other names may be trademarks of their respective
    11. owners.
    12. 
    13. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    14. 
    15. 
    16. mysql> SHOW VARIABLES LIKE 'default_storage_engine';
    17. +------------------------+--------+
    18. | Variable_name | Value |
    19. +------------------------+--------+
    20. | default_storage_engine | MEMORY |                 //默认引擎已修改
    21. +------------------------+--------+
    22. 1 row in set (0.00 sec)
    23. 
    24. mysql> exit
    25. Bye

    步骤四:设置数据库服务默认使用的存储引擎

    为了避免后续实验障碍,测试完后记得恢复原状——移除默认引擎设置,或者将其修改为InnoDB即可:

    1. [root@dbsvr1 ~]# vim /etc/my.cnf
    2. [mysqld]
    3. .. ..
    4. default_storage_engine=InnoDB
    5. [root@dbsvr1 ~]# systemctl restart mysqld.service

    确认恢复结果(选项 -e 可调用指定的SQL操作后返回Shell命令行):

      1. [root@dbsvr1 ~]# mysql -u root -p -e "SHOW VARIABLES LIKE 'default_storage_engine';"
      2. Enter password:
      3. +------------------------+--------+
      4. | Variable_name | Value |
      5. +------------------------+--------+
      6. | default_storage_engine | InnoDB |
      7. +------------------------+--------+