匹配查询 mysql存储引擎

Top

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. Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
  7. Oracle is a registered trademark of Oracle Corporation and/or its
  8. affiliates. Other names may be trademarks of their respective
  9. owners.
  10. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
  11. 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. 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. Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
  7. Oracle is a registered trademark of Oracle Corporation and/or its
  8. affiliates. Other names may be trademarks of their respective
  9. owners.
  10. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
  11. 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. mysql> SHOW VARIABLES LIKE 'default_storage_engine';         //确认结果
  4. +------------------------+--------+
  5. | Variable_name | Value |
  6. +------------------------+--------+
  7. | default_storage_engine | MyISAM |
  8. +------------------------+--------+
  9. 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. [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. Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
  7. Oracle is a registered trademark of Oracle Corporation and/or its
  8. affiliates. Other names may be trademarks of their respective
  9. owners.
  10. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
  11. mysql> SHOW VARIABLES LIKE 'default_storage_engine';
  12. +------------------------+--------+
  13. | Variable_name | Value |
  14. +------------------------+--------+
  15. | default_storage_engine | MEMORY |                 //默认引擎已修改
  16. +------------------------+--------+
  17. 1 row in set (0.00 sec)
  18. mysql> exit
  19. 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. +------------------------+--------+

猜你喜欢

转载自www.cnblogs.com/tiki/p/10783384.html
今日推荐