MySQL数据库基础知识点总结

目录

1 表的增删改查

 1.1 Create

1.2 Retrieve

1.3 Update

1.4 Delect

2 MySQL内置函数

2.1 日期函数

2.2 字符串函数

2.3 数学函数

2.4 其他函数

3 复合查询举例

4 内外连接

4.1 内连接

4.2 外连接

5 索引

5.1 创建索引

5.1.1 创建主索引

5.1.2 创建唯一索引

 5.1.3 创建普通索引

5.1.4 创建全文索引

5.2 查询索引

5.3 删除索引

6 事务管理

6.1 基本操作

6.2 事务操作注意事项

6.3 事务的隔离级别

6.4 事务的ACID特征

7 视图

7.1 概念

7.2 基本使用

7.3 视图规则和权限

8 用户管理

8.1 用户信息

 8.2 创建用户

8.3 删除用户

8.4 修改用户密码

8.5 给用户授权

8.6 回收权限

9 补充运算符

9.1 逻辑运算符

9.2 算数运算符


1 表的增删改查

CRUD:Create,Retrieve,Update,Delete

 1.1 Create

Create:
--创建一个学生表    
create table students(
    id int unsigned primary key auto_increment,//主键 唯一且不能为空
    sn int not null unique comment '学号',//唯一键
    name varchar(20) not null,
    qq varchar(11)
);--注意最后的分号
--单行数据+全列插入:
insert into students values(101,10001,'孙悟空','110010010');
--多行数据+指定列插入:
insert into students (id,sn,name) values(1)(102, 20001, '曹孟德'),(103, 20002, '孙仲谋');

--查看表结构
show create table table_name;

1.2 Retrieve

语法:
 select
   [distinct]{*|column,[,column]...}
   [from table_name]
   [where ...]
   [order by column[asc|desc],...] 
   limit...

-- 创建表结构 CREATE TABLE exam_result (    
   id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,    
   name VARCHAR(20) NOT NULL COMMENT '同学姓名',    
   yuwen float DEFAULT 0.0 COMMENT '语文成绩',    
   shuxue float DEFAULT 0.0 COMMENT '数学成绩',    
   yingyu float DEFAULT 0.0 COMMENT '英语成绩' );
 
-- 插入测试数据 INSERT INTO exam_result (name, yuwen, shuxue, yingyu) 
    VALUES('唐三藏', 67, 98, 56),
    ('孙悟空', 87, 78, 77),    
    ('猪悟能', 88, 98, 90),    
    ('曹孟德', 82, 84, 67),    
    ('刘玄德', 55, 85, 45),    
    ('孙权', 70, 73, 78),    
    ('宋公明', 75, 65, 30);
--全列查询
select * from table_name;
--指定列查询
select column,... from table_name;--也可以包含表达式:yuwen+10
--为查询结果指定别名
select id,sn,name,yuwen+shuxue+yingyu [as] 总分 from table_name;
--去重结果
select distinct shuxue from table_name;
where条件
--数学成绩是58或者59或者98或者99分的同学及数学成绩
select name,shuxue from exam_result where shuxue=58
  or shuxue=59
  or shuxue=98
  or shuxue=99;
select name,shuxue from exam_result where shuxue in(58,59,98,99);
--%匹配任意多个(包括0个)任意字符
--_匹配严格的一个任意字符
--若要查询总分在200分以下的同学
select name,yuwen+shuxue+yingyu as 总分 from table_name 
where yuwen+shuxue+yingyu < 200;  
--别名不能用在where条件中!!!!!
--null查询
select id,name from student where qq is not null;//查询qq不为空的学生id和name 
--结果排序
select name,shuxue from student_exam order by shuxue;//默认为升序
--order by 子句中可以只用别名

--筛选分页结果
--从第6条数据开始,根据id升序排序显示id和name,一页显示3条记录
select id,name,shuxue from exam_result order by id limit 3 offset 5;

