前言
个人感觉 MySQL 没有太多的逻辑问题,只有对语句的熟练使用,会对数据进行增删查改操作即可。本章节的内容将会收集一些常用的 MySQL 的指令的使用。
目录
前言
解决MySQL无法输入中文字符的问题
数据库操作
显示当前的数据库
创建数据库
删除数据库
使用数据库
数据表操作
创建表
显示当前的数据表
查看表结构
删除表
表的新增
单行数据 + 全列插入
多行数据 + 指定列插入
表的查询
全列查询
指定列查询
查询字段为表达式
为查询字段取别名
去重查询
排序查询
排升序
排降序
条件查询
分页查询
解决MySQL无法输入中文字符的问题
大多数的老铁刚开始使用 MuSQL 时,会发现数据库表插入不了中文数据。这主要是因为字符集的问题。
比如我使用 inster into 语句往 book 这个表中插入了一条中文
mysql> insert into book values(100,"东方");
但是却意外的抛出了这个错误:
ERROR 1366 (HY000): Incorrect string value: '\xB6\xAB\xB7\xBD' for column 'bookName' at row 1
仔细阅读报错提示后,说是【错误1366(HY000):字符串值不正确:第1行“bookName”列的“\xB6\xAB\xB7\xBD”】
原因是:MySQL中输入中文在MySQL建表的时候,直接往表中的varchar(255)中输入中文的话是会报错的,大概是因为数据库的默认编码是 latin1 而不是 utf8
我们用使用一下指令来查看我们数据库的默认字符集:
show variables like '%character%';
运行结果:
mysql> show variables like '%character%'; +--------------------------+-------------------------------------------------------+ | Variable_name | Value | +--------------------------+-------------------------------------------------------+ | character_set_client | gbk | | character_set_connection | gbk | | character_set_database | latin1 | | character_set_filesystem | binary | | character_set_results | gbk | | character_set_server | latin1 | | character_set_system | utf8 | | character_sets_dir | C:\Program Files\MySQL\MySQL Server 5\share\charsets\ | +--------------------------+-------------------------------------------------------+ 8 rows in set, 1 warning (0.00 sec)
数据库的默认编码是 latin1 而不是 utf8
也可以使用以下指令查看单个数据库的字符集
show create database 数据库名;
运行结果:
mysql> show create database book; +----------+-----------------------------------------------------------------+ | Database | Create Database | +----------+-----------------------------------------------------------------+ | book | CREATE DATABASE `book` /*!40100 DEFAULT CHARACTER SET latin1 */ | +----------+-----------------------------------------------------------------+ 1 row in set (0.00 sec)
解决问题:
方法一:
使用以下指令,创建数据库的时候就指定字符集
create database 数据库名 character set utf8;
方法二:
使用以下指令,修改当前数据库编码格式
alter database 数据库名 character set utf8;
方法三:
也是一劳永逸的方法,直接修改 MySQL 的配置文件
<1>你可以去下载一个 everything,查询 my.ini 配置文件且找到 MySQL 下的即可
<2>然后我们就可以通过记事本等方式去打开这个配置文件
修改以下字符集
default-character-set=utf8
...
character-set-server=utf8
<3>按住 win+R 打开命令行,输入 services.msc 进入服务管理
重启一下 MySQL 服务
再次启动MySQL创建一个新的数据库去看看我们的数据库默认字符集是否改成utf8了
注意之前创建的那个数据库由于已经创建好了,不会跟着我们的配置文件的修改而修改,所以字符集仍然是 [latin1]
(最好删掉,或者改变字符集)
mysql> show variables like '%char%';
+--------------------------+-------------------------------------------------------+
| Variable_name | Value |
+--------------------------+-------------------------------------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | C:\Program Files\MySQL\MySQL Server 5\share\charsets\ |
+--------------------------+-------------------------------------------------------+
8 rows in set, 1 warning (0.00 sec)
这样现在我们任意创建的数据库的字符集都是 utf8
mysql> create database t1;
Query OK, 1 row affected (0.00 sec)
mysql> show create database t1;
+----------+-------------------------------------------------------------+
| Database | Create Database |
+----------+-------------------------------------------------------------+
| t1 | CREATE DATABASE `t1` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+-------------------------------------------------------------+
1 row in set (0.00 sec)
如果你还在修改字符集中遇到了问题,可以参考这个博主的视频【mysql中文乱码 中文不能插入】
数据库操作
显示当前的数据库
注意 MySQL 中的语句不分大小写
SHOW DATABASES;
运行结果:
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| t1 |
+--------------------+
5 rows in set (0.00 sec)
mysql> create database t2;
Query OK, 1 row affected (0.00 sec)
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| t1 |
| t2 |
+--------------------+
6 rows in set (0.00 sec)
创建数据库
CREATE DATABASE 数据库名;
以上是我们最简单创建数据库的方法:
但是如果存在当前数据库则会报错
mysql> create database t2;
ERROR 1007 (HY000): Can't create database 't2'; database exists
如果你在创建数据库时,想要指定字符集,可以这么写
create database 数据库名 character set 字符集;
删除数据库
DROP DATABASE 数据库名;
Query OK, 0 rows affected (0.00 sec)
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| t2 |
+--------------------+
5 rows in set (0.00 sec)
使用数据库
我们在对数据库进行操作的时候,一定要指定(进入)数据库
use 数据库名;
数据表操作
创建表
约束等下再讲 ~
CREATE TABLE 数据表名(列名1 数据类型 [约束],列名2 数据类型 [约束]...);
mysql> use t2;
Database changed
mysql> create table book(bookId int,bookName varchar(10));
Query OK, 0 rows affected (0.02 sec)
可以使用 comment 增加字段说明,相当于备注
mysql> create table student(studentId int comment '学生学号',studentName varchar(10) comment '学生姓名');
Query OK, 0 rows affected (0.03 sec)
显示当前的数据表
show tables;
mysql> show tables;
+--------------+
| Tables_in_t2 |
+--------------+
| book |
| student |
+--------------+
2 rows in set (0.00 sec)
查看表结构
desc 数据表名;
mysql> desc student;
+-------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-------------+------+-----+---------+-------+
| studentId | int(11) | YES | | NULL | |
| studentName | varchar(10) | YES | | NULL | |
+-------------+-------------+------+-----+---------+-------+
2 rows in set (0.01 sec)
删除表
DROP TABLE 数据表名;
mysql> DROP TABLE book;
Query OK, 0 rows affected (0.01 sec)
mysql> show tables;
+--------------+
| Tables_in_t2 |
+--------------+
| student |
+--------------+
1 row in set (0.00 sec)
表的新增
单行数据 + 全列插入
INSERT INTO 数据表名 VALUES (值1, 值2, ...);
mysql> create table book(bookId int,bookName varchar(20),bookPrice double);
Query OK, 0 rows affected (0.02 sec)
mysql> insert into book value(111,"诗经",9.9);
Query OK, 1 row affected (0.00 sec)
mysql> select * from book;
+--------+----------+-----------+
| bookId | bookName | bookPrice |
+--------+----------+-----------+
| 111 | 诗经 | 9.9 |
+--------+----------+-----------+
1 row in set (0.00 sec)
多行数据 + 指定列插入
INSERT INTO 数据表名 (列1, 列2, ...) VALUES (值1, 值2, ...);
mysql> insert into book (bookName,bookPrice,bookId) values ("离骚",18,222);
Query OK, 1 row affected (0.00 sec)
mysql> select * from book;
+--------+----------+-----------+
| bookId | bookName | bookPrice |
+--------+----------+-----------+
| 111 | 诗经 | 9.9 |
| 222 | 离骚 | 18 |
+--------+----------+-----------+
2 rows in set (0.00 sec)
当然你也可以选着只插入一部分数据
mysql> insert into book (bookName) values ("围炉夜话");
Query OK, 1 row affected (0.00 sec)
mysql> select * from book;
+--------+--------------+-----------+
| bookId | bookName | bookPrice |
+--------+--------------+-----------+
| 111 | 诗经 | 9.9 |
| 222 | 离骚 | 18 |
| NULL | 围炉夜话 | NULL |
+--------+--------------+-----------+
3 rows in set (0.00 sec)
这样的话,其他的变量值为 NULL
表的查询
全列查询
SELECT * FROM 数据表名;
数据量小时可以使用,数据量大时不推荐使用。查询的列越多,意味着需要传输的数据量越大,效率越低。
指定列查询
SELECT 列1, 列2, ... FROM 数据表名;
mysql> select bookName from book;
+--------------+
| bookName |
+--------------+
| 诗经 |
| 离骚 |
| 围炉夜话 |
+--------------+
查询字段为表达式
如果我们要对一些数据进行运算也可以这么使用:
注意:这里的计算并不会对硬盘的数据进行任何更改,这里的表达式计算针对的是数据库建的 “新表” ,这个跟 “寄存器” 的性质差不多,只是临时存储表达式的值。
mysql> select bookName,bookPrice+10 from book;
+--------------+--------------+
| bookName | bookPrice+10 |
+--------------+--------------+
| 诗经 | 19.9 |
| 离骚 | 28 |
| 围炉夜话 | NULL |
+--------------+--------------+
3 rows in set (0.00 sec)
mysql> select bookName,bookPrice+bookId from book;
+--------------+------------------+
| bookName | bookPrice+bookId |
+--------------+------------------+
| 诗经 | 120.9 |
| 离骚 | 240 |
| 围炉夜话 | NULL |
+--------------+------------------+
3 rows in set (0.00 sec)
为查询字段取别名
表名 [as] 表别名
其中 as 可以省略
mysql> select bookName,bookPrice+10 as "涨价后的价格" from book;
+--------------+--------------------+
| bookName | 涨价后的价格 |
+--------------+--------------------+
| 诗经 | 19.9 |
| 离骚 | 28 |
| 围炉夜话 | NULL |
+--------------+--------------------+
3 rows in set (0.00 sec)
mysql> ^C
mysql> select bookName,bookPrice+10 "涨价后的价格" from book;
+--------------+--------------------+
| bookName | 涨价后的价格 |
+--------------+--------------------+
| 诗经 | 19.9 |
| 离骚 | 28 |
| 围炉夜话 | NULL |
+--------------+--------------------+
3 rows in set (0.00 sec)
去重查询
使用 DISTINCT 关键字对某列数据进行去重
SELECT DISTINCT 列1, 列2, ... FROM 数据表名;
mysql> select bookPrice from book;
+-----------+
| bookPrice |
+-----------+
| 9.9 |
| 18 |
| NULL |
| 9.9 |
+-----------+
4 rows in set (0.00 sec)
mysql> SELECT DISTINCT bookPrice from book;
+-----------+
| bookPrice |
+-----------+
| 9.9 |
| 18 |
| NULL |
+-----------+
3 rows in set (0.00 sec)
注意:如果是多列的情况,必须所有列都相同才会触发去重
mysql> select bookName,bookPrice from book;
+--------------+-----------+
| bookName | bookPrice |
+--------------+-----------+
| 诗经 | 9.9 |
| 离骚 | 18 |
| 围炉夜话 | NULL |
| 春秋 | 9.9 |
+--------------+-----------+
4 rows in set (0.00 sec)
mysql> SELECT DISTINCT bookName,bookPrice from book;
+--------------+-----------+
| bookName | bookPrice |
+--------------+-----------+
| 诗经 | 9.9 |
| 离骚 | 18 |
| 围炉夜话 | NULL |
| 春秋 | 9.9 |
+--------------+-----------+
4 rows in set (0.00 sec)
排序查询
排序的时候我们可以指定某一列进行排序,也可以指定升序或者降序。
排升序
SELECT DISTINCT 列1, 列2, ... FROM 数据表名 ORDER BY 排序参考 [ASC];
注意:ASC 可以省略
mysql> select * from exam_result;
+------+-----------+---------+------+---------+
| id | name | chinese | math | english |
+------+-----------+---------+------+---------+
| 1 | 唐三藏 | 67.0 | 98.0 | 56.0 |
| 2 | 孙悟空 | 87.5 | 78.0 | 77.0 |
| 3 | 猪悟能 | 88.0 | 98.5 | 90.0 |
| 4 | 曹孟德 | 82.0 | 84.0 | 67.0 |
| 5 | 刘玄德 | 55.5 | 85.0 | 45.0 |
| 6 | 孙权 | 70.0 | 73.0 | 78.5 |
| 7 | 宋公明 | 75.0 | 65.0 | 30.0 |
+------+-----------+---------+------+---------+
7 rows in set (0.00 sec)
mysql> SELECT name, math FROM exam_result ORDER BY math;
+-----------+------+
| name | math |
+-----------+------+
| 宋公明 | 65.0 |
| 孙权 | 73.0 |
| 孙悟空 | 78.0 |
| 曹孟德 | 84.0 |
| 刘玄德 | 85.0 |
| 唐三藏 | 98.0 |
| 猪悟能 | 98.5 |
+-----------+------+
7 rows in set (0.00 sec)
排降序
SELECT DISTINCT 列1, 列2, ... FROM 数据表名 ORDER BY 排序参考 DESC;
mysql> SELECT name, math FROM exam_result ORDER BY math DESC;
+-----------+------+
| name | math |
+-----------+------+
| 猪悟能 | 98.5 |
| 唐三藏 | 98.0 |
| 刘玄德 | 85.0 |
| 曹孟德 | 84.0 |
| 孙悟空 | 78.0 |
| 孙权 | 73.0 |
| 宋公明 | 65.0 |
+-----------+------+
7 rows in set (0.00 sec)
条件查询
SELECT 列1, 列2, ... FROM 表名 WHERE 条件;
运算符:
mysql> select * from exam_result;
+------+-----------+---------+------+---------+
| id | name | chinese | math | english |
+------+-----------+---------+------+---------+
| 1 | 唐三藏 | 67.0 | 98.0 | 56.0 |
| 2 | 孙悟空 | 87.5 | 78.0 | 77.0 |
| 3 | 猪悟能 | 88.0 | 98.5 | 90.0 |
| 4 | 曹孟德 | 82.0 | 84.0 | 67.0 |
| 5 | 刘玄德 | 55.5 | 85.0 | 45.0 |
| 6 | 孙权 | 70.0 | 73.0 | 78.5 |
| 7 | 宋公明 | 75.0 | 65.0 | 30.0 |
+------+-----------+---------+------+---------+
7 rows in set (0.00 sec)
比较运算符
查询数学成绩在[80, 90]分的同学及数学成绩
mysql> SELECT name,math FROM exam_result WHERE math >= 60 && math <=90;
+-----------+------+
| name | math |
+-----------+------+
| 孙悟空 | 78.0 |
| 曹孟德 | 84.0 |
| 刘玄德 | 85.0 |
| 孙权 | 73.0 |
| 宋公明 | 65.0 |
+-----------+------+
5 rows in set (0.00 sec)
范围运算符
查询语文成绩在 [80, 90] 分的同学及语文成绩
mysql> SELECT name, chinese FROM exam_result WHERE chinese BETWEEN 80 AND 90;
+-----------+---------+
| name | chinese |
+-----------+---------+
| 孙悟空 | 87.5 |
| 猪悟能 | 88.0 |
| 曹孟德 | 82.0 |
+-----------+---------+
3 rows in set (0.00 sec)
列表运算符
查询数学成绩是 58 或者 59 或者 98 或者 99 分的同学及数学成绩
mysql> SELECT name, math FROM exam_result WHERE math IN (58, 59, 98, 99);
+-----------+------+
| name | math |
+-----------+------+
| 唐三藏 | 98.0 |
+-----------+------+
1 row in set (0.00 sec)
模糊匹配符
% 匹配任意多个字符
mysql> SELECT name FROM exam_result WHERE name LIKE '孙%';
+-----------+
| name |
+-----------+
| 孙悟空 |
| 孙权 |
+-----------+
2 rows in set (0.00 sec)
_ 匹配严格的一个任意字符
mysql> SELECT name FROM exam_result WHERE name LIKE '孙_';
+--------+
| name |
+--------+
| 孙权 |
+--------+
1 row in set (0.00 sec)
空值判断符
如果当前有的列仍是空值,可以根据该表达式查询
mysql> insert into exam_result (name) values("秦始皇");
Query OK, 1 row affected (0.00 sec)
mysql> SELECT * FROM exam_result WHERE math IS NULL;
+------+-----------+---------+------+---------+
| id | name | chinese | math | english |
+------+-----------+---------+------+---------+
| NULL | 秦始皇 | NULL | NULL | NULL |
+------+-----------+---------+------+---------+
1 row in set (0.00 sec)
分页查询
由于 select * 容易查询太多数据,导致机器 “挂了”。通过指定列查询,虽然查到的结果变少了,但是行数如果足够多的话仍有可能把机器搞出问题。最稳妥的方法就是 “分页查询”,限制一次能查询到的数目。
select 列名 from 表名 limit N [offset]
查询 从 offset 下标开始往后 N 个数据
offset 可以省略不写,如果不写的话默认从 0 下标开始查询
mysql> select * from exam_result;
+------+-----------+---------+------+---------+
| id | name | chinese | math | english |
+------+-----------+---------+------+---------+
| 1 | 唐三藏 | 67.0 | 98.0 | 56.0 |
| 2 | 孙悟空 | 87.5 | 78.0 | 77.0 |
| 3 | 猪悟能 | 88.0 | 98.5 | 90.0 |
| 4 | 曹孟德 | 82.0 | 84.0 | 67.0 |
| 5 | 刘玄德 | 55.5 | 85.0 | 45.0 |
| 6 | 孙权 | 70.0 | 73.0 | 78.5 |
| 7 | 宋公明 | 75.0 | 65.0 | 30.0 |
| NULL | 秦始皇 | NULL | NULL | NULL |
+------+-----------+---------+------+---------+
8 rows in set (0.00 sec)
mysql> select * from exam_result limit 5;
+------+-----------+---------+------+---------+
| id | name | chinese | math | english |
+------+-----------+---------+------+---------+
| 1 | 唐三藏 | 67.0 | 98.0 | 56.0 |
| 2 | 孙悟空 | 87.5 | 78.0 | 77.0 |
| 3 | 猪悟能 | 88.0 | 98.5 | 90.0 |
| 4 | 曹孟德 | 82.0 | 84.0 | 67.0 |
| 5 | 刘玄德 | 55.5 | 85.0 | 45.0 |
+------+-----------+---------+------+---------+
5 rows in set (0.00 sec)
mysql> select * from exam_result limit 3 offset 3;
+------+-----------+---------+------+---------+
| id | name | chinese | math | english |
+------+-----------+---------+------+---------+
| 4 | 曹孟德 | 82.0 | 84.0 | 67.0 |
| 5 | 刘玄德 | 55.5 | 85.0 | 45.0 |
| 6 | 孙权 | 70.0 | 73.0 | 78.5 |
+------+-----------+---------+------+---------+
3 rows in set (0.00 sec)