MYSQL的DDL语句

mysql的配置文件

1
2
作用:影响服务端的启动    [server]标签
影响客户端的连接 [client]标签

mysql客户端命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#mysql连接进来,一些简化的操作:
?:查看帮助
\q:quit exit 退出
\c:终止命令,MySQL5.7 Ctrl + c
\G:格式化输出
\s:查看mysql的状态
\.:source 导入数据
\!:system+系统命令
mysql> system ls /
app boot dev home lib64 mnt proc run srv tmp var
bin data etc lib media opt root sbin sys usr
mysql> \! vim /etc/my.cnf


恢复步骤
1、mysql> set sql_log_bin=0 关闭二进制日志的记录
2、mysql> source 数据的路径
source /tmp/mysql.sql

mysqladmin客户端命令

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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
1、#检查mysql是否存活
[root@db01 ~]# mysqladmin -uroot -p123 ping
Warning: Using a password on the command line interface can be insecure.
mysqld is alive #存活的状态

停止mysql
[root@db01 ~]# mysqladmin -uroot -p123 ping
mysqladmin: connect to server at 'localhost' failed
error: 'Can't connect to local MySQL server through socket '/app/mysql-5.6.50/tmp/mysql.sock' (2)'
Check that mysqld is running and that the socket: '/app/mysql-5.6.50/tmp/mysql.sock' exists! #服务端停止的状态,就是找不到sock文件


2、#Zabbix监控mysql是否存活,可以写脚本
[root@db01 ~]# vim check_db.sh
#!/bin/bash
db_user=root
db_pass=123
mysqladmin -u${db_user} -p${db_pass} ping &> /dev/null
if [ $? -nq 0 ];then
#不=0,就是不存活,就echo 0,0代表不存活
echo 0
else
echo 1
fi

测试:
[root@db01 ~]# /etc/init.d/mysqld stop
Shutting down MySQL... SUCCESS!
[root@db01 ~]# sh check_db.sh
0 #不存活0个进程

[root@db01 ~]# /etc/init.d/mysqld start
Starting MySQL. SUCCESS!
[root@db01 ~]# sh check_db.sh
1 #存活



3、#停止mysql服务
[root@db01 ~]# mysqladmin -uroot -p123 shutdown


4、#查看mysql默认的配置(内置变量)
[root@db01 ~]# mysqladmin -uroot -p123 variables

5、#刷新mysq的bin_log日志
[root@db01 ~]# mysqladmin -uroot -p123 flush-log

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000004 | 120 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.01 sec)

mysql> system mysqladmin -uroot -p123 flush-log; #刷新日志

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000005 | 120 | | | |
+------------------+----------+--------------+------------------+-------------------+
#刷新之后,变成 mysql-bin.000005
如果不刷新,运行10年的日志就在一个log里面,日志太大


6、#查看mysql的状态
[root@db01 ~]# mysqladmin -uroot -p123 status
Uptime: 215 Threads: 3 Questions: 31 Slow queries: 0 Opens: 70 Flush tables: 1 Open tables: 63 Queries per second avg: 0.144


7、#在库外创建库和删除库 这个命令没啥用,如果真想在库外创建或者删除,可以用 mysql -e
[root@db01 ~]# mysqladmin -uroot -p123 create aa1

[root@db01 ~]# mysql -uroot -p123 -e "show databases;"
+--------------------+
| Database |
+--------------------+
| information_schema |
| aa1 |#创建成功
| db3306 |
| mysql |
| performance_schema |
| test |
+--------------------+

#在库外删库
[root@db01 ~]# mysqladmin -uroot -p123 drop aa1
Do you really want to drop the 'aa1' database [y/N] y #输入y
Database "aa1" dropped

[root@db01 ~]# mysql -uroot -p123 -e "show databases;"
Warning: Using a password on the command line interface can be insecure.
+--------------------+
| Database |
+--------------------+
| information_schema |
| db3306 |
| mysql |
| performance_schema |
| test |
+--------------------+
#aa1表被删除