1.3 Update

update exam_result set shuxue = 80 where name = '张三';
--不支持shuxue += 30这种语法
--没有where子句,则进行全表更新

1.4 Delect

--auto_increment会保留自增数据,不会因为数据被删除而置为0;但是drop表之后,该值会置为0
--语法:
delect from table_name [where...] [order by...] [limit...]

2 MySQL内置函数

2.1 日期函数

MySQL数据库基础知识点总结_第1张图片

-创建留言板
create table msg(
    -> id int primary key auto_increment,
    -> content varchar(30) not null,
    -> sendtime datetime);
--显示所有留言信息,发布日期只显示日期,不用显示时间
select content,date(sendtime) from msg;    
--查询在2分钟之内发布的帖子
select * from msg where date_add(sendtime,interval 2 minute)>now();

2.2 字符串函数

MySQL数据库基础知识点总结_第2张图片

注:
length函数返回字符串长度,以字节为单位。如果是多字节字符则计算多个字节数;
如果是单字节符则算作一个字节。中文表示多个字节数(与编码有关)

--将emp表中所有名字中有s的替换成‘上海’
select replace(ename,'s','上海'),ename from emp;
--截取emp表中ename字段的第二个到第三个字符
select substring(ename,2,2),ename from emp;
--以首字母小写的方式显示所有员工的姓名
select concat(lcase(substring(ename,1,1)),substring(ename,2)) as '姓名' from emp;

2.3 数学函数

MySQL数据库基础知识点总结_第3张图片

2.4 其他函数

--查询当前用户
select use();
--md5(str)对一个字符串进行md5摘要,摘要后得到一个32位字符串
select md5('admin');
--显示当前正在使用的数据库
select database();
--ifnull(val1,val2) 如果val1为null,返回cal2,否则返回val1的值

3 复合查询举例

--查询工资高于500或岗位为MANAGER的雇员,同时还要满足他们的姓名首字母为大写的J
select empno,ename from emp where (sal > 500 or job = 'MANAGER') and ename like 'J%';

--按照部门号升序而雇员的工资降序排序
select * from emp order by deptno,sal desc;

--使用年薪进行降序排序
select ename,sal*12+ifnull(comm,0) as '年薪' from emp order by 年薪 desc;

--显示工资最高的员工的名字和工作岗位
select ename,job from emp where sal = (select max(sal) from emp);

--显示工资高于平均工资的员工信息
select ename, sal from EMP where sal>(select avg(sal) from EMP);

--显示每个部门的平均工资和最高工资
select deptno, format(avg(sal),2),max(sal) from emp group by deptno;

--显示平均工资低于2000的部门号和它的平均工资
select deptno,avg(sal) from emp group by deptno having avg(sal) < 2000;

--显示每种岗位的雇员总数,平均工资
select job,count(*),avg(sal) from emp group by deptno;

注: where后面的语句进行比较时,要写select语句--即要判断比较的值是从哪里来的

4 内外连接

4.1 内连接

select ename, dname from EMP, DEPT where EMP.deptno=
DEPT.deptno and ename='SMITH';
--标准如下:
select ename, dname from EMP inner join DEPT on EMP.deptno=
DEPT.deptno and ename='SMITH';

4.2 外连接

--左外连接
select 字段名  from 表名1 left join 表名2 on 连接条件;--表1完全显示
--右外连接
select 字段名  from 表名1 right join 表名2 on 连接条件;--表2完全显示
-- 当左边表和右边表没有匹配时,也会显示左边表的数据 
select * from stu left join exam on stu.id=exam.id;

5 索引

索引特征:

不用加内存、不用改程序、不用调sql。只要输入正确的语句create index, 查询速度就可能提高成百上千倍。它的价值在于提高一个海量数据的检索速度。

索引说明:

占用磁盘空间,每次添加数据,除了添加到表中,还要维护二叉树,速度有影响, 但不大。需要分别对所要查询的字段建立索引。以空间换时间。

