本章结构:
数据库基本操作
查看数据库的结构
查看数据库列表信息
show database
查看数据库中的表信息 use 数据库名#切换到数据库中
show tables
show tables in mysgl
显示数据表的结构(字段)
describe user;
Field:字段名称type: 数据类型Nul1 :是否允许为空Key :主键
Type: 数据类型
Nu11 :是否允许为空
key :主键
Default :默认值
Extra :扩展属性,例如:标志符列 (标识了种子,增量/步长) 1 2
id:r 1 3 5 7
常用的数据类型:
int:整型 用于定义整数类型的数据
float:单精度浮点4字节32位 准确表示到小数点后六位
double:双精度浮点8字节64位
char:固定长度的字符类型 用于定义字符类型数据。
varchar:可变长度的字符类型
text:文本
image:图片
decimal(5,2):5个有效长度数字,小数点后面有2位 指定长度数组
#Char如果存入数据的实际长度比指定长度要小,会补空格至指定长度,如果存入的数据的实际长度大于指定长度,低版本会被截取,高版本会报错
主键是唯一的,但主键可以由多个字段构成
MySQL数据库的数据文件存放在/usr/local/mysql/data目录下,每个数据库对应一个子目录,用于存储数据表文件。每个数据表对应为三个文件,扩展名分别为“.frm”、“.MYD”和“.MYI”。
MYD”文件是MyISAM存储引擎专用,存放MyISAM表的数据。每一个MyISAM表都会有一个“.MYD”文件与之对应,同样存放于所属数据库的文件夹下,和“.frm”文件在一起。
“.MYI”文件也是专属于 MyISAM 存储引擎的,主要存放 MyISAM 表的索引相关信息。对于 MyISAM 存储来说,可以被 cache 的内容主要就是来源于“.MYI”文件中。每一个MyISAM 表对应一个“.MYI”文件,存放于位置和“.frm”以及“.MYD”一样。
MyISAM 存储引擎的表在数据库中,每一个表都被存放为三个以表名命名的物理文件
(frm,myd,myi)。 每个表都有且仅有这样三个文件做为 MyISAM 存储类型的表的存储,也就是说不管这个表有多少个索引,都是存放在同一个.MYI 文件中。
另外还有“.ibd”和 ibdata 文件,这两种文件都是用来存放 Innodb 数据的,之所以有两种文件来存放 Innodb 的数据(包括索引),是因为Innodb的数据存储方式能够通过配置来决定是使用共享表空间存放存储数据,还是独享表空间存放存储数据。独享表空间存储 方式使用“.ibd”文件来存放数据,且每个表一个“.ibd”文件,文件存放在和 MyISAM 数据相同的位置。如果选用共享存储表空间来存放数据,则会使用 ibdata 文件来存放,所有表共同使用一个(或者多个,可自行配置)ibdata 文件。
SQL语句概述
SQL语言
Structured Query Language的缩写,即结构化查询语言
关系型数据库的标准语言
用于维护管理数据库
包括数据查询、数据更新、访问控制、对象管理等功能
SQL语言分类:
DDL:数据定义语言,用于创建数据库对象,如库、表、索引等
DML:数据操纵语言,用于对表中的数据进行管理
DQL:数据查询语言,用于从数据表中查找符合条件的数据记录
DCL:数据控制语言,用于设置或者更改数据库用户或角色权限
DDL:
create
drop
alter
1、使用DDL语句新建库、表
创建新的数据库
CREATE DATABASE 数据库名;
创建新的表
CREATE TABLE 表名 (字段1 数据类型,字段2 数据类型[,...][,PRIMARY KEY (主键名)]);
#主键一般选择能代表唯一性的字段不允许取空值(NULL),一个表只能有一个主键。
例:
mysql> use auth;
Database changed
mysql> create table users (user_name CHAR(16) NOT NULL, user_passwd CHAR(48) DEFAULT '', PRIMARY KEY (user_name));
mysql> create table ky (user_name CHAR(16) NOT NULL, user_passwd CHAR(48) DEFAULT '', level CHAR(16) NOT NULL, PRIMARY KEY (user_name));
#NOT NULL 不允许为空值
#DEFAULT'' 默认值为空
PRIMARY KEY :主键一般选择没有重复并且不为空值的字段
2、使用DDL语句删除库、表
●删除指定的数据表:DROP TABLE [数据库名.]表名
mysql> drop table auth.users;
Query OK, 0 rows affected (0.00 sec)
●删除指定的数据库 :DROP DATABASE 数据库名
mysql> drop database auth;
Query OK, 0 rows affected (0.00 sec)
DML操作命令
DML语句用于对表中的数据进行管理
包括以下操作
INSERT:插入新数据
UPDATE :更新原有数据
DELETE :删除不需要的数据
向数据表中插入新的数据记录
INSERT INTO 表名(字段1, 字段2, ……) VALUES(字段1的值, 字段2的值, ……)
insert into users(user_name,user_passwd) values('zhangsan', password('123456')); ###标准使用方法
insert into users values('lisi', password('123456')); ###如果这条记录包含表中所有字段的值,则插入语句中的制定字段可以省略
mysql> create database auth; ###刚才删掉了,现在要创建了
Query OK, 1 row affected (0.00 sec)
mysql> use auth; ###进入数据库
Database changed
mysql> create table users (user_name CHAR(16) NOT NULL, user_passwd CHAR(48) DEFAULT '', PRIMARY KEY (user_name)); #创建一个表
Query OK, 0 rows affected (0.01 sec)
mysql> insert into users(user_name,user_passwd) values('zhangsan', password('123456')); #在表种插入张三 密码123456
Query OK, 1 row affected, 1 warning (0.02 sec)
mysql> insert into users values('lisi', password('123456'));
Query OK, 1 row affected, 1 warning (0.00 sec)
修改、更新数据表中的数据记录
UPDATE 表名 SET 字段名1=值1[,字段名2=值2] WHERE 条件表达式
mysql> update auth.users set user_passwd=password('abc123') where user_name='lisi';
Query OK, 0 rows affected, 1 warning (0.01 sec)
Rows matched: 1 Changed: 0 Warnings: 1
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
刷新信息:操作操作原本是保存在内存中的,刷新后就保存到硬盘中去了
###修改root密码###
update mysql.user set authentication_string=PASSWORD('abc123') where User='root'; ####mysql5.7版本修改root的命令
在数据表中删除指定的数据记录
格式:
DELETE FROM 表名 [WHERE 条件表达式];
例:
mysql> delete from auth.users where user_name='lisi';
Query OK, 1 row affected (0.00 sec)
mysql> select * from auth.users;
+-----------+-------------------------------------------+
| user_name | user_passwd |
+-----------+-------------------------------------------+
| zhangsan | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+-----------+-------------------------------------------+
1 row in set (0.00 sec)
DQL语句操作
DQL是数据查询语句,只有一条:SELECT
用于从数据表中查找符合条件的数据记录
从数据表中查找符合条件的数据记录
SELECT 字段名1,字段名2 …… FROM 表名 WHERE 条件表达式
select * from auth.users;
select user_name,user_passwd from auth.users where user_name='zhangsan';
######列子######
mysql> select * from auth.users; ###查看数据库auth中users表中所有的数据,这边用通配符*表示所有
+-----------+-------------------------------------------+
| user_name | user_passwd |
+-----------+-------------------------------------------+
| lisi | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| zhangsan | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+-----------+-------------------------------------------+
2 rows in set (0.00 sec)
######例子######
mysql> select user_name,user_passwd from auth.users where user_name='zhangsan'; ####查看数据库auth的users表中zhangsan 数据
+-----------+-------------------------------------------+
| user_name | user_passwd |
+-----------+-------------------------------------------+
| zhangsan | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+-----------+-------------------------------------------+
1 row in set (0.00 sec)
####
mysql> select * from auth.users;
+-----------+-------------------------------------------+
| user_name | user_passwd |
+-----------+-------------------------------------------+
| lisi | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| zhangsan | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+-----------+-------------------------------------------+
2 rows in set (0.00 sec)
数据库表高级操作
关于数据库表的一些基础操作,比如:创建表、删除表、表的 查询等等。数据表在数据库的使用过程中,
有着很高的使用频率,所以本节会讲解些关于 表的升级用法,包括清空表、使用临时表和克隆表。
1、清空列表
清空一个数据表就是删除这个表内的所有数据。前面的小节已经学习过 DELETE FROM 语句,可以删除表内的数据,
除此之外还可以使用 TRUNCATE TABLE 语句实现清 空表内记录。DELETE FROM 语句可以使用 WHERE 子句对删除
的结果集进行过滤选择, 这样更方便、更灵活。TRUNCATE TABLE 语句是删除表中所有记录数据,没法定制,灵活
性上稍差。清空表的具体操作
例:
create table ky (user_name CHAR(16) NOT NULL, user_passwd CHAR(48) DEFAULT '', level CHAR(16) NOT NULL, PRIMARY KEY (user_name));
insert into ky values('lisi', password('123456'),'10');
insert into ky values('lisi1', password('123456'),'45');
insert into ky values('lisi2', password('123456'),'46');
insert into ky values('lisi3', password('123456'),'47');
insert into ky values('lisi4', password('123456'),'48');
insert into ky values('lisi5', password('123456'),'49');
insert into ky values('lisi6', password('123456'),'50');
insert into ky values('lisi7', password('123456'),'1');
mysql> show tables;
+----------------+
| Tables_in_auth |
+----------------+
| ky |
| ky05 |
| tmp |
| tmp1 |
| tmp3 |
| users |
+----------------+
6 rows in set (0.00 sec)
mysql> select * from ky;
+-----------+-------------------------------------------+-------+
| user_name | user_passwd | level |
+-----------+-------------------------------------------+-------+
| lisi | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | 10 |
| lisi1 | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | 45 |
| lisi2 | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | 46 |
| lisi3 | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | 47 |
| lisi4 | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | 48 |
| lisi5 | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | 49 |
| lisi6 | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | 50 |
| lisi7 | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | 1 |
+-----------+-------------------------------------------+-------+
8 rows in set (0.00 sec)
mysql> delete from ky where level >=45;
Query OK, 6 rows affected (0.00 sec)
mysql> select * from ky;
+-----------+-------------------------------------------+-------+
| user_name | user_passwd | level |
+-----------+-------------------------------------------+-------+
| lisi | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | 10 |
| lisi7 | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | 1 |
+-----------+-------------------------------------------+-------+
2 rows in set (0.00 sec)
mysql> truncate table ky;
Query OK, 2 rows affected (0.00 sec)
mysql> select * from ky;
Empty set (0.00 sec)
先创建一个表,往表里面插入数据
有条件的清空,指定数据
清空表中的所有数据(慎用)
2.临时表
MySQL 的临时表,顾名思义,就是临时建立的表,并不会长期存在,主要用于保存一 些临时数据。临时表有个特性,
就是只在当前连接可见,当前连接下可执行增删改查等操作, 当连接被关闭后,临时表就会被 MySQL 删除,相关的资源也会被释放。
下面创建临时表 mytmp,然后插入数据,之后断开当前连接,最后重新连到 MySQL 查看临时是否还存在,具体操作如下
mysql>CREATE TEMPORARY TABLE `mytmp` (`id` int(10) NOT NULL AUTO_INCREMENT,`NAME` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,`level` int(10) NOT NULL,PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into mytmp(name,level) values('aa',10);
select * from mytmp;
退出数据库
mysql -uroot -p
mysql> use auth;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> select * from mytmp;
ERROR 1146 (42S02): Table 'auth.mytmp' doesn't exist
建立一个临时表,插入数据
退出数据库,再进数据库,查看一下表格
3、克隆表
在 MySQL 的开发和维护过程中,会有原样拷贝某个数据表的需求。怎么样才能够快速、 完整的拷贝数据表呢?
先来看一下 CREATE TABLE new_tablename AS SELECT 这个语 句,具体实现的 SQL 语句如下
建立基础环境:
mysql> select * from mytmp;
ERROR 1146 (42S02): Table 'auth.mytmp' doesn't exist
mysql> ^C
mysql> select * from ky;
Empty set (0.00 sec)
mysql> insert into ky values('lisi', password('123456'),'10');
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> insert into ky values('lisi1', password('123456'),'45');
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> insert into ky values('lisi2', password('123456'),'46');
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> insert into ky values('lisi3', password('123456'),'47');
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> insert into ky values('lisi4', password('123456'),'48');
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> insert into ky values('lisi5', password('123456'),'49');
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> insert into ky values('lisi6', password('123456'),'50');
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> insert into ky values('lisi7', password('123456'),'1');
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql>
mysql> drop table tmp;
Query OK, 0 rows affected (0.00 sec)
mysql> create table tmp as select * from ky;
Query OK, 8 rows affected (0.01 sec)
Records: 8 Duplicates: 0 Warnings: 0
mysql> select count(*) from tmp;
+----------+
| count(*) |
+----------+
| 8 |
+----------+
1 row in set (0.00 sec)
建立基础环境:
克隆表:
mysql> use auth;
Database changed
mysql> create table tmp like users; ###通过 LIKE 方法,复制users表生成 tmp 表
Query OK, 0 rows affected (0.00 sec)
mysql> describe tmp; ###表的结构
+-------------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+----------+------+-----+---------+-------+
| user_name | char(16) | NO | PRI | NULL | |
| user_passwd | char(48) | YES | | | |
+-------------+----------+------+-----+---------+-------+
2 rows in set (0.00 sec)
mysql> select * from auth.tmp ; ###查询表的数据
Empty set (0.00 sec)
mysql> select * from users; ###查询users表数据,准备导入tmp表中
+-----------+-------------------------------------------+
| user_name | user_passwd |
+-----------+-------------------------------------------+
| zhangsan | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+-----------+-------------------------------------------+
1 row in set (0.00 sec)
mysql> insert into tmp select * from users; ###将users表数据导入tmp中
Query OK, 1 row affected (0.00 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> select * from tmp; ###查询tmp中数据
+-----------+-------------------------------------------+
| user_name | user_passwd |
+-----------+-------------------------------------------+
| zhangsan | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+-----------+-------------------------------------------+
1 row in set (0.00 sec)
mysql> select * from ky;
+-----------+-------------------------------------------+-------+
| user_name | user_passwd | level |
+-----------+-------------------------------------------+-------+
| lisi | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | 10 |
| lisi1 | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | 45 |
| lisi2 | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | 46 |
| lisi3 | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | 47 |
| lisi4 | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | 48 |
| lisi5 | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | 49 |
| lisi6 | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | 50 |
| lisi7 | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | 1 |
+-----------+-------------------------------------------+-------+
8 rows in set (0.00 sec)
mysql> truncate table ky;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from ky;
Empty set (0.00 sec)
通过like的方式克隆表
SHOW CREATE TABLE 方法
mysql> show create table ky\G
1. row ***************************
Table: ky
Create Table: CREATE TABLE "ky" (
"user_name" char(16) NOT NULL,
"user_passwd" char(48) DEFAULT '',
"level" char(16) NOT NULL,
PRIMARY KEY ("user_name")
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
CREATE TABLE test2 AS SELECT * FROM test1;
CREATE TABLE test3 ("user_name" char(16) NOT NULL,"user_passwd" char(48) DEFAULT '',"level" char(16) NOT NULL,PRIMARY KEY ("user_name")) ENGINE=InnoDB DEFAULT CHARSET=utf8
insert into test3 select * from ky;
select * from test3;
创建新表格,复制白色的部分
注意:不能有空行,否则会报错
查看一下表格是否存在,再导入数据
数据库用户授权
DCL语句操作
############################
设置用户权限(用户不存在时,则新建用户)
GRANT 权限列表 ON 数据库名.表名 TO 用户名@来源地址 [ IDENTIFIED BY ‘密码’ ]
grant select on auth.* to 'xiaoqi'@'localhost' identified by '123456';
######例子####
mysql> grant select on auth.* to 'xiaoqi'@'localhost' identified by '123456';
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
######退出mysql用xiaoqi账户登录####
[root@localhost ~]# mysql -u xiaoqi -p ##登录
Enter password: ##输入密码
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 5.7.20 Source distribution
Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> ###已经登录
#######验证xiaoqi#####
mysql> select * from auth.users; ###验证授权的访问操作
+-----------+-------------------------------------------+
| user_name | user_passwd |
+-----------+-------------------------------------------+
| zhangsan | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+-----------+-------------------------------------------+
1 row in set (0.00 sec)
mysql> drop table auth.users; ####验证非授权的访问操作
ERROR 1142 (42000): DROP command denied to user 'xiaoqi'@'localhost' for table 'users'
########创建bdqn数据库,授权192.168.100.1的主机连接,用户名为dbuser 密码为pwd@123允许bdqn库中操作###
create database bdqn;
grant all on auth.* to 'dbuser'@'192.168.100.%' identified by 'pwd@123';
grant create on bdqn.* to 'dbuser'@'192.168.100.1' identified by 'pwd@123';
#######列子####3
mysql> create database bdqn; ####创建bdqn数据库
Query OK, 1 row affected (0.02 sec)
mysql> grant all on bdqn.* to 'dbuser'@'192.168.100.1' identified by 'pwd@123'; ###做授权###
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
mysql> show grants; #查看授权情况
############################
查看用户的权限
SHOW GRANTS FOR 用户名@来源地址
######列子####
mysql> show grants for 'dbuser'@'192.168.100.1'; ####查看用户的权限
+--------------------------------------------------------------+
| Grants for dbuser@192.168.100.1 |
+--------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'dbuser'@'192.168.100.1' |
| GRANT ALL PRIVILEGES ON "bdqn".* TO 'dbuser'@'192.168.100.1' |
+--------------------------------------------------------------+
2 rows in set (0.00 sec)
revoke all on bdqn.* from 'xiaoqi'@'localhost';
############################
撤销用户的权限
REVOKE 权限列表 ON 数据库名.表名 FROM 用户名@来源地址
revoke all on bdqn.* from 'dbuser'@'192.168.100.1';
#####列子####
mysql> revoke all on bdqn.* from 'dbuser'@'192.168.32.2';
Query OK, 0 rows affected (0.00 sec)
mysql> show grants for 'dbuser'@'192.168.100.1';
+------------------------------------------------+
| Grants for dbuser@192.168.100.1 |
+------------------------------------------------+
| GRANT USAGE ON *.* TO 'dbuser'@'192.168.100.1' |
+------------------------------------------------+
1 row in set (0.00 sec)
对xiaoqi进行授权
远程授权
先看端口
此时不能远程登录,没授权
授权
grant select on auth.* to 'xiaoqi'@'%' identified by '123456'
撤销授权
REVOKE all ON auth.* FROM 'xiaoqi' @'localhost';
查看授权信息