MySQL 知识、数据库、数据表

SQL DML 和 DDL

可以把 SQL 分为两个部分:数据操作语言 (DML) 和 数据定义语言 (DDL)。
SQL (结构化查询语言)是用于执行查询的语法。但是 SQL 语言也包含用于更新、插入和删除记录的语法。
查询和更新指令构成了 SQL 的 DML 部分:
SELECT - 从数据库表中获取数据
UPDATE - 更新数据库表中的数据
DELETE - 从数据库表中删除数据
INSERT INTO - 向数据库表中插入数据
SQL 的数据定义语言 (DDL) 部分使我们有能力创建或删除表格。我们也可以定义索引(键),规定表之间的链接,以及施加表间的约束。
SQL 中最重要的 DDL 语句:
CREATE DATABASE - 创建新数据库
ALTER DATABASE - 修改数据库
CREATE TABLE - 创建新表
ALTER TABLE - 变更(改变)数据库表
DROP TABLE - 删除表
CREATE INDEX - 创建索引(搜索键)
DROP INDEX - 删除索引

数据库发展史

文件系统-》层次模型-》网状模型-》关系型数据库
优点:解决了导航的问题、数据完整性得到了解决

缺点:多表查询效率低
解决方法:使用NOSQL(非关系型数据库,Redis、mongodb等等),在数据库中按照键值对来存储。

SQL

结构化查询语言,标准SQL,也叫SQL-92

access 微软 SQL
SQL Server 微软 T-SQL
Oracle 甲骨文 PL/SQL
MySQL 被甲骨文收购 MySQL

windows 服务开启

win+R services.msc 打开服务面板
net start 查看已经开启的服务

net start mysql 启动服务
net stop mysql 关闭服务

MySQL客户端连接服务器

安装文件目录下的:MySQL 5.5 Command Line Client
navicat 客户端
PHPmyadmin 客户端
设置环境变量后:mysql -hlocalhost -uroot -proot -P3306 (如果MySQL服务器在本地,IP地址可以省略;如果MySQL服务器用的是3306端口,-P也是可以省略的)

退出登录

exit;
quit;
\q;
MySQL中的命令后面要加分号,windows命令行的命令后面不用加分号

数据库基本概念

数据库:数据库中存放的是表,一个数据库中可以存放多个表
表:用来存放数据
关系:两个表的公共字段
行:记录,也是实体
列:字段,也是属性
表结构 行 列
表数据 记录 字段
面向对象 实体 属性

表的冗余只能减少,不能杜绝

数据完整性:正确的数据类型,准确的数据范围

数据库操作

连接数据库

Mac xampp :$ /Applications/XAMPP/xamppfiles/bin/mysql -hlocalhost -uroot -p -P3306
密码初始为空;

创建数据库

语法:create database [if not exists] 数据名

1
2
mysql> create database if not exists uiste;
Query OK, 1 row affected (0.00 sec)

问题一:

如果创建的数据库已存在,就会报错
解决:创建数据库的时候判断一下数据库是否存在,如果不存在再创建

问题二:

如果数据库名是关键字和特殊字符要报错
解决:在特殊字符、关键字行加上反引号
create database `$@%`;

为了创建数据库时万无一失,我们可以在所有的数据库名上加上反引号

MySQL数据库的目录

数据库文件保存的路径在安装MySQL的时候就配置好。
也可以在my.ini配置文件中更改

1
2
#Path to the database root
datadir = "F:/wamp/mysql/Data/"

Mac xampp 数据库文件夹:
/Applications /XAMPP/xamppfiles/var/mysql

创建一个数据库,就对应一个文件夹,在文件夹中有一个db.opt文件。在此文件中设置数据库的字符集和校对集

1
2
default-character-set = utf8
default-collation = utf_general_ci

显示所有数据库【show databases】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| cdcol |
| dedecms |
| mysql |
| performance_schema |
| phpmyadmin |
| test |
| uiste |
+--------------------+
8 rows in set (0.00 sec)