5.1 创建索引

5.1.1 创建主索引

主键索引的特点: 1.一个表中最多有一个主键 2.主键检索效率提高(主键不可重复) 3.不重复、不为空 主键索引的列基本上是int

-- 在创建表的时候,直接在字段名后指定 
create table  user1(id int primary key, name varchar(30));
-- 在创建表的最后,指定某列或某几列为主键索引 
create table  user2(id int, name varchar(30), primary key(id)); --可以指定多列
方式3:
create table  user3(id int, name varchar(30)); 
-- 创建表以后再添加主键 
alter table user3 add primary key(id);

5.1.2 创建唯一索引

唯一索引的特点: 1.一个表可以有多个唯一索引 2.查询效率高 3.如果在某一列建立唯一索引,必须保证这列数据不重复 4.如果一个唯一索引加上not null,等价于主键索引

--在表定义时,在某列后面直接指定unique唯一属性
create table user4(id int primary key,name varchar(30) unique);
--创建表时,在表的后面指定某列或某几列为unique
create table user5(id int primary key,name varchar(30) unique(name));
第三种方式:
create table user6(id int primary key,name varchar(30));
alter table user6 add unique(name);

 5.1.3 创建普通索引

普通索引特征: 1.一个表可以有多个普通索引,普通索引在实际开发中用的比较多 2.如果某列需要创建索引,但是有重复的值,那么我们就选择使用普通索引

--第一种方式:在表定义的最后,指定某列为索引
create table user8(id int primary key,name varchar(20),
email varchar(30),index(name));
--第二种方式:
create table user9(id int primary key,name varchar(20),
email varchar(30));
alter table user9 add index(name);
--第三种方式:
create table user10(id int primary key,name varchar(20),
email varchar(30),index(name));
cteate index idx_name on user10(name);

5.1.4 创建全文索引

注: 全文索引要求:存储引擎必须是MYSAM,并且默认的全文索引支持英文,不支持中文

--创建全文索引:
create table articles(
    id int unsigned auto_increment not null primary key,
    title varchar(20),
    body text,
    fulltext(title,body)
)engine=MYISAM;
--使用全文索引(查询有没有database数据)
select * from articles where match(title,body) against('database');
--用explain来分析这个sql语句
explain select * from articles where match(title,body)
against('database')\G
--如果key位置显示有数据,则说明用到了全文索引

5.2 查询索引

--方式一:
show keys from 表名
--方式二:
show index from 表名
--方式三:
desc 表名

MySQL数据库基础知识点总结_第4张图片

5.3 删除索引

--第一种方式-删除主键索引
alter table 表名 drop primary key;
--第二种方式-其他索引的删除
alter table 表名 drop index 索引名
--第三种方式
drop index 索引名 on 表名

6 事务管理

  • 通过版本号解决并发修改问题
  • 生产数据库要开启事务
  • 事务就是一组DML语句组成,这些语句在逻辑上存在相关性,这一组DML语句要么全部成功,要么全部失败,是一个整体。事务规定不同客户端看到的数据是不同的。

6.1 基本操作

--创建一个事务
start transaction;
--创建一个保存点
savepoint 保存点名;
--回滚到原始位置
rollback;
--回到保存点
rollback to 保存点名
--提交事务
commit;

6.2 事务操作注意事项

 1.innerDB支持事务,MYISAM不支持事务

2.如果一个事务被提交(commit)了,则不能回滚(rollback)

6.3 事务的隔离级别

让不同的事务在操作数据时,具有隔离性,从而保证数据的一致性

===无隔离性会产生的问题:3个

--脏读

一个事务读到了另一个事务没有提交的数据

--不可重复读

一个事务中,多次读到的数据不一样

--幻读

事务不是独立执行时发生的一种现象:例如对于第一个事务对一个表中的数据进行了修改, 这种修改涉及全部行(查询工资为1000的员工人数),同时,第二个数据向表中插入了 一行新数据。那么,第一次操作的事务发现表中还有没有修改的数据行,就好像发生了 幻觉一样

 备注:

不可重复读的重点是修改:同样的条件,再次读取发现值不一样 幻读的重点在于新增或者删除:同样的条件,第一次和第二次读出来的记录数不一样

--隔离级别:
read uncommited 读未提交
read commited 读已提交
repeatable read 可重复读
serializable 可串行化

MySQL数据库基础知识点总结_第5张图片

--设置事务的隔离级别
set session transaction isolation level read uncommited;
--查看当前的隔离级别:
select @@tx_isolation;

注:mysql默认的隔离级别是可重复读,一般情况下不要修改

6.4 事务的ACID特征

  • 原子性(Atomocity):事务中所有操作是不可分割的最小单元。事务中所有操作要么都执行成功,要么都执行失败
  • 一致性(Consistency):事务执行后,数据库状态和其他业务规则保持一致
  • 隔离性(Isolation):是指在并发操作中,不同事务应该隔离开来,使每个并发中的事务不会相互干扰
  • 持久性(Durability):一旦事务提交成功,事务中所有的数据操作都必须被永久保存到数据库中,即使提交事务后,数据库崩溃,在数据库重启时,也必须能保证通过某种机制恢复数据

7 视图

7.1 概念

视图是一个虚拟表,其内容由查询定义。视图可以理解成由表中的若干列组成。视图的数据变化会影响到基表,基表的数据变化会影响到视图。

7.2 基本使用

--创建视图
create view 视图名 as select语句;
eg:
    create view view_ename_dname as select ename,dname from emp,dept
    where emp.deptno = dept.deptno;
--删除视图
drop view 视图名; 

7.3 视图规则和权限

  • 视图名唯一
  • 创建视图数目无限制,但要考虑复杂视图创建之后的性能影响
  • 视图不能添加索引
  • 视图可以提高安全性,必须具有足够的访问权限
  • order by子句若在视图和select语句中同时出现,则select语句中的order by 会覆盖视图中的语句
  • 视图和表可以一起使用

8 用户管理

对于root用户,它可以操作数据库中的所有数据库和表,但是如果别人知道了数据库密码,在很大程度上存在安全隐患,所以,我们需要对用户进行管理

8.1 用户信息

MySQL中的用户,都存储在系统数据库mysql的user表中

字段解释:

host:表示这个用户可以在哪个主机登录,如果是localhost,表示只能从本机登录

user:用户名

authentication_string:用户密码通过password函数加密

*_pri:用户拥有的权限

 8.2 创建用户

--语法:
create user '用户名'@'登录主机/ip' identified by '密码';
eg:
    create user 'litao'@'localhost' identified by '123456';

8.3 删除用户

--语法:
drop user '用户名'@'主机名';

MySQL数据库基础知识点总结_第6张图片

8.4 修改用户密码

--自己改自己
set password = '新的密码';
--root用户修改指定用户的密码
set password for '用户名'@'主机名'=password('新的密码');
eg:
    set password for 'litao'@'localhost'=password('abcd');

8.5 给用户授权

刚创建的用户没有任何权限,需要给用户授权

--语法:
grant 权限列表 on 库.对象名 to '用户名'@'登录位置' [identified by '密码']

注:如果发现赋值权限后,没有生效,在root窗口下执行如下命令:
flush privileges;

8.6 回收权限

--语法:
revoke 权限列表 on 库.对象名 from '用户名'@'登录位置';
eg:
    --回收litao对数据库的所有权限
    revoke all on mytest.DEPT from 'litao'@'localhost';

9 补充运算符

9.1 逻辑运算符

MySQL数据库基础知识点总结_第7张图片

9.2 算数运算符

MySQL数据库基础知识点总结_第8张图片

 

 

若有错误, 还请指正, 共同学习, 共同进步! !

你可能感兴趣的:(数据库)