MySQL数据库(增-删-改-查)
Mysql中的默认数据库介绍
information_schema:主要存储了系统中的一些数据库对象信息。比如用户表信息、列信息、权限信息、字符集信息、分区信息等。
cluster:存储了系统的集群信息。
mysql:存储了系统的用户权限信息。
test:系统自动创建的测试数据库,任何用户都可以使用。
DDL
对于库的操作:
create database dbname; 创建一个叫dbname的数据库
show databases; 查看所有数据库
use dbname; 进入dbname数据库
show tables; 查看当前所在数据库中的表
drop database dbname; 删除一个叫dbname的数据库
对于表的操作:
create tabale tablename (字段1 数据类型(长度),字段2 数据类型(长度)...);
举例:
create table emp(ename varchar(10),hiredate date,sal decimal(10,2),deptno int(2));
创建一个叫emp的表
desc tablename; 查看tablename表的结构
show create table tablename G; 查看tablename表的结构,同时可以看到存储的引擎和字符编码
drop table tablename; 删除tablename这个表
修改表结构的操作:
1.改字段类型
alter table tablename modify 字段 字段类型 [first | alter 字段名]
举例
alter table tablename modify ename varchar (20); 修改tablename表中ename字段的定义
2.增加表字段的操作:
alter table tablename add 字段 字段定义 [first | after 字段名]
first 添加字段为第一个字段
after 添加字段到指定字段后
默认追加
举例:
alter table emp add age int(2) after sal; 添加age字段到sal后
3.删除表字段:
alter table tablename drop 字段;
举例:
alter table emp drop age 在表emp中删除age字段
4.修改字段名:
alter table tablename change 旧字段 新字段 字段类型 [first | after 字段名]
举例:
alter table emp change age age_new int(2) first; 将emp中的age字段改为age_new字段,同时修改了字段类型
5.修改表名:
alter table tablename rename 新表名;
alter table emp rename emp1; 将表名emp改为emp1
DML
对数据进行操作
增 insert(插入数据)
删 delete(删除数据)
改 update(更新数据)
DQL
查 select(查询数据)
1.插入数据 insert
insert into 表名(字段1,字段2,...) values('值1','值2',...)
举例:
insert into emp (ename,hiredate,sal,deptno) values('zhangshan','2020-02-07','3000','1'); 向emp表中插入一行数据
insert into emp values('lisi','2020-02-07','10000','2'); 向emp表中插入一行数据
insert into emp (ename,sal) values('wangwu','100'); 向emp表中插入一行数据
显示结果如下:
MariaDB [dbname]> select * from emp;
+-----------+------------+----------+--------+
| ename | hiredate | sal | deptno |
+-----------+------------+----------+--------+
| zhangshan | 2020-02-07 | 3000.00 | 1 |
| lisi | 2020-02-07 | 10000.00 | 2 |
| wangwu | NULL | 100.00 | NULL |
+-----------+------------+----------+--------+
3 rows in set (0.00 sec)
举例(一次录入多个数据):
insert into dept values(1,'zhangsan'),(2,'lisi'),(3,'wangwu');
显示结果如下:
MariaDB [dbname]> select * from dept;
+--------+----------+
| deptno | deptname |
+--------+----------+
| 1 | zhangsan |
| 2 | lisi |
| 3 | wangwu |
+--------+----------+
3 rows in set (0.00 sec)
2.修改数据 update
update 表名 set 字段=值1,字段2=值2,...[where 字段=值]
举例:
之前数据如下:
MariaDB [dbname]> select * from emp;
+-----------+------------+----------+--------+
| ename | hiredate | sal | deptno |
+-----------+------------+----------+--------+
| zhangshan | 2020-02-07 | 3000.00 | 1 |
| lisi | 2020-02-07 | 10000.00 | 2 |
| wangwu | NULL | 100.00 | NULL |
+-----------+------------+----------+--------+
3 rows in set (0.00 sec)
用update修改数据后如下:
update emp set sal='1000' where ename='wangwu';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
MariaDB [dbname]> select * from emp;
+-----------+------------+----------+--------+
| ename | hiredate | sal | deptno |
+-----------+------------+----------+--------+
| zhangshan | 2020-02-07 | 3000.00 | 1 |
| lisi | 2020-02-07 | 10000.00 | 2 |
| wangwu | NULL | 1000.00 | NULL |
+-----------+------------+----------+--------+
3 rows in set (0.00 sec)
为wangwu更改入职日期和编号
MariaDB [dbname]> update emp set hiredate='2020-02-07',deptno='3' where ename='wangwu';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
MariaDB [dbname]> select * from emp;
+-----------+------------+----------+--------+
| ename | hiredate | sal | deptno |
+-----------+------------+----------+--------+
| zhangshan | 2020-02-07 | 3000.00 | 1 |
| lisi | 2020-02-07 | 10000.00 | 2 |
| wangwu | 2020-02-07 | 1000.00 | 3 |
+-----------+------------+----------+--------+
3 rows in set (0.00 sec)
两个表联合修改数据:
update emp a,dept b set a.sal=a.sal*b.deptno,a.ename =b.deptname where a.deptno=b.deptno;
delete a,b from emp a,dept b where a.deptno=b.deptno and a.deptno=2;
3.删除数据 delete
delete from 表名 [where 字段=值];
delete from dept where depton=3;
4.查询数据 select
select * from 表名 [where 字段=值];
select 字段1,字段2,... from 表名 [where 字段=值];
(1)查询不重复的数据
select distinct 字段 from emp; 打印时去掉重复的字段
(2)多条件查询
可以使用逻辑关系符 and or not ;= > < >= >= !=
select * from emp where hiredate='2019-02-07' and sal<='3000';
(3)排序 order by
select * from 表名 [where 字段=值] [order by 字段 [desc (降序)/asc(升序)]]
select * from emp order by sal desc;
select * from emp order by sal,deptno desc;
(4)分页 limit
select * from 表名 [where 字段=值] [order by 字段 [desc (降序)/asc(升序)]]
[limit [起始位置],行数];
select * from emp order by sal desc limit 1;
(5)聚合
sum()求和 count(*)数据条数 max最大值 min 最小值
select [字段1,字段2,...] [聚合函数] from 表名 [where 字段=值] [group by 字段1,字段2,] [with rollup] having条件;
聚合函数:表示要做聚合操作
group by:分组,表示要进行分组聚合的字段
with rollup:选用表示对聚合分类后的数据在汇总
having:表示对分类后的结果再次进行过滤
where和having区别,where用于聚合前,having用于聚合后
select sal,count(1) from emp group by sal having count(1)>1;
按名字分组然后最小分数大于80的列出来
select name from report group by name having min(score)>80;
select name from report group by name having min(score)>80 and count(subject)=3;
select distinct name from report where name not in (select name from report where score<=80);
子查询
查询时,需要的条件是另一个select语句的结果。
子查询用到的关键字主要包括in, not in ,=,!=等
多表联合查询:
多表连接查询就是指数据同时从多张表中获取,查询语句涉及到多张表。
内连接:inner join
外连接:
左外连接:left outer join
右外连接:right outer join
全连接:union
交叉连接:cross join
内连接查询:选用两张表中互相匹配的记录(两张表同时符合某一个指定条件的数据记录组合)
select ename,deptname,sal from emp,dept where emp.deptno=dept.deptno;
DCL
用户权限管理
grant all privilege on discuz.* to 'rundiscuz'@'%' identified by '123123';
all privilege 所有权限
select
insert
updeat
delete
主机地址:
% 所有的主机
192.168.1._ 代表网段
192.168.1.10
域名或主机名
flush privileges; #刷新数据库权限/授权刷新
show grants for admin@localhost; #查询指定用户的所有权限
grant select on dbname.* to 'admin'@'localhost' identified by '123123'; #只给admin用户select查询dbname.*的权限
grant all privileges on dbname.* to admin@localhost identified by '123123'; #给admin用户dbname.*数据库下的所有权限
revoke all on dbname.* from 'admin'@'localhost'; #撤销指定用户所有权限
revoke select on dbname.* from 'admin'@'localhost'; #撤销admin用户对dbname的select查询dbname.*的权限
创建mysql用户
1.首先获取密文密码
mysql> select password('123123');
+-------------------------------------------+
| password('123123') |
+-------------------------------------------+
| *E56A114692FE0DE073F9A1DD68A00EEB9703F3F1 |
+-------------------------------------------+
1 row in set (0.00 sec)
2.创建成功
mysql> create user 'name'@'host' identified by password '*E56A114692FE0DE073F9A1DD68A00EEB9703F3F1';
Query OK, 0 rows affected (0.00 sec)
查看mysql用户列表
select user,host,password from mysql.user;
删除mysql用户
drop user 'name'@'host';
重命名mysql用户名/host也可以修改
rename user 'name'@'host' to 'new_name'@'host'
给当前用户设置密码
set password = password ('new_password');
给其他用户设置密码
set password for 'user'@'host' = password('new_password')
mysql权限列表
all #设置所有除grant option之外的所有权限
alter #允许使用alter table
creater #允许使用creater table
creater user #用户管理权限
delete #允许使用delete
drop #允许使用drop table
insert #允许使用insert
replication slave #从主服务器读取二进制日志事件
select #允许使用select
show databases #显示所有数据库
update #允许使用update
MySQL数据库的三种安装方式:
- yum (rpm)
- 源码包安装
- 二进制包安装
介绍二进制安装方式
解包:tar xf mysql-5.6.30-linux-glibc2.5-x86_64.tar.gz
mv mysql-5.6.30-linux-glibc2.5-x86_64 /usr/local/mysql
useradd -M -s /sbin/nologin mysql
yum -y install autoconf
cd /usrl/local/myslq/scripts/
初始化数据库:
./mysql_install_db --user=mysql --datadir=/usr/local/mysql/data/ --basedir=/usr/local/mysql/
准备mysql配置文件
cp /usr/local/mysql/support-files/my-default.cnf /etc/my.cnf
准备启动脚本
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
echo 'export PATH="$PATH:/usr/local/mysql/bin"' >> /etc/profile
source /etc/profile
mysql数据库忘记root密码怎么解决?
1.关闭数据库(或kill)
/etc/init.d/mysqld stop
2.将数据库跳过授权表以安全模式在后台运行
mysqld_safe --skip-grant-table &
3.无密码登录数据库后,使用update语句修改密码;
update mysql.user set password=Password('123456') where user='root';
4.关闭安全模式的数据库,重启数据库
kill 对应的pid (或者关闭数据库)
启动数据库后,使用新密码登录
mysql 命令(mysql的客户端)
-u 指定用户
-p 指定密码
-P 指定端口,默认3306
-h 指定远程主机地址
-e 执行SQL
mysql支持中文字符集;
中文字符集 GBK GB2312 utf-8
create database dbname character set utf8; 创建数据库时指定字符集;
create table dbname.test (name varchar(20),...) character set utf8;
在创建表时指定字符集
alter database dbname character set utf8;修改数据库字符集
alter table dbname.test character set utf8;修改表的字符集(重启数据库生效)
show character set; mysql中可以使用的字符集
show collation like 'utf%'; 支持的校验字符规则
show variables like 'character_set_database'; 默认使用的字符集
show variables like 'collation_data'; 默认使用的字符校验规则
永久修改字符编码;
在mysql配置文件中/etc/my.cnf添加:
[mysqld]
character-set-server=utf8
[mysql]
default-character-set=utf8
[client]
default-character-set=utf8
show variables like 'char%';
show create table dbname.test; 可以查看表使用的字符集
索引与事务
数据库索引:是对表中的一列或多列数据的值进行排序的一种数据结构,它是一列或多列的值得集合;
mysql
举例:目前10w条数据
没有索引:select * from tablename where a=1;全表扫描
如果有索引:比如b列创建索引,只扫描b这列;
索引的作用
- 设置合适的索引,数据库能够加快查询速度;
- 可以降低数据库的IO成本,并且索引还可以降低排序的成本;
- 通过唯一性索引保证表数据的唯一性,可以加快表与表直接的连接查询;
- 在使用分组和排序时,可以减少分组和排序的时间;
索引也是表的一部分,如果索引创建的过多,会占用更多的空间,也会影响update或者是insert语句的执行;
索引的分类
- 普通索引(index):最基本的索引,没有什么限制;
- 唯一性索引(unique):索引列的所有值只能出现一次,也就是说必须为唯一,可以为空;
- 主键(primary key):特殊的唯一性索引,不能为空;
- 全文索引(fulltext):用于查找关键字,通常字段类型为text;
- 多列索引(组合索引,复和索引)
普通索引
创建普通索引:
创建表时:creat table 表名 (字段1 字段类型,字段2 字段类型[NOT NULL]...,index 索引名(字段1(length)));
创建表后:
create index 索引名 on 表名 (字段[(length)]);
alter table 表名 add index 索引名 (字段[(length)]);
create index idx_sal on sal(薪资);
查看索引
show index/keys from tablename G;
删除索引:
drop index 索引名称 on 表名;
alter table 表名 drop index 索引名称;
唯一性索引
创建表时:creat table 表名 (字段1 字段类型,字段2 字段类型[NOT NULL]...,unique index 索引名(字段1(length)));
创建表后:
create unique index 索引名 on 表名 (字段[(length)]);
alter table 表名 add unique index 索引名 (字段[(length)]);
查看索引
show index/keys from tablename G;
删除索引:
drop index 索引名称 on 表名;
alter table 表名 drop index 索引名称;
主键 (创建主键的值不能有空值,每个表中只有一个主键)
创建表时:creat table 表名 (字段1 字段类型,字段2 字段类型[NOT NULL]...,primary key 索引名(字段1(length)));
创建表后:
alter table 表名 add primary key 索引名 (字段[(length)]);
查看索引
show index/keys from tablename G;
删除主键:
alter table 表名 drop primary key;
补充说明:
length的作用:
有时需要对文本或者长字符串的字段建立索引,如果直接对该字段创建索引,会增加索引的存储空间,并且降低索引的利用率。
length的作用是指定该字段对应值的前几个字符的创建索引;使用了length的索引称为前缀索引
组合索引:
假设a,b两个字段都有索引,查询条件是a=1,b=2,查询时先找出a=1的结果,在该结果中再找b=1,mysql执行的时候,只会用到一个索引来查询,此时可以对a,b做组合索引。
索引失效:
1.条件中有or a=1 or b=2
2.在like中查询关键字前有% (%a%)
3.索引列是表达式或函数的一部分 where a>10
4.目测全表扫描比索引快
5.字段的数据类型是字符串,条件中的数据一定要加'',不加不使用索引;
创建索引的原则:
1.超过300的行应该有索引;
2.经常出现在where语句中的字段,应该建立索引;
3.索引尽量建立在小字段上或者使用前缀索引;
4.经常多表连接查询的表,应该在连接字段上建立索引;
5.唯一性太差的字段不适合建立索引;
6.表更新速度过快,不适合建立索引;
事务(transation)
事务是一种机制,一个操作序列,包含了一组数据的操作语句,并且把所有语句作为整体进行操作;
主要用于处理操作量比较大,复杂度高的数据;
- mysql中使用Innodb存储引擎的表或库才可以支持事务;
- 事务处理可以用来维护数据库的完整性
- 事务用来管理 insert update delete
事务的ACID特性:
-
原子性(atomicity):事务是一个完整的整体操作,事务中的各个操作是不可分的,所以事务是以一个整体提交或回滚;
-
一致性(consistency):当事务完成以后,数据必须处于一致的状态;
开始之前:数据一致
开始之后:数据有可能不一致
完成之后:数据一致 -
隔离性(lsolation):数据对所有并发事务是彼此隔离的,以防多个事务并发执行时,由于交叉执行而导致数据不一致;
-
持久性(durability):不管系统发生了什么样的故障,事务的处理结果都是永久的;
事务的操作
在mysql中默认开启自动提交, 当执行SQL语句时事务便自动提交;
show variables like 'autocommit'; 查看当前是否是自动提交事务
自动提交 set autocommit=1;
手动提交 set autocommit=0;
永久修改事务提交:在mysql配置文件中的[musqld]下添加autocommit=1或0
1.事务处理命令控制事务
begin 开始事务 undo log insert into -->delete update -->update
commit 提交事务
rollback 回滚事务(撤销)