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 新密码
例:给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 名称 int(3) 类型 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)
- 设置环境变量
添加到环境变量中
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
- 重启服务
[root@localhost ~]# systemctl start mysqld.service
[root@localhost ~]# netstat -natp | grep 3306
tcp6 0 0 :::3306 :::* LISTEN 11819/mysqld
- 测试
[root@localhost ~]# mysql -u root -p
Enter password:
#root也一样登录
- 修改密码
- 修改配置
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)