目录
一、数据库相关的定义
二、常用数据库命令:
10、在window操作系统中,怎么使用命令来启动和关闭MySQL服务?
数据库的基本单元是表(table)
三、关于SQL语句的分类
四、简单查询
五、条件查询
小知识点:
like 称 模糊查询,支持%或下划线匹配
六、排序
数据处理函数(单行处理函数):
七、分组查询****
八、连接查询
连接查询的分类 :
九、外连接
3、多表联查:
4、子查询
十. union合并查询结果集(将匹配次数从乘法变成加法)
十一、limit是将查询结果集的一部分取出来,通常使用在分页查询中
十二、DDL 语句
1、表的创建
关于MySQL的数据类型:
2.删除表
十三、DML语句
1.插入数据insert
1、 insert 插入日期
2、date和datetime类型的区分?
2、修改数据update(DML)
3、删除数据delete(DML)
十四、创建表的约束(Constraint) 为了保证表中数据的有效性
1、关于创建表的约束的小问题
什么时候使用表级约束呢?
主键特征:
十五、存储引擎(了解)
十六、事务(transaction内须掌握且精通的)
1、事务的基本概念
2、事务的4个特性
事务之间的隔度级别:
十七、索引(底层原理:B-Tree)
索引的实现原理:
什么时候添加索引:
4、索引的创建删除
索引失效:
1、select * from 表 where 字段 like ’%I‘;
2、使用or的时候会失效,如果使用or,那么要求两边的条件字段要索引,才会走索引。如果是一个有,一个没有, 那么另一个字段上的索引也不会实现。
3、使用复合索引时、没有使用左侧的列查,索引失效。
4、在where当中索引列参加运算,索引失效。
5、在where中索引列使用了函数。
十八、视图(View)
1、创建、删除视图对象:
2、用视图做什么?
3、视图在实际开发的作用?(方便、简化开发、利于维护)
4、DBA:
十九、数据库设计的三范式(面试经常问)
1、数据库设计范式:
注意事项★:
数据库(Database)按照一定格式存储数据的一些文件的组合。(存储数据的仓库实际上就是一堆文件。这些文件中存储了具有特定格式的数据)。
数据库管理系统(DBMS)是专门用来管理数据库中的数据,其可以对数据库中的数据进行增删改查。
SQL结构化查询语言 程序员通过写SQL语句,然后DBMS执行SQL语句,来实现数据库中的数据进行增删改查(SQL、Database、DBMS这三者之间的关系)
SQL、Database、DBMS这三者之间的关系:DBMS—(执行)—>SQL—(操作)—>DB
1、查看MySQL版本号:select version();
2、查看当前使用的数据库:select database();
3、查看所有数据库:show databases;
4、使用某个数据库:use 数据库名;
5、创建数据库:create database 数据名;
6、退出数据库:exit
7、导入数据:source 数据所在路径(不要有中文)
8、查看表结构:desc 表名;
9、进入数据库:mysql -hlocalhost -uroot -p密码
关闭语法:net stop 服务名称
开启语法:net start 服务名称
行(row)被称为数据/记录
列(colum)被称为字段
DQL:数据查询语言;凡是带有select都是数据查询语言
DML:数据操作语言;凡是对表中数据进行增删改的都是DML(insert、delete、update)
DDL:数据定义语言;凡是create、drop、alter的语句都是DDL
TCL:事务控制语言;事务提交commit、事务回滚rollback
DCL:数据控制语言;例如授权grant、撤销权限revoke...
1、查询一个字段:select 字段名 from 表名;
2、查询两个或多个字段:select 字段1、字段2、... from 表名;
select * from 表名;(效率低,可读性差)
3、给查询的列取别名:select 字段名 as 别名 from 表名;(注:只在查询时显示别名,原表的字段名不变)
注意:在所有数据库中,字符串统一使用单引号括起来,单引号才是标准
字段可直接在语句中进行加减乘除的运算
什么是条件查询?不是将表中所有数据查询出来,而是查询出符合条件的。
语法格式:select 字段1,字段2,...
from 表名
where 条件;
注意:在数据库中,null不能使用等号进行衡量;需要用is null;因为null在DB中代表什么也没有,它不是一个值,所以不能使用等号来衡量。
and和or同时出现时,要注意优先级问题;and比or优先级高
in相当于多个or同时出现:
select * from 表 where sal in(800,1500);(其中()不是区间,只表示800 or 1500) select * from 表 where sal=800 or sal=1500;
not是取反,多用于is not null、not in()
%匹配任意多个字符(%是一个特殊符号)
下划线,一个下划线只匹配一个字符
select * from 表 where like ‘%O%’(包括O的)
select * from 表 where like ‘O%’(O开头的)
select * from 表 where like ‘%O’(O结尾的)
select * from 表 where like ‘_A’(第二个字母为A的)
语法:select 字段1,...
from 表名
order by 可排序的字段名;(默认是升序)
指定降序:select 字段1,... from 表名 order by 可排序的字段名 desc;
指定升序:select 字段1,... from 表名 order by 可排序的字段名 asc;
可以两个或多个字段排序吗?可以;但是前一个是主导。
一般都是在select之后和from之前写并应用函数 。
特点:一个输入对应一个输出。
与单行处理函数相对的是多行处理函数,其特点是多个输入对应一个输出。
lower(字段名) 转小写 upper(字段名) 转大写
substr(字段名/字符串,起始下标,截取长度) 注意:起始下标从1开始
concat(字符串1,字符串2) 进行字符串的拼接
length(字段) 取长度
trim() 去除字符串前后的空格
round(字段,0) 如果是0则保留整数位,-1保留到十位,1保留到一位小数位,-2保留百位,2保留两位小数
rand() 生成随机数
ifnull(数据,替换的值)可以将null转化成一个具体值,是空处理函数,专门处理空的。
在数据库中只要有null参与的数字运算,最终结果都是null
分组函数(多处理函数)
分组函数在使用的时候必须先进行分组,然后才能使用。
如果你没有对数据进行分组,整张表默认为一组 。
count(字段) 计数 avg(字段) 平均值
min(字段) 最小值 sum(字段) 求和
max(字段) 最大值
分组函数需要注意哪些?
1、分组函数自动忽略null,你不需要提前对null进行处理
2、count(*)和count(字段)的区别:
count(*):统计表中的总行数(只要有一行数据count++)
count(字段)统计该字段下所有不为null的元素的总数
3、分组函数不能直接使用在where子句中
4、所以的分组函数可以组合在一起使用
1、语法:select ... from .... group by ...
结论:在一条select语句中,如果有group by语句的话,select后面只能跟参加分组的字段以及分组函数,其他一律不能跟。因为无意义且可能导致报错。
2、使用having可以对分完组之后的数据进一步过滤,不能单独使用having,必须和group by联合使用,having不能代替where。
优化策略 where和heaving优先选择where,where实在完成不了再选择heaving。
去除重复记录:原表数据不会被修改,只是查询结果去重 。
去重需要使用关键字 distinct(可用在分组函数中 )
Distinct只能出现在select之后,以及所有字段的最前方。
如果distinct是在两个或多个字段的前方,则表示两个或多个字段联合去重。
从一张表中单独查询称为单表查询。
多张表联合查询成为连接查询 。
年代:SQL92、SQL99(重点学习)
表连接的分类:
内连接:等值连接、非等值连接、自连接
外连接:左外连接、右外连接
全连接 :两个或多个表都是主表
1、当两张表在没有任何条件限制的条件下,最终查询结果条数是两张表条数的乘积(笛卡尔积现象)
2、避免笛卡尔积现象:连接时加条件,满足条件的被筛选出来,(查询次数还是在连接查询中,一定要注意效率问题,在查询两个表中的两个或多个字段时,字段前一定要加上表名(表名.字段名)
注意:通过迪卡尔积现象知,表的连接次数越多效率越低,尽量避免表的连接次数
SQL92语法:select ... from 表1,表2 where 连接条件 and ...
SQL99语法:select ... from 表1 join 表2 on 连接条件;
SQL92语法缺点:结构不清晰,表的连接条件和后期进一步筛选的条件都放在了where后面
SQL99语法缺点:表连接的条件是独立的,连接之后若还需要进一步筛选,再往后添加where即可。
外连接中,表之间存在主次关系。
1、语法:select * from 表1 right join 表2 on 连接条件
2、right : 表示将join关键字右边的看作主表,主要是为了将这张表的数据全部查询出来,捎带关联查询左边的表。
语法: select ... from 表1 join 表2 on 连接条件 join 表3 on 连接条件 join 表4 on 连接条件;
sekct语句中嵌套select 语句,被嵌套select 语句 称子查询
语法:select .....(select).....from .....(select).....where......(select)
where 子查询:当有筛选条件中需要用分组函数时,则可以使用子查询来实现
from 子查询:注意: from后的子查询,可以将子查询结果当做一张临时表
selec子查询(了解即可)
union的效率集更高些,对于表连接来说,每连接一次新表,则匹配的次数满足笛卡尔积,但是union可以减少匹配的次数。在减少匹配的次数的情况下,还可以完成两个结果的拼接。
语法:select 字段1,字段2 from 表 where 查询条件
union
select 字段1,字段2 from 表 where 查询条件2
union的注意事项: 1、union在进行结果集合并的时候,要求两个结果集的列数相同;2、如果合并查询的字段类型不统一,则MySQL可以,oracle不可以,会报错,即结果集合并时列和列的数据类型也要一致。
完整用法:limit startIndex,length;
缺省用法: limit limit 5; 取前5
注:MySQL中limit在order by之后执行!!!
语法:select 字段 from 表 order by desc limit xxxx;
公式: limit (pageNo -1)*pageSize,pageSize;
DQL顺序总结:
from\ where\ group by\ heaving\ select \ order by\ limit
(建表属于DDL 语句,DDL包括:create 、drop、alter)
语法格式:create table 表名 (字段名1 数据类型,
字段名2 数据类型,
字段名3 数据类型,
);
varchar(可变长度字符串,最长255) double
char (定长长度字符串) (长255) date短日期类型
int (最长11) datatime长日期类型
bigint clob字符大对象(最多可以存储4G的字符串)
float blob 二进制大对象(专门储图片、声音视频等流媒体)
语法:
drop table 表名; //如果表不存在,则报错
drop table if exists 表名;//不存在也不会报错
语法格式:
insert into 表名(字段名1,...,字段名n) values(值1,....,值n);
注:字段名和值一一对应,即数量要对应,数据类型要对应。
insert语句但凡是执行成功了,那必然会多一记录
没有给字段名值, 则默认为null
insert的字段名全省掉,等于对应 的value都写上。
str_to_date:将字符串varchar类型转换为date类型 str_to_date('字符串日期','日期格式')
date_format:将date类型转换为特定格式的varchar类型。
MySQL的日期格式:%Y年,%m月,%d日,%h时,%i分,%s秒
date 短日期:包括在日信息(%Y- %M-%d)
datetime是长日期:包括年月日时分秒信息,(%Y- %M-%d %h:%i:%s)
在MySQL中,怎么获取系统当前时间: now()函数 一> 得到的时间datetime类型
语法格式:update 表名 set 字段名1:值1,字段名2:值2,...,where 条件;
注:没where限制条件,会导致所有数据全部更新
语法: delete from 表 where 条件;
注:没有限制条件,整张表的数据全删除。
表中的数据被删除了,但是这个数据在硬盘上的真实存储空间不释放。
缺点:删除效率低
优点:支持回滚,后悔了可以在恢复数据。
快速创建表: create table 表 as select * from 表;
原理:将一个查询结果当做一张表新建!相当于完成一张表的快速复制。
快速插入 :insert into 表 select * from 表2;
truncate语句删除原理:(物理删除) 缺点、不支持回滚;优点:快
truncate table 表名( DDL);
非空约束: not null 约束的字段不能为null ——>只有列级约束,没有表级约束
唯一性约束: unique 约束的字段不能重复,但可以为null
主建约束(只有一个):Primary Key (简PK)任何一张表都应该有主键, 没有主键,表无效
外键约束:Foreign Key(简FK)
检查约束: check (MySQL不支持,oracle支持)
需要给多个字段联合起来添加某一个约束时,才使用表级约束
在MySQL中如果一个字段同时被not null 和 unique约束的话,该字段自动变成主键字段(oracle不一样)
not null + unique(有单一主键,也有复合主键,一般情况下,但单一主键用的多一点)
外键约束:foreign key (字段名) reference 另一表(字段)
外键值可以为null;子表中的外键引用的父表中的某一字段,被引用的这个字段不一定是主键,但至少有unique约束。
存储引擎是一个表存储/组织数据的一种方式;不同的存储引擎,表的存储数据的方式不同(存储引擎是MySQL中特有的一个术语,其他数据库没有)。
在建表的时候可以在最后小括号的')'的右边使用:
engine用来指定存储引擎
charset来指定这张表的字符编码方式。
结论:MySQL默认的存储引擎是 InnoDB;默认字符编码utf-8
在MySQL中,用来查看搜索引擎有哪些:show engines \G
存储引擎类别:
MyIsAM(节省空间) :格式文件 (存储表结构的定义)mytable.frm
数据文件(存储表行的内容) mytable.MYD
索引文件(存储上索引) mytable.MYI
InnoDB : MySQL默认搜索引擎; InnoDB支持事物支持数据库崩溃后自动恢复机制。
InnoDB的特点:非常安全。
MEMORY :优点:查询效率非常高(快)
缺点:不安全,关机之后数据自动消失(因为数据和索引在内存当中)
事务是一个完整的业务逻辑,是一个最小的工作单元,不可再分
有DML语句才会有事务,其它语句和事务无关! (insort、delete、update)
事务的本质:一个事务本质上就是多条DML语句同时成功或同时失败。
提交事务(commit): 清空事务性活动日志文件,将数据全部彻底持久化到数据库表中。提交事务标志着事务的结束。并且一种全部成功的结束。
事务回滚 (rollback):将之前所有DML操作全部撤销,并且清空事务性活动的日志。事务回滚标志着事务的结束,并且是种全部失败的结束。
提交事务: commit; 语句
回滚事务: rollback; 语向(回滚永远只能回滚到上一次的提交点)
在MySQL中,默认情况下是支持自动提交事务的(commit),即每执行一条DML语句,则提交一次; 一> 一般不符合开发的机制,一般在start transation; 之中进行.
关闭MySQL中的自动提交机制: start transation;
A原子性:说明事务是最小的工作单元,不可再分。
C一致性:所有事务要求,在同一个事务中,所有操做必须同时成动或同时失败,保证数据的一致性
I隔离性:A事务与B事务之间具有一定的隔离.
D持久性:事务结束的保障,事务提交就相当于将没有保存到硬盘上的数据,保存到硬盘上。
读未提交:read uncommitted (最低的隔离级别)即事务A可以读到事务B未提交的数据。(“脏读数据" (没什么用,一般从read committed)
读已提交:read committed解决"脏读“,但不可重复读取据(前后读的数据不一致)
可重复读: repeatable read A开启,不管多久A读到的数据都是一致的,即使B修改并提交了数据,A读的不变,可重复读。(存在"幻读"数据)
序列化:Serializable(最高的隔离级别):效率最低,解决所有问题,事务不排队,不能并发。
索引是在数据库表中的字段上添加的,是为了提高查询的效率存在的一种机制。索引相当于一本书的目录,是为了缩小扫描的范围而存在的一种机制。
一张表的字段可以添加一个索引,多个字段联合起来也可以添加索引。
提醒1:在任何数据库中,主键(PK)上都会自动添加索引对象。在MySQL中,一个字段上如果有unique约束的话,也会自动创建索引对象。
提醒2:在mysql中,任何一张表的任何一张记录,在硬盘存储上都有一个硬盘的物理存储编号。
提醒3:在mysql中,索引是一个单独的对象,不同的存储引擎以不同的形式存在。在MyIsAM中,索引存储在一个.MYI文件中。 在InnoDB中,索引存在一个逻辑名称 叫做tablespace中。在MEMOKY中,索引存在内存中。不管索引存在哪。在MySQL中都是一个树的形式存在。平衡二叉树(B-Tree)
1.数据量庞大(就设置而言)
2.该字段经常出现在where 的后面(即以条件的形式存在)
3.该字段很少的DML操作(因在DML之后,索引要重新排序)
建议不要随意添加索引,因为索引也需要维护,太多反而降低系统性能;建议通过主键 或 unique 进行索引查询,效希高。
创建: create index 索引名 on 表(字段);
删除: drop index 索引名 on 表;
在Mysql中查看是否使用了索引: explain select * from 表 whete 条件1;
即使字段上加了索引,不会索引,因为模糊匹配当中以%开头(索引失效)尽量避免模糊查询时以%开始,这是优化的手段。
复合索引:两个字段或更多字段联合起来添加一个索引。
create index 索引名 on 表(字段1,字段2);//字段1可用索引查,字段2不可用字段查
explain select * from 表 where 字段+1=xxx; //无索引
explain select * from 表 where lower(字段)=“ ”; //索引失效
索引是各种数据库进行优化的重要手段,优化的时候优先考虑的就是索引
索引类别:单一索引,复合索引,主键索引、唯一性索引......
注:唯一性比较弱的字段,添加索引用处不大。
view: 站在不同的角度去看待同一份数据。
创建: create view 视图名 as select * from 字段;
删除: drop view 视图名:
注:只有DQL才能以view的形式创建:create view 视图名 as DQL语句;
面向视图对象进行增删改查,对视图对象的增删改查,会导致原表被操作(视图的特点:通过对视图的操作会对原表造成影响。)。
如果在一个非常复杂的SQL语句,需要在不同的位置反复使用,就可以把这个复杂的SQL语句以视图对象的形式新建,简化开发,利于后期维护。
面向视图开发,使用视图时可以像table一样,可对视图进行增删改查,一般都说CRUD。
C:create 增 R:retrive 查;检索
U:update 改 D:delete 删
重点掌握:数据的导人和导出(数据的备份)
数据库的导出:在window的dos命令窗口下:musqldump 数据库名 > 存放路径 -uroot -p密码;
导出指定表: mysqldump 数据库名 表名 > 存放路径 -uroot -p密码;
数据库的导入:
注:要先登录到mysql数据库服务器上,然后创建数据库:create database 数据库名;
使用数据库:use 数据库名;
然后初始化数据库: source 路径;
数据库表的设计依据。教你怎么进行数据库表的设计。
第一范式:要求任何一张表必须有主键,每个字段原子性不可再分。
第二范式:建立在第一范式的基础之上,要求所有非主键字段完全依赖主键,不要产生部份依赖。
第三范式:建立在第二范式的基础之上,要求所有非主键字段直接依赖主键,不要产生传递依赖
按以上的范式进行,可避免表中数据的冗余以及空间的浪费。
第一范式:(最核心、最重要的范式,所有表的设计都要满足)
第二范式口诀:多对多怎么设计?多对多,三张表,关系表两外键...
第二范式口诀:一对多怎么设计? 一对多,两张表加外键
第二范式口诀:一对一怎么设计? 一对一,外键唯一 (unique)
(面试说,会显得自己不那么初级)
数据库设计三范式是理论上的,实践和理论可能有偏差。最终目的是为了满足客户需求,有时可能拿冗余换速度。因为在MySQL中,表与表之间的连接次数越多,效率越低(笛卡尔积),这对开发人员来说,SQL语句的编写难度也会降低。