8、#重新加载数据库(刷新授权表)
[root@db01 ~]# mysqladmin -uroot -p123 reload

9、#修改密码
[root@db01 ~]# mysqladmin -uroot -p123 password '1234'

MYSQL结构化查询

开发规范:

  1. 库、表名不能大写,数字开头,16个字符串
  2. 表名和业务有关
  3. drop 语句禁止
  4. 选择合适的数据类型
  5. 必须要有主键
  6. 列尽量非空约束
  7. 减少外键约束
  8. 必须设置存储引擎和字符集
  9. 列必须要有注释
  10. 对于非负数设置数据类型约束–无符号

SQL语言的类型

DDL:(Databases Definition Language)数据定义语言

DML:(Data Manipulation Language) 数据操作语言

DCL:DCL(Data Control Language) 数据控制语言

DQL(最难):(Database Query Language)数据查询语言

DTL :(Transaction Control Language) 事务控制语言 存储引擎的·,操作事物的语句

DDL:(Databases Definition Language)数据定义语言

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
一、DDL(Data Define Language) 数据定义语言
包括 CREATE、DROP、ALTER 等对数据库数据结构进行操作的语言

二、DML(Data Manipulation Language) 数据操作语言
包括 INSERT、DELETE、UPDATE 等对数据库数据进行操作的语言

三、DQL(Data Query Language) 数据查询语言
使用 SELECT 对数据进行查询的语言

四、DCL(Data Control Language) 数据控制语言
包括 GRANT、REVOKE 数据库权限设置语言

五、TCL(Transaction Control Language) 事务控制语言
包括 COMMIT、ROLLBACK、SAVEPOINT 等对数据库事务进行操作的语言


接收用户的SQL语句
1.什么是SQL
结构化的查询语句

2.SQL的种类
DDL:数据定义语言

库对象:库名字、库属性
开发规范:库名小写

创建库:create database|schema 库名不能大写,因为mysql的物理结构是:最底层的数据文件

#mysql客户端显示所在路径(所在库)
[root@db01 ~]# vim /etc/my.cnf
[mysqld]
...
lower_case_table=1 #忽略大小写
#显示所在路径在客户端标签中添加
[client]
prompt="\\u@\\h:\\d \\r:\\m:\\s> " #\\r:\\m:\\s这个是显示时间,不想要可以删除

#测试:显示所在表,当前用户,主机域
[root@db01 ~]# mysql -uroot -p123
root@localhost:(none) 01:45:01> use mysql;
root@localhost:mysql 01:45:24>


[root@db01 ~]# mysql -urep -p123
rep@localhost:(none) 01:47:41>

1、库的操作

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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
###############增:create
root@localhost:(none) > help create database;
#语法 Syntax:
CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name
create database 库名字;
create schema 库名字;
#创建的选项
create_option: [DEFAULT] {
CHARACTER SET [=] charset_name #指定字符集
| COLLATE [=] collation_name #指定字符集的校验规则
}

1、创建数据库
root@localhost:(none) > create database aaa;

2、如果aaa库存在,就不创建,而且不报错
root@localhost:(none) > create database if not exists aaa;

3、创建库的时候添加字符集
root@localhost:(none) > create database bbb character utf8;
查看字符集
root@localhost:(none) > show create database bbb;
+----------+--------------------------------------------------------------+
| Database | Create Database |
+----------+--------------------------------------------------------------+
| bbb | CREATE DATABASE `bbb` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+--------------------------------------------------------------+

4、二进制安装的默认字符集是latin
mysql> show create database test;
+---------+---------------------------------------------------------------+
| Database| Create Database
+---------+---------------------------------------------------------------+
| test |CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET latin1 */|
+---------+---------------------------------------------------------------+

