Mysql数据库管理篇

1. 为什么要使用数据库

在这里插入图片描述

  • 数据保存在内存

优点:存取速度快

缺点:数据不能永久保存

  • 数据保存在文件

优点:数据永久保存

缺点:1)速度比内存操作慢,频繁的IO操作。2)查询数据不方便

  • 数据保存在数据库

1)数据永久保存

2)使用SQL语句,查询方便效率高。

3)管理数据方便

一:Mysql基本操作命令

1.1:查看数据库信息

  • 登录数据库

    扫描二维码关注公众号,回复: 11837222 查看本文章
  • 格式:mysql -h主机地址 -u用户名 -p用户密码

  • 注:u与root可以不加空格

[root@localhost ~]# iptables -F
[root@localhost ~]# setenforce 0
#登录数据库
[root@localhost ~]# mysql -u root -p

退出MYSL命令:exit(回车)

  • 修改密码

  • 格式:mysqladmin -u用户名 -p旧密码 password 新密码

  1. 例:给root加个密码ab12
  • 首先在DOS下进入目录mysqlbin,然后键入以下命令
mysqladmin -uroot –password ab12
注:因为开始时root没有密码,所以-p旧密码一项就可以省略了。
  • 查看数据库
SHOW DATABASES

mysql> show databases;          #大部分SQL操作命令必须以;结束
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.01 sec)

1.2:查看数据库中的表信息

USE 数据库名

SHOW TABLES

  • 大多数重要的命令都放在mysql中
mysql> use mysql;
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库中所有的表
mysql> show tables;
+---------------------------+
| Tables_in_mysql           |
+---------------------------+
| columns_priv              |
| db                        |
| engine_cost               |
| event                     
....省略内容
| user                      |
+---------------------------+
31 rows in set (0.01 sec)

Mysql数据库的数据文件都存放在/usr/local/mysql/data目录下,每个数据库对应一个子目录,用于储存数据表文件。每一个数据表对应为三个文件,后缀名分别为''.frm “.myd” 和“.myi"。当然也有少数以opt、csm、csv、ibd结尾的。

mysql> select * form user;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'form user' at line 1
mysql> select * from user;
+-----------+---------------+-------------+-------------+-------------+-------------+-------------+-----------+-------------+---------------+--------------+-----------+------------+-----------------+------------+------------+--------------+------------+-----------------------+------------------+--------------+-----------------+------------------+------------------+----------------+---------------------+--------------------+------------------+------------+--------------+------------------------+----------+------------+-------------+--------------+---------------+-------------+-----------------+----------------------+-------
.....省略内容

查看user用户

mysql> select user from user;
+---------------+
| user          |
+---------------+
| mysql.session |
| mysql.sys     |
| root          |
+---------------+
3 rows in set (0.00 sec)

1.3:查看数据库的结构(字段)

DESCRIBE [数据库名.]表名
mysql> describe user;          #也可以使用”sesc user;“
+------------------------+-----------------------------------+------+-----+-----------------------+-------+
| Field                  | Type                              | Null | Key | Default               | Extra |
+------------------------+-----------------------------------+------+-----+-----------------------+-------+
| Host                   | char(60)                          | NO   | PRI |                       |       |
| User                   | char(32)                          | NO   | PRI |                       |       |
| Select_priv            | enum('N','Y')                     | NO   |     | N                     |       |
....省略内容

1.4:SQL语言概述

数据库目前标准的指令是SQL。SQL是Structured Querl Language的缩写,即结构化查询语言。它是1974年有Boyce和Chamberlin提出来的,1975-1979年,IBM公司研制的关系数据库管理系统原型System R实现了这种语言,经过多年的发展,SQL语言得到了广泛的应用.

  • SQL语言
    • 是Structured Query Language的缩写,及结构化查询语言
    • 是关系型数据库的标准语言
    • 用于维护管理数据库,如数据查询,数据更新,访问控制,对象管理等功能
  • SQL分类
    • DDL:数据定义语言
    • DML:数据操纵语言
    • DQL:数据查询语言
    • DCL:数据控制语言

二:创建数据库和表

2.1:DDL语句可用于创建数据库对象、如库、表、索引

使用DDL语句新建库、表

  • 创建数据库