information_schema:存储了MySQL服务器管理数据库的信息。比如:数据库名、表、字段名、数据类型及访问权限等等
performance_schema:MySQL5.5新增的表,用来保存数据库服务器性能的参数
mysql:MySQL系统数据库,保存的登录用户名,密码,以及每个用户的权限等等
test:给用户学习和测试的数据库。

删除数据库

语法:drop database [if exists] `数据库名`

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mysql> drop database if exists uiste;
Query OK, 0 rows affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| cdcol |
| dedecms |
| mysql |
| performance_schema |
| phpmyadmin |
| test |
+--------------------+
7 rows in set (0.00 sec)

问题:

如果删除的数据库不存在,会报错
解决:删除之前判断一下,如果存在就删除

显示创建数据库的语句

语法:show create database 数据库名

1
2
3
4
5
6
7
mysql> show create database uiste;
+----------+------------------------------------------------------------------+
| Database | Create Database |
+----------+------------------------------------------------------------------+
| uiste | CREATE DATABASE `uiste` /*!40100 DEFAULT CHARACTER SET latin1 */ |
+----------+------------------------------------------------------------------+
1 row in set (0.00 sec)

修改数据库字符编码

语法:alter database `数据库名` charset=字符编码

1
2
3
4
5
6
7
8
9
10
mysql> alter database uiste charset=utf8;
Query OK, 1 row affected (0.01 sec)

mysql> show create database uiste;
+----------+----------------------------------------------------------------+
| Database | Create Database |
+----------+----------------------------------------------------------------+
| uiste | CREATE DATABASE `uiste` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+----------------------------------------------------------------+
1 row in set (0.00 sec)

选择数据库

