解决MySQL无法输入中文字符的问题
        解决问题:
 方法一:
使用以下指令,创建数据库的时候就指定字符集
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)