CEWATE DATABASE 数据库名
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)
#创建shuai数据库
mysql> create database shuai;
Query OK, 1 row affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| shuai              |
| sys                |
+--------------------+
5 rows in set (0.00 sec)
mysql> use shuai;
Database changed
mysql> show tables;
Empty set (0.00 sec)

刚创建的数据库是空的,其中不包含任何表,在/usr/local/mysql/data目录下会自动生成一个与新建的库名相同的空文件。

  • 创建数据表
CREATE TABLE 表名(字段定义...

create table 表名(字段01名称 字段01类型 字段01约束,字段02名 字段02类型 字段02约束)存储引擎 字符集

【多个字段用,隔开】

字段01名称:属性名称,自定义

字段01类型

  • int (5) 整型 00000-99999

  • double 浮点型

  • decimal(5,2) 有效数字是5位,小数点后面保留2位 100.00 088.45

  • fioat 单精度浮点 4字节

  • varchar(50) 可变长度字符串

  • char(10) 固定长度字符串

字段01约束

  • 非空约束:内容不允许为空

  • 主键约束:非空且唯一 典型的标识

  • 默认值:假如没有填数据,默认预先设定的值

  • 自增特:id 1 2 3 自动帮你去填

存数引擎:myisam innodb

字符集:UTF-8

(id int(3) not null primary key auto_increment  #id 名称 int3) 类型  not null 不允许为空  preimary key 组建

mysql> create table info (id int(3) not null primary key auto_increment,name varchar(10) not null,score decimal(5,2),address varchar(50) default '未知');
Query OK, 0 rows affected (0.01 sec)

#显示所以表
mysql> show tables;
+-----------------+
| Tables_in_shuai |
+-----------------+
| info            |
+-----------------+
1 row in set (0.00 sec)

#查看表结构
mysql> describe info;
+---------+--------------+------+-----+---------+----------------+
| Field   | Type         | Null | Key | Default | Extra          |
+---------+--------------+------+-----+---------+----------------+
| id      | int(3)       | NO   | PRI | NULL    | auto_increment |
| name    | varchar(10)  | NO   |     | NULL    |                |
| score   | decimal(5,2) | YES  |     | NULL    |                |
| address | varchar(50)  | YES  |     | 未知    |                |
+---------+--------------+------+-----+---------+----------------+
4 rows in set (0.01 sec)

#查看info数据
mysql> select * from info;
Empty set (0.00 sec)
数据是没有的   空的  

#提权  对所有数据库所有表给root用户所有终端都能访问  密码设置abc123
mysql> grant all privileges on *.* to 'root'@'%' identified by 'abc123';
Query OK, 0 rows affected, 1 warning (0.00 sec)
#可以任意终端访问
mysql> grant all privileges on *.* to 'root'@'localtion' identified by 'abc123'; 
Query OK, 0 rows affected, 1 warning (0.00 sec)
  • 设置环境变量

mark

添加到环境变量中

mark

mark

2.2:管理表中的数据

DML语句用于对表中的数据进行管理

包括的操作

  • INSERT:插入新数据

  • UPDATE:更新原有数据

  • DELETE:删除不不需要的数据

2.3:向数据表中插入新的数据记录

INSERT INTO 表名(字段1,字段2....)
  VALUES(字段1的值。字段2的值,.....)
  
  备注:
  数序一致
  数量相同
mysql> show tables;
+-----------------+
| Tables_in_shuai |
+-----------------+
| info            |
+-----------------+
1 row in set (0.00 sec)

mysql> select * from info;
Empty set (0.00 sec)               #数据为空

mysql> desc info;
+---------+--------------+------+-----+---------+----------------+
| Field   | Type         | Null | Key | Default | Extra          |
+---------+--------------+------+-----+---------+----------------+
| id      | int(3)       | NO   | PRI | NULL    | auto_increment |
| name    | varchar(10)  | NO   |     | NULL    |                |
| score   | decimal(5,2) | YES  |     | NULL    |                |
| address | varchar(50)  | YES  |     | 未知    |                |
+---------+--------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
#插入新内容
mysql> insert into info (id,name,score,address) values (1,'shuaige',88.7,'shanghai');
Query OK, 1 row affected (0.00 sec)

mysql> select * from info;
+----+---------+-------+----------+
| id | name    | score | address  |
+----+---------+-------+----------+
|  1 | shuaige | 88.70 | shanghai |
+----+---------+-------+----------+
1 row in set (0.00 sec)
##这边不加字段名称也可直接添加字段的值(默认是所有字段)
mysql> insert into info values (2,'lisi',88,'suzhou');
Query OK, 1 row affected (0.00 sec)

mysql> select * from info;
+----+---------+-------+----------+
| id | name    | score | address  |
+----+---------+-------+----------+
|  1 | shuaige | 88.70 | shanghai |
|  2 | lisi    | 88.00 | suzhou   |
+----+---------+-------+----------+
2 rows in set (0.00 sec)
#default定义未知
mysql> insert into info (name,score,address) values ('luoli',88,'
shanxi'),('meimei',77,default);
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0
mysql> select * from info;
+----+---------+-------+----------+
| id | name    | score | address  |
+----+---------+-------+----------+
|  1 | shuaige | 88.70 | shanghai |
|  2 | lisi    | 88.00 | suzhou   |
|  3 | luoli   | 88.00 | shanxi   |
|  4 | meimei  | 77.00 | 未知     |
+----+---------+-------+----------+
4 rows in set (0.00 sec)

#筛选大于85的信息
mysql> select * from info where score > 85;
+----+---------+-------+----------+
| id | name    | score | address  |
+----+---------+-------+----------+
|  1 | shuaige | 88.70 | shanghai |
|  2 | lisi    | 88.00 | suzhou   |
|  3 | luoli   | 88.00 | shanxi   |
+----+---------+-------+----------+
3 rows in set (0.00 sec)
#筛选的信息克隆到一张表 新表名称为hello
mysql> create table hello as select * from info where score > 80; 
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0
#查看hello表数据   已经克隆过来了
mysql> select * from hello;
+----+---------+-------+----------+
| id | name    | score | address  |
+----+---------+-------+----------+
|  1 | shuaige | 88.70 | shanghai |
|  2 | lisi    | 88.00 | suzhou   |
|  3 | luoli   | 88.00 | shanxi   |
+----+---------+-------+----------+
3 rows in set (0.00 sec)
#查看数据库表名称
可以看出有两个表
mysql> show tables;
+-----------------+
| Tables_in_shuai |
+-----------------+
| hello           |
| info            |
+-----------------+
2 rows in set (0.00 sec)

2.4:修改、更新数据表中的数据记录

UPDATE 表名 SET 字段名1=1[,字段名2=2] WHERE条件表达式
mysql> update info set score=45 where name='luoli';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0
#修改字段名称为luoli  值修改为45
mysql> select * from info;
+----+---------+-------+----------+
| id | name    | score | address  |
+----+---------+-------+----------+
|  1 | shuaige | 88.70 | shanghai |
|  2 | lisi    | 88.00 | suzhou   |
|  3 | luoli   | 45.00 | shanxi   |
|  4 | meimei  | 77.00 | 未知     |
+----+---------+-------+----------+
4 rows in set (0.00 sec)
  • 通过修改数据库的方式实现修改数据库管理员密码
#查看数据库
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| shuai              |
| sys                |
+--------------------+
5 rows in set (0.00 sec)
#查看表
mysql> show tables;
+---------------------------+
| Tables_in_mysql           |
+---------------------------+
| columns_priv              |
| db                        |
| engine_cost               |
| event                     |
| func                      |
| general_log               |
| gtid_executed             |
.....省略内容
| user                      |
+---------------------------+
31 rows in set (0.00 sec)
#root是权限跟远程登录权限
mysql> select user from user;
+---------------+
| user          |
+---------------+
| root          |
| mysql.session |
| mysql.sys     |
| root          |
| root          |
+---------------+
5 rows in set (0.00 sec)

2.5:设置用户权限的命令

  • 若是用户已存在,则会更改用户密码

  • 若是用户不存在,则是新建用户

  • GRANT 权限列表 ON 数据库名.表名 TO 用户名@来源地址 [IDENTIFIED BY ‘密码′ ]

#创建用户

mysql> grant all privileges on *.* to 'liu'@'localhost' identified by 'abc123';
Query OK, 0 rows affected, 1 warning (0.00 sec)
#mysql数据库的内置库提取到内存里
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
#登录用户成功
[root@localhost ~]# mysql -u liu -p
Enter password:    

2.5:密码如果是遗忘密码怎么修改?

[root@localhost ~]# vim /etc/my.cnf

mark

  • 重启服务
[root@localhost ~]# systemctl start mysqld.service
[root@localhost ~]# netstat -natp | grep 3306
tcp6       0      0 :::3306                 :::*                    LISTEN      11819/mysqld        
  • 测试

mark

[root@localhost ~]# mysql -u root -p
Enter password: 
#root也一样登录
  • 修改密码

mark

mark

  • 修改配置
mysql> update mysql.user set authentication_string=password('123123') where user='liu';
Query OK, 1 row affected, 1 warning (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 1
#刷新
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
#退出
mysql> quit
Bye
#注释掉刚刚设置的跳过登录设置  
[root@localhost ~]# vim /etc/my.cnf
#skip-grant-tables
#重启服务
[root@localhost ~]# systemctl start mysqld.service
[root@localhost ~]# netstat -natp | grep 3306
tcp6       0      0 :::3306                 :::*                    LISTEN      11819/mysqld       
  • 登录测试
[root@localhost ~]# mysql -u liu -p
Enter password:      #输入设置的123123登录
...省略内容
mysql>        #修改密码成功

2.6:在数据库表中删除指定的数据记录

DELETE FPOM 表名 WHERE 条件表达式
mysql> select * from hello;
+----+---------+-------+----------+
| id | name    | score | address  |
+----+---------+-------+----------+
|  1 | shuaige | 88.70 | shanghai |
|  2 | lisi    | 88.00 | suzhou   |
|  3 | luoli   | 88.00 | shanxi   |
|  4 | hei     | 55.00 | nanjing  |
+----+---------+-------+----------+
4 rows in set (0.01 sec)
#删除60分以下的
mysql> delete from hello where score <=60;
Query OK, 1 row affected (0.00 sec)
#以成功删除(删除部分)
mysql> select * from hello;
+----+---------+-------+----------+
| id | name    | score | address  |
+----+---------+-------+----------+
|  1 | shuaige | 88.70 | shanghai |
|  2 | lisi    | 88.00 | suzhou   |
|  3 | luoli   | 88.00 | shanxi   |
+----+---------+-------+----------+
3 rows in set (0.00 sec)
#删除全部内容
mysql> delete from hello;
Query OK, 3 rows affected (0.00 sec)
#里面已经是空的了
mysql> select * from hello;
Empty set (0.00 sec)
:谨慎操作

2.6:DQL是数据查询语句,只有SELECT

用于从数据表中查找符合条件的数据记录

查询时不指定条件

SELECT 字段名1,字段名2....FROM表名 WHERE 条件表达式
mysql> select name,score from info where address='shanghai';
+---------+-------+
| name    | score |
+---------+-------+
| shuaige | 88.70 |
+---------+-------+
1 row in set (0.00 sec)

2.7:清空表

  • DELETE FROM tablename

  • TRUNCATE TABLE tablename

  • truncate与drop区别

drop是删除表 truncate 是情况里面的数据

musql> truncate table info;

2.8:临时表

  • 临时建立的表,用于保存一些临时数据,不会长期存在
nt,name varchar(10) not null,hobby varchar(10) not null);
mysql> create temporary table xiao (id int(3) not null auto_increment,name varchar(10) not null,hobby varchar(10) not null,primary key(id))engine=innodb default charset=utf8;
Query OK, 0 rows affected (0.01 sec)
#查看表结构
mysql> describe xiao;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(3)      | NO   | PRI | NULL    | auto_increment |
| name  | varchar(10) | NO   |     | NULL    |                |
| hobby | varchar(10) | NO   |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

#表中插入数据
mysql> insert into xiao (name,hobby) values ('boy','dog');
Query OK, 1 row affected (0.01 sec)
#查看xiao表数据
mysql> select * from xiao;
+----+------+-------+
| id | name | hobby |
+----+------+-------+
|  1 | boy  | dog   |
+----+------+-------+
1 row in set (0.00 sec)

#查看所有表
mysql> show tables;
+---------------+
| Tables_in_mei |
+---------------+
| hei           |
+---------------+
1 row in set (0.00 sec)
发现不在硬盘上面  是在内存上

测试临时表断开连接会自动删除

#重新登录数据库
[root@localhost ~]# mysql -u root -p
Enter password: 
...省略
mysql> use mei;
#发现已经没有了
mysql> select * from xiao;
ERROR 1146 (42S02): Table 'mei.xiao' doesn't exist

2.9:临时表

2.91:create方法

#查看hei表信息结构
mysql> select * from hei;
+----+--------+-------+-----------+
| id | name   | score | address   |
+----+--------+-------+-----------+
|  1 | lisi   | 44.50 | doongjing |
|  2 | wangwu | 77.00 | xiamen    |
+----+--------+-------+-----------+
2 rows in set (0.00 sec)
#查询的语句生成一张新表hh
mysql> create table hh as select * from hei;
#已经生成
mysql> show tables;
+---------------+
| Tables_in_mei |
+---------------+
| hei           |
| hh            |
+---------------+
2 rows in set (0.00 sec)

#查看hh表结构  可以看出跟hei表一样
mysql> select * from hh;
+----+--------+-------+-----------+
| id | name   | score | address   |
+----+--------+-------+-----------+
|  1 | lisi   | 44.50 | doongjing |
|  2 | wangwu | 77.00 | xiamen    |
+----+--------+-------+-----------+
2 rows in set (0.00 sec)

克隆也可分为两部分:第一步复制结构生成表 (结构没有数据)第二步 导入数据

2.92:LIKE方法

  • 从hei表完整复制结构生成gg表
mysql> create table gg like hei;
Query OK, 0 rows affected (0.00 sec)
#查看所有表
mysql> show tables;
+---------------+
| Tables_in_mei |
+---------------+
| gg            |
| hei           |
+---------------+
2 rows in set (0.00 sec)
#新表gg是没有数据的 
mysql> select * from gg;
Empty set (0.00 sec)
  • 先查看hei表完整结构,根据结构创建名字不同结构相同的表gg,再导入数据
mysql> insert into gg select * from hei;
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0
##已经生成数据结构了
mysql> select * from gg;
+----+--------+-------+-----------+
| id | name   | score | address   |
+----+--------+-------+-----------+
|  1 | lisi   | 44.50 | doongjing |
|  2 | wangwu | 77.00 | xiamen    |
+----+--------+-------+-----------+
2 rows in set (0.00 sec)

三:数据库用户授权

DCL语句设置用户权限(用户不存在时;则会新建用户)

  • 若用户已存在,则更改用户密码
  • 若用户不存在,则新建用户
GRANT 权限列表 ON 数据库名,表名 TO 用户名@来源地址 [IDENTILED BY '密码’]
# *.*:所有数据库所有表 
mysql> grant all on *.* to 'tom'@'locahost' identified by 'abc123'; 
Query OK, 0 rows affected, 1 warning (0.00 sec)

##mysql数据库的内置库提取到内存里。
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
#all privileges:所有权限,%:所有终端'
mysql> grant all privileges on *.* to 'root'@'%' identified by 'abc123';
Query OK, 0 rows affected, 1 warning (0.00 sec)

3.1:查看用户的权限

SHOW GRANTS FOR 用户名@来源地址

查看用户权限

mysql> show grants for 'root'@'%';
+-------------------------------------------+
| Grants for root@%                         |
+-------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' |
+-------------------------------------------+
1 row in set (0.0:0 sec)

查看数据库有哪些用户

mysql> select user from mysql.user;
+---------------+
| user          |
+---------------+
| root          |
| tom           |
| liu           |
| mysql.session |
| mysql.sys     |
| root          |
| root          |
+---------------+
7 rows in set (0.00 sec)

3.2:撤销用户权限的命令

REVOKE 权限列表 ON 数据库名.表名 FROM 用户名@来源地址
mysql> revoke all privileges on *.* from 'root'@'%';
Query OK, 0 rows affected (0.00 sec)

mysql> show grants for 'root'@'%';
+----------------------------------+
| Grants for root@%                |
+----------------------------------+
| GRANT USAGE ON *.* TO 'root'@'%' |
+----------------------------------+
1 row in set (0.00 sec)

猜你喜欢

转载自blog.csdn.net/weixin_47151643/article/details/108173325