mysql> select * from lucifer; +------+---------------+ | id | name | +------+---------------+ | 1 | lucifer's dog | +------+---------------+ 1 row in set (0.00 sec) mysql>
📢 注意: 在向数据库中插入这些特殊字符时,一定要进行转义处理。
2、MySQL 中可以存储文件吗?
答案当然是可以的!
MySQL 中的 BLOB 和 TEXT 字段类型可以存储数据量较大的文件,可以使用这些数据类型 存储图像、声音或者是大容量的文本内容,例如网页或者文档。
mysql> show fields from lucifer; +-------+------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+------+------+-----+---------+-------+ | date | date | YES | | NULL | | +-------+------+------+-----+---------+-------+ 1 row in set (0.00 sec)
mysql> status -------------- mysql Ver 8.0.26-0ubuntu0.21.04.3 for Linux on aarch64 ((Ubuntu))
Connection id: 10 Current database: Current user: root@localhost SSL: Not in use Current pager: stdout Using outfile: '' Using delimiter: ; Server version: 8.0.26-0ubuntu0.21.04.3 (Ubuntu) Protocol version: 10 Connection: Localhost via UNIX socket Server characterset: utf8mb4 Db characterset: utf8mb4 Client characterset: latin1 Conn. characterset: latin1 UNIX socket: /var/run/mysqld/mysqld.sock Binary data as: Hexadecimal Uptime: 36 min 55 sec
Threads: 2 Questions: 325 Slow queries: 0 Opens: 181 Flush tables: 3 Open tables: 69 Queries per second avg: 0.146 --------------
mysql>
MySQL 配置文件名称为 my.cnf,该文件在 MySQL 的安装目录下面。修改配置文件中的 default-character-set 和 character-set-server 参数值,将其改为想要的字符集名称,如 gbk、gb2312、latinl 等,修改完之后重新启动 MySQL 服务,即可生效。
mysql> select * from lucifer; +------+----------+ | id | name | +------+----------+ | 1 | lucifer | | 2 | lucifer1 | | 3 | lucifer2 | +------+----------+ 3 rows in set (0.00 sec)
mysql> select * from lucifer order by id desc; +------+----------+ | id | name | +------+----------+ | 3 | lucifer2 | | 2 | lucifer1 | | 1 | lucifer | +------+----------+ 3 rows in set (0.00 sec)
例如,要对多列都进行降序排序,必须要在每一列的列名后面加 DESC 关键字。
1 2 3 4 5 6 7 8 9
mysql> select * from lucifer order by id desc,name desc; +------+----------+ | id | name | +------+----------+ | 3 | lucifer2 | | 2 | lucifer1 | | 1 | lucifer | +------+----------+ 3 rows in set (0.00 sec)
mysql> select * from lucifer; +------+-----------+--------+------+ | id | name | sex | age | +------+-----------+--------+------+ | 1 | xiaoli | male | 20 | | 1 | xiaoliu | female | 21 | | 1 | xiaozhang | female | 21 | | 1 | xiaowu | female | 21 | +------+-----------+--------+------+ 4 rows in set (0.00 sec)
mysql> select distinct sex,age from lucifer; +--------+------+ | sex | age | +--------+------+ | male | 20 | | female | 21 | +--------+------+ 2 rows in set (0.00 sec)
mysql>
7、ORDER BY 可以和 LIMIT 混合使用吗?
在使用 ORDER BY 子句时,应保证其位于 FROM 子句之后,如果使用 LIMIT,则必须位于 ORDER BY 之后,如果子句顺序不正确,MySQL 将产生错误消息。
✅ 正确用法:
1 2 3 4 5 6 7 8
mysql> select * from lucifer order by age desc limit 2,4; +------+--------+--------+------+ | id | name | sex | age | +------+--------+--------+------+ | 1 | xiaowu | female | 21 | | 1 | xiaoli | male | 20 | +------+--------+--------+------+ 2 rows in set (0.00 sec)
❎ 错误用法:
1 2 3
mysql> select * from lucifer limit2,4orderby age desc; ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL serverversionfor the right syntax to use near 'order by age desc' at line1 mysql>
8、什么时候使用引号?
在查询的时候,会看到在 WHERE 子句中使用条件,有的值加上了单引号,而有的值未加。
1 2 3 4 5 6 7 8 9 10 11
mysql> select * from lucifer where sex = 'female'; +------+-----------+--------+------+ | id | name | sex | age | +------+-----------+--------+------+ | 1 | xiaoliu | female | 21 | | 1 | xiaozhang | female | 21 | | 1 | xiaowu | female | 21 | +------+-----------+--------+------+ 3 rows in set (0.00 sec)
mysql> select * from lucifer where age = 20; +------+--------+------+------+ | id | name | sex | age | +------+--------+------+------+ | 1 | xiaoli | male | 20 | +------+--------+------+------+ 1 row in set (0.00 sec)
mysql>
9、在 WHERE子句中 AND 和 OR 必须使用圆括号吗?
任何时候使用具有 AND 和 OR 操作符的 WHERE 子句,都应该使用圆括号明确操作顺序。
1 2 3 4 5 6 7 8 9
mysql> select * from lucifer where (age = 20 or sex = 'female') and name != 'xiaowu'; +------+-----------+--------+------+ | id | name | sex | age | +------+-----------+--------+------+ | 1 | xiaoli | male | 20 | | 1 | xiaoliu | female | 21 | | 1 | xiaozhang | female | 21 | +------+-----------+--------+------+ mysql> 3 rows in set (0.00 sec)
mysql> update lucifer set age = 22 where name = 'xiaoliu'; Query OK, 1 row affected (0.01 sec) Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from lucifer where name = 'xiaoliu'; +------+---------+--------+------+ | id | name | sex | age | +------+---------+--------+------+ | 1 | xiaoliu | female | 22 | +------+---------+--------+------+ 1 row in set (0.00 sec)
-- 使用 GRANT 语句创建用户 mysql> GRANTSELECTON*.* TO'lucifer2'@localhost IDENTIFIED BY'lucifer'; ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL serverversionfor the right syntax to use near 'IDENTIFIED BY 'lucifer'' at line1 mysql>
📢 注意: 由于测试使用的是 MySQL 8 版本,已经不支持 GRANT 直接创建用户,5.7 版本依然是支持的。
-- 检查是否开启慢查询 mysql> show variables like 'slow_query%'; +---------------------+------------------------------+ | Variable_name | Value | +---------------------+------------------------------+ | slow_query_log | OFF | | slow_query_log_file | /var/lib/mysql/modb-slow.log | +---------------------+------------------------------+ 2 rows in set (0.00 sec)
mysql> show variables like 'long_query_time'; +-----------------+-----------+ | Variable_name | Value | +-----------------+-----------+ | long_query_time | 10.000000 | +-----------------+-----------+ 1 row in set (0.01 sec)
-- 开启慢查询日志 mysql> set global slow_query_log='ON'; Query OK, 0 rows affected (0.00 sec)
-- 设置查询超过10秒就记录 mysql> set global long_query_time=10; Query OK, 0 rows affected (0.00 sec)
-- 再次检查是否开启 mysql> show variables like 'slow_query%'; mysql> +---------------------+------------------------------+ | Variable_name | Value | +---------------------+------------------------------+ | slow_query_log | ON | | slow_query_log_file | /var/lib/mysql/modb-slow.log | +---------------------+------------------------------+ 2 rows in set (0.00 sec)
mysql> show variables like 'general_log%'; +------------------+-------------------------+ | Variable_name | Value | +------------------+-------------------------+ | general_log | OFF | | general_log_file | /var/lib/mysql/modb.log | +------------------+-------------------------+ 2 rows in set (0.00 sec)
-- 开启通用查询日志 mysql> SET GLOBAL general_log=1; Query OK, 0 rows affected (0.00 sec)
mysql> show variables like 'general_log%'; +------------------+-------------------------+ | Variable_name | Value | +------------------+-------------------------+ | general_log | ON | | general_log_file | /var/lib/mysql/modb.log | +------------------+-------------------------+ 2 rows in set (0.00 sec)
如果需要记录数据的变更,可以开启二进制日志;错误日志是默认开启的。
1 2 3 4 5 6 7 8 9 10 11 12 13
mysql> show variables like 'log_bin%'; +---------------------------------+-----------------------------+ | Variable_name | Value | +---------------------------------+-----------------------------+ | log_bin | ON | | log_bin_basename | /var/lib/mysql/binlog | | log_bin_index | /var/lib/mysql/binlog.index | | log_bin_trust_function_creators | OFF | | log_bin_use_v1_row_events | OFF | +---------------------------------+-----------------------------+ 5 rows in set (0.00 sec)