语法:use `数据库名

1
2
mysql> use uiste;
Database changed

表的操作

创建表

1
2
3
4
5
6
7
8
9
10
11
create table [if not exists] `表名`(
`字段名` 数据类型 [null|not null] [default] [auto_increment] [primary key] [comment],
字段名 数据类型 …
)[engine=存储引擎] [charset=字符编码]

null|not null 是否为空
default: 默认值
auto_increment 自动增长
primary key 主键
comment: 备注
engine 引擎

表名和字段名如果用了关键字,要用反引号引起来。

创建简单的表

1
2
3
4
5
mysql> create table student(
-> id int not null auto_increment primary key comment '学生编号',
-> name varchar(10) not null comment '学生姓名',
-> sex char(4) default '男');
Query OK, 0 rows affected (0.03 sec)

创建复杂的表

1
2
3
4
5
6
mysql> create table `goods`(
-> `id` int auto_increment primary key comment '商品编号',
-> `name` varchar(20) not null comment '商品名称',
-> `add` varchar(100) not null default '地址不详' comment '商品产地'
-> )engine=innodb charset=utf8 comment '商品表';
Query OK, 0 rows affected (0.05 sec)

create table 数据库名.表名,用于给指定的数据库创建表

1
2
3
4
mysql> create table uiste.teacher(
-> id int auto_increment primary key,
-> name varchar(16) not null);
Query OK, 0 rows affected (0.02 sec)

数据表文件

  • 一个数据库对应一个文件夹
  • 一个表对应一个或多个文件夹
    引擎是myisam,一个表对应三个文件(不支持外键约束)

    t1.frm 表结构
    t1.MYD 表数据
    t1.MYI 表索引
    引擎是innodb,一个表对应一个表结构文件

所有的innodb引擎的数据统一的存放在data\ibdata1文件中。如果数据量很大,MySQL会自动的创建ibdata2,ibdata3,…,目的就是为了便于管理。

constraint:约束

显示所有表

语法:show tables;

1
2
3
4
5
6
7
8
mysql> show tables;
+-----------------+
| Tables_in_uiste |
+-----------------+
| student |
| teacher |
+-----------------+
2 rows in set (0.00 sec)

显示创建表的语句

语法:show create table `表名`

1
2
3
4
5
6
7
8
9
10
11
12
mysql> show create table student;
+---------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+---------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| student | CREATE TABLE `student` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '学生编号',
`name` varchar(10) NOT NULL COMMENT '学生姓名',
`sex` char(4) DEFAULT '男',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+---------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)

将两个字段竖着排列
语法:show create table `表名`\G

1
2
3
4
5
6
7
8
9
10
mysql> show create table student \G
*************************** 1. row ***************************
Table: student
Create Table: CREATE TABLE `student` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '学生编号',
`name` varchar(10) NOT NULL COMMENT '学生姓名',
`sex` char(4) DEFAULT '男',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

查看表结构

语法:desc[ribe] `表名`

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
mysql> desc student;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(10) | NO | | NULL | |
| sex | char(4) | YES | | 男 | |
+-------+-------------+------+-----+---------+----------------+
3 rows in set (0.01 sec)

mysql> describe student;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(10) | NO | | NULL | |
| sex | char(4) | YES | | 男 | |
+-------+-------------+------+-----+---------+----------------+
3 rows in set (0.01 sec)

desc 是 describe 的简写

复制表

语法一:create table 新表 select 字段 from 旧表

1
2
3
mysql> create table student2 select * from student;
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0

特点:不能复制父表的键,能够复制父表的数据

语法二:create table 新表 like 旧表

1
2
mysql> create table student3 like student;
Query OK, 0 rows affected (0.03 sec)

特点:只能复制表结构,不能复制表数据

删除表

语法:drop table [if exists] 表1,表2,…

1
2
mysql> drop table if exists student2;
Query OK, 0 rows affected (0.01 sec)

如果删除一个不存在的表就会报错,删除的时候可以判断一下,存在就删除

可以一次删除多个表

1
2
mysql> drop tables if exists student2,student3;
Query OK, 0 rows affected (0.01 sec)

修改表

语法:alter table 表名

添加字段

语法:alter table 表名add [column] 字段名 数据类型 [位置]

1
2
3
mysql> alter table student add age int(8) after name;
Query OK, 0 rows affected (0.20 sec)
Records: 0 Duplicates: 0 Warnings: 0

默认字段放在表的最后
添加 first 字段放在表的第一位
添加 after name 放在 name 字段之后

删除字段

语法:alter table 表 drop [column] 字段名

1
2
3
mysql> alter table student drop age;
Query OK, 0 rows affected (0.05 sec)
Records: 0 Duplicates: 0 Warnings: 0
修改字段(改名)

语法:alter table 表 change [column] 原字段名 新字段名 数据类型 …

1
2
3
mysql> alter table student change sex age int(8);
Query OK, 0 rows affected (0.32 sec)
Records: 0 Duplicates: 0 Warnings: 0

同时修改多个字段

1
2
3
mysql> alter table student change age myage int(8) comment '我的学生年龄',change name myname varchar(16) not null comment '我的学生姓名';
Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0
修改字段(不改名)

语法:alter table 表 modify 字段名 字段属性…

1
2
3
mysql> alter table student modify myage int(3) not null default 18 comment '如果你没 有设置年龄,我就是永远的18岁';
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0

只更改字段属性

修改引擎

语法:alter table 表名 engine=引擎名

1
2
3
mysql> alter table student engine=myisam;
Query OK, 0 rows affected (0.18 sec)
Records: 0 Duplicates: 0 Warnings: 0
修改表名

语法:alter table 表名 rename to 新表名

1
2
mysql> alter table student rename to student2;
Query OK, 0 rows affected (0.00 sec)
将表移动到其他数据库

语法:alter table 表名 rename to 数据库名.数据表名

1
2
alter table student2 rename to test.student3;
Query OK, 0 rows affected (0.01 sec)

数据操作

插入数据

语法:insert into 表名 (字段名, 字段名,…) values (值1, 值1,…)

  • 插入一条数据
1
2
mysql> insert into student (id,name,age) values (1,'小兰',25);
Query OK, 1 row affected (0.01 sec)
  1. 插入字段名的顺序和数据库字段名的顺序可以不一致
  2. 插入值的个数、顺序必须和插入字段名的个数、顺序要一致
  • 简写方式:
1
2
mysql> insert into student values (2,'杜总',24);
Query OK, 1 row affected (0.02 sec)
  1. 自动增长列,可以直接插入null。
  • 插入默认值和空值
1
2
mysql> insert into student values (null,'张宝',null);
Query OK, 1 row affected (0.01 sec)

自动增长列,可以直接插入null
default关键字用来插入默认值,null用来插入空值

  • 插入多条数据
1
2
3
mysql> insert into student values (null,'小张',18),(null,'圆哥',18);
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
  • 使用insert…set…插入数据
1
2
mysql> insert into student set name='赵哥',age=54;
Query OK, 1 row affected (0.01 sec)
更新数据

语法:update 表名 set 字段=值 [where 条件] [order by 排序] [limit 限制]

  • 将id为三的年龄改为30
1
2
3
mysql> update student set age=30 where id=3;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0

需要更改多个内容的时候将需要变更的内容用逗号连接;

  • 将id 从大到小数前3名的学生年龄改为16岁
1
2
3
mysql> update student set age=16 order by id desc limit 3;
Query OK, 3 rows affected (0.01 sec)
Rows matched: 3 Changed: 3 Warnings: 0
删除数据

语法:delete from 表名 [where 条件] [order by 排序] [limit 限制]

1
2
mysql> delete from student where id=9;
Query OK, 1 row affected (0.00 sec)

删除id <=7;

1
2
mysql> delete from student where id<=7;
Query OK, 7 rows affected (0.00 sec)

清空表

1
2
mysql> delete from student;
Query OK, 0 rows affected (0.00 sec)

清空表:truncate table 表名

1
2
mysql> truncate table student;
Query OK, 0 rows affected (0.02 sec)

delete from 表和truncate table 表区别?
delete from 表:遍历表记录,一条一条的删除
truncate table:将原表销毁,再创建一个同结构的新表。就清空表而言,这种方法效率高。

字符集

字符集:字符在保存和传输时对应的二进制编码集合

数据存储时使用字符集

MySQL可以在服务器上、数据库、表、字段上设置字符集

脚下留心:一般在数据库和表上设置字符集,每个字段设置字符集太麻烦。

数据传输时使用字符集

发现:在插入数据的时候,如果有中文会报错

1
2
mysql> insert into student values (null,'李白');
ERROR 1366 (HY000):Incorrect string value :'\xC0\xEE\xB0\xD7' for column 'name'

分析:客户端编码和服务器连接层编码必须一致,如果不一致就会报错。

查看客户端的字符编码

客户端发送某种编码给服务器,由客户端决定
客户端编码不能改变
客户端右键——属性——选项——可以查看当前客户端的字符编码(GBK)

查看服务器的字符编码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mysql> show variables like 'character_set_%';
+--------------------------+------------------------------------------------+
| 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 | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /Applications/XAMPP/xamppfiles/share/charsets/ |
+--------------------------+------------------------------------------------+
8 rows in set (0.01 sec)

解决:只要将服务器的编码设置成gbk就可以解决

测试:插入中文
查询:插入中文

原因:结果返回的是utf8,客户端用gbk来解析,所以乱码
解决:服务器按gbk返回即可

1
2
mysql>set character_set_results=gbk;
Query OK, 0 rows affected (0.00 sec)

查询:结果

总结:客户端编码、character_set_clientcharacter_set_results三个编码的值一致即可操作中文。
多学一招:我们只要设置“set names 字符编码”,就可以更改character_set_clientcharacter_set_results的值。

查看所有字符集
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47

mysql> show character set;
+----------+-----------------------------+---------------------+--------+
| Charset | Description | Default collation | Maxlen |
+----------+-----------------------------+---------------------+--------+
| big5 | Big5 Traditional Chinese | big5_chinese_ci | 2 |
| dec8 | DEC West European | dec8_swedish_ci | 1 |
| cp850 | DOS West European | cp850_general_ci | 1 |
| hp8 | HP West European | hp8_english_ci | 1 |
| koi8r | KOI8-R Relcom Russian | koi8r_general_ci | 1 |
| latin1 | cp1252 West European | latin1_swedish_ci | 1 |
| latin2 | ISO 8859-2 Central European | latin2_general_ci | 1 |
| swe7 | 7bit Swedish | swe7_swedish_ci | 1 |
| ascii | US ASCII | ascii_general_ci | 1 |
| ujis | EUC-JP Japanese | ujis_japanese_ci | 3 |
| sjis | Shift-JIS Japanese | sjis_japanese_ci | 2 |
| hebrew | ISO 8859-8 Hebrew | hebrew_general_ci | 1 |
| tis620 | TIS620 Thai | tis620_thai_ci | 1 |
| euckr | EUC-KR Korean | euckr_korean_ci | 2 |
| koi8u | KOI8-U Ukrainian | koi8u_general_ci | 1 |
| gb2312 | GB2312 Simplified Chinese | gb2312_chinese_ci | 2 |
| greek | ISO 8859-7 Greek | greek_general_ci | 1 |
| cp1250 | Windows Central European | cp1250_general_ci | 1 |
| gbk | GBK Simplified Chinese | gbk_chinese_ci | 2 |
| latin5 | ISO 8859-9 Turkish | latin5_turkish_ci | 1 |
| armscii8 | ARMSCII-8 Armenian | armscii8_general_ci | 1 |
| utf8 | UTF-8 Unicode | utf8_general_ci | 3 |
| ucs2 | UCS-2 Unicode | ucs2_general_ci | 2 |
| cp866 | DOS Russian | cp866_general_ci | 1 |
| keybcs2 | DOS Kamenicky Czech-Slovak | keybcs2_general_ci | 1 |
| macce | Mac Central European | macce_general_ci | 1 |
| macroman | Mac West European | macroman_general_ci | 1 |
| cp852 | DOS Central European | cp852_general_ci | 1 |
| latin7 | ISO 8859-13 Baltic | latin7_general_ci | 1 |
| utf8mb4 | UTF-8 Unicode | utf8mb4_general_ci | 4 |
| cp1251 | Windows Cyrillic | cp1251_general_ci | 1 |
| utf16 | UTF-16 Unicode | utf16_general_ci | 4 |
| utf16le | UTF-16LE Unicode | utf16le_general_ci | 4 |
| cp1256 | Windows Arabic | cp1256_general_ci | 1 |
| cp1257 | Windows Baltic | cp1257_general_ci | 1 |
| utf32 | UTF-32 Unicode | utf32_general_ci | 4 |
| binary | Binary pseudo charset | binary | 1 |
| geostd8 | GEOSTD8 Georgian | geostd8_general_ci | 1 |
| cp932 | SJIS for Windows Japanese | cp932_japanese_ci | 2 |
| eucjpms | UJIS for Windows Japanese | eucjpms_japanese_ci | 3 |
+----------+-----------------------------+---------------------+--------+
40 rows in set (0.01 sec)

校对集

在某种特定的字符集下,字符和字符的大小关系。比如a和B的大小关系:如果不区分大小写a<B;如果区分大小写a>B。
脚下留心:不同的校对集他们的比较结果是不一样的
语法:collate=校对集
创建两个表

1
2
3
4
5
6
7
8
9
10
create table stu1(
name varchar(20)
)charset=utf8 collate=utf8_general_ci;

create table stu2(
name varchar(20)
)charset=utf8 collate=utf8_bin;
–插入测试数据
insert into stu1 values ('a'),('B');
insert into stu2 values ('a'),('B');

测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
mysql> select * from stu1 order by name;
+------+
| name |
+------+
| a |
| B |
+------+
2 rows in set (0.01 sec)

mysql> select * from stu2 order by name;
+------+
| name |
+------+
| B |
| a |
+------+
2 rows in set (0.00 sec)

校对集的规则:
1、_bin:按二进制编码进行比较
2、_ci:不区分大小写进行比较

查看所有的校对集

1
2
3
4
5
6
7
8
9
10
mysql> show collation;
+--------------------------+----------+-----+---------+----------+---------+
| Collation | Charset | Id | Default | Compiled | Sortlen |
+--------------------------+----------+-----+---------+----------+---------+
| big5_chinese_ci | big5 | 1 | Yes | Yes | 1 |
| big5_bin | big5 | 84 | | Yes | 1 |
| dec8_swedish_ci | dec8 | 3 | Yes | Yes | 1 |
| dec8_bin | dec8 | 69 | | Yes | 1 |

此处省略200多行...

常用操作命令文件下载