5、#如果要修改默认的字符集,就要修改配置文件
查看全部字符集
mysql> show variables like '%char%';
+--------------------------+-----------------------------------+
| Variable_name | Value |
+--------------------------+-----------------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /app/mysql-5.6.50/share/charsets/ |
+--------------------------+-----------------------------------+
#修改字符集
[root@db02 ~]# vim /etc/my.cnf
[mysqld]
....
character_set_server=utf8

#修改之后重启mysql
[root@db02 ~]# /etc/init.d/mysqld restart

[root@db02 ~]# mysql
mysql> create database b1;
mysql> show create database b1;
+----------+-------------------------------------------------------------+
| Database | Create Database |
+----------+-------------------------------------------------------------+
| b1 | CREATE DATABASE `b1` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+-------------------------------------------------------------+
现在创建库默认就是utf8

#查看字符集的校验规则
root@localhost:(none) > show collation;

6、创建库的时候指定校验规则和字符集
root@localhost:(none) > create database [if not exists] zls123 charset utf8 collate utf8_general_ci;

#################删:drop
root@localhost:(none) > drop database bbb;

#如果存在,就删除
root@localhost:(none) > drop database if exists bbb;

#############改:alter
库名字不能改,一般都是改库的字符集、校验规则
1、更改库的字符集
root@localhost:(none) > alter database aaa charset latin5;

2、更改库校验规则,一般和字符集一起改
root@localhost:(none) > alter database aaa charset utf8 collate utf8_bin;

###############查(DQL)
1、查看数据库
root@localhost:(none) > show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| aaa |
| bbb |
| db3306 |
| mysql |
| performance_schema |
| test |
+--------------------+

2、表的操作

数据类型

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
#数字类型
init : 整型 -2^31~2^31 -2147483648 ~ 2147483647
tinyint: 最小整型 -128~127 一般用来存"年龄" 无符号:0-255
float: 浮点数 单精度
double: 浮点数 双精度

#字符串类型
char:定长字符串 char(3) 张三,存2个也是占3个字符 这个一般用来存"手机号""身份证号"char(18)
varchar:变长字符串 varchar(3) 最长存3个,一般用来存名字
enum:枚举 enum('f','m') enum('0','1') 一般用来选择
一个中文占3个字节

#时间类型
timestamp:时间戳类型,类型的值范围从1970-01-01 00:00:01 UTC到 2038-01-19 03:14:07UTC #一般不用这种时间类型
datetime:时间 类型的值范围从1000-01-01 00:00:00到 9999-12-31 23:59:59

#常用的约束
NULL :可以为空
NOT NULL:不能为空,非空
default:默认值
primary key:主键 特点:唯一 且 非空,意思是这个字段的数据必须的填,不能重复,一般主键配合auto_increment:自增 使用
一张表只能设置一个主键,不能设置多个,主键的好处就是让查询速度更快

nuique key:唯一键,唯一,但可以为空
unsingned:无符号 可以理解为非负数,"年龄"的约束,就不能写负数
zerofill: 0填冲 一般和int搭配使用

comment:注释

操作表:

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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#增:创建表
1、在student库里创建学生表stu1:id 学号,name 名字,age 年龄,gender 性别,phone 手机号,comr_time 入学时间
root@localhost:(none) > create database student;
root@localhost:(none) > use student;

root@localhost:student > create table stu1(id int,name varchar(10),age tinyint,gender enum('f','m'),phone char(11),come_time datetime);

2、查看表
root@localhost:student > show tables;
+-------------------+
| Tables_in_student |
+-------------------+
| stu1 |
+-------------------+

show tables from+表名 #不在表里面的查看方法

3、查看表结构
root@localhost:student > desc stu1;
+-----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+---------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(10) | YES | | NULL | |
| age | tinyint(4) | YES | | NULL | |
| gender | enum('f','m') | YES | | NULL | |
| phone | char(11) | YES | | NULL | |
| come_time | datetime | YES | | NULL | |
+-----------+---------------+------+-----+---------+-------+

