【MySQL】数据库基础指令(一)

时间:2024-10-14 07:52:32

前言


        个人感觉 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)