4、往表里面插入数据
root@localhost:student > insert into student.stu1(id,name,age,gender,phone,come_time) values(1,'zhangsan',18,'f','12345678901',NOW());

male(男的) female(女的)
NOW()当前时间

查看数据
root@localhost:student > select * from stu1;
+------+----------+------+--------+-------------+---------------------+
| id | name | age | gender | phone | come_time |
+------+----------+------+--------+-------------+---------------------+
| 1 | zhangsan | 18 | f | 12345678901 | 2024-08-13 03:25:18 |
+------+----------+------+--------+-------------+---------------------+


#规范化建表
root@localhost:student > create table stu2(
id int primary key auto_increment comment '学生学号',
name varchar(10) not null comment '学生姓名',
age tinyint unsigned not null comment '学生年龄',
gender enum('f','m') not null default 'm' comment '学生性别',
phone char(11) not null unique key comment '学手机号',
come_time datetime not null default NOW() comment '入学时间');

解释:
create table stu2(
id int primary key auto_increment comment '学生学号', #主键+自增
name varchar(10) not null comment '学生姓名',
age tinyint unsigned not null comment '学生年龄', #无符号,不能写负数,先写unsigned,再写not null
gender enum('f','m') not null default 'm' comment '学生性别', #给默认值
phone char(11) not null unique key comment '学生手机号', #唯一
come_time datetime not null default NOW() comment '入学时间'); #给默认值

root@localhost:student > desc stu2;
+-----------+---------------------+------+-----+-------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+---------------------+------+-----+-------------------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(10) | NO | | NULL | |
| age | tinyint(3) unsigned | NO | | NULL | |
| gender | enum('f','m') | NO | | m | |
| phone | char(11) | NO | UNI | NULL | |
| come_time | datetime | NO | | CURRENT_TIMESTAMP | |
+-----------+---------------------+------+-----+-------------------+----------------+

#插入数据,有的是默认值可以不需要写
root@localhost:student > insert into student.stu2(name,age,phone) values('lisi',20,'12312312312');
root@localhost:student > insert into student.stu2(name,age,phone) values('wangwu',22,'12312312355');

#查看数据
root@localhost:student > select * from stu2;
+----+--------+-----+--------+-------------+---------------------+
| id | name | age | gender | phone | come_time |
+----+--------+-----+--------+-------------+---------------------+
| 1 | lisi | 20 | m | 12312312312 | 2024-08-13 04:19:56 |
| 2 | wangwu | 22 | m | 12312312355 | 2024-08-13 04:21:46 |
+----+--------+-----+--------+-------------+---------------------+


查看注释,建表语句里面有
#查看建表语句
root@localhost:student > show create table stu2;
| stu2 | CREATE TABLE `stu2` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '学生学号',
`name` varchar(10) NOT NULL COMMENT '学生姓名',
`age` tinyint(3) unsigned NOT NULL COMMENT '学生年龄',
`gender` enum('f','m') NOT NULL DEFAULT 'm' COMMENT '学生性别',
`phone` char(11) NOT NULL COMMENT '学手机号',
`come_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '入学时间',
PRIMARY KEY (`id`),
UNIQUE KEY `phone` (`phone`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8


执行失败的语句也会自增,能不能插进去就是你的事,但是不插到表里面,生产中不会出现连续的自增,用户想删自己的数据就删,如果想要在生产中连号,就非常累,所以不需要在乎id号不连续
如果把表里面的数据全部删除,再插入数据,还是之前的序号记录还是在,序号不会从1开始

图形化工具(Navicat Premium)建表

左上角 文件——>新建连接——>选择mysql连接的方式

image-20240812205646797

image-20240812205757441

点击测试连接,连接ok显示绿色

image-20240812205857192

图形化工具建立出来的表

image-20240812211405705

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#从终端查看使用图形化创建的表
root@localhost:student > show tables;
+-------------------+
| Tables_in_student |
+-------------------+
| stu1 |
| stu2 |
| stu3 |
+-------------------+

root@localhost:student > desc stu3;
+-----------+---------------+------+-----+-------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+---------------+------+-----+-------------------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(20) | NO | | NULL | |
| age | tinyint(4) | NO | | NULL | |
| gender | enum('m','f') | NO | | m | |
| phone | char(11) | NO | PRI | NULL | |
| come_time | datetime | NO | | CURRENT_TIMESTAMP | |
+-----------+---------------+------+-----+-------------------+----------------+

表中虽然看到2个主键,实际上是1个主键,叫做联合主键,相当于一个主键包含2个字段(包含id phone字段)

删表

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
#删
root@localhost:student > select * from stu2;
+----+--------+-----+--------+-------------+---------------------+
| id | name | age | gender | phone | come_time |
+----+--------+-----+--------+-------------+---------------------+
| 1 | lisi | 20 | m | 12312312312 | 2024-08-13 04:19:56 |
| 2 | wangwu | 22 | m | 12312312355 | 2024-08-13 04:21:46 |
| 3 | aaa | 17 | m | 12312312366 | 2024-08-13 04:29:08 |
| 4 | bbb | 24 | m | 12312312377 | 2024-08-13 04:29:31 |
+----+--------+-----+--------+-------------+---------------------+

1、删除id为3的行
root@localhost:student > delete from stu2 where id=3;

root@localhost:student > select * from stu2;
+----+--------+-----+--------+-------------+---------------------+
| id | name | age | gender | phone | come_time |
+----+--------+-----+--------+-------------+---------------------+
| 1 | lisi | 20 | m | 12312312312 | 2024-08-13 04:19:56 |
| 2 | wangwu | 22 | m | 12312312355 | 2024-08-13 04:21:46 |
| 4 | bbb | 24 | m | 12312312377 | 2024-08-13 04:29:31 |
+----+--------+-----+--------+-------------+---------------------+

2、删除表
root@localhost:student > drop table stu100; #将文件从磁盘上删除,相当于rm
root@localhost:student >delete table stu100; #相当于vim 只能把表里面的数据清掉,但表名还在

3、删除表里面的全部内容
root@localhost:student > delete from stu2; #再次插入数据时,序号不是从1开始
root@localhost:student > truncate stu1; #再次插入数据时,序号从1开始

改表

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
48
49
50
#改:alter
改表麻烦,里面的数据类型都需要改

1、#修改表名 rename
root@localhost:student > alter table stu3 rename stu300;

root@localhost:student > show tables;
+-------------------+
| Tables_in_student |
+-------------------+
| stu1 |
| stu2 |
| stu300 |
+-------------------+


2、#对字段的修改 字段的增、删、改、查

#添加字段:添加一个class字段 add (默认添加在最后面)
root@localhost:student > alter table stu2 add class varchar(10) not null;
root@localhost:student > desc stu2;


#添加leve字段在name的后面(添加在指定字段后面)
root@localhost:student > alter table stu2 add leve char(5) after name;
root@localhost:student > desc stu2;

#添加aaa字段在最前面(将字段添加在最前面)
root@localhost:student > alter table stu2 add aaa char(3) first;



3、#删除指定的字段
alter table stu10 drop +字段名

root@localhost:student > alter table stu2 drop aaa;
root@localhost:student > alter table stu2 drop leve;


4、#修改字段,两种方法 modify change
char(11),改成varchar(11)

# modify(只能修改字段类型和约束)
alter table stu10 modify 你要改的字段名 你要改的类型

root@localhost:student > alter table stu2 modify phone varchar(11);

#change(可以修改字段类型和约束、字段名)
alter table stu2 change 旧字段 新字段 新字段的类型;
root@localhost:student > alter table stu2 change id ID varchar(11);