数据库是一个存在于应用层的网络服务器,它类似于一个文件系统,使用户或用户程序更方便地管理系统上的文件。
数据库还是要自己去访问文件的
数据库也是用文件的方式进行数据保存的
数据可中直接和文件打交道的,是数据库的存储引擎

数据定义语言,用来维护存储数据的结构。如:create、drop、alter等
数据操纵语言,用来对数据进行操作。如:insert、delete、update等
DML中又单独分了一个DQL,数据查询语言,如:select。
数据控制语言。主要负责权限管理和事务。
如:grant、revoke、commit等
创建数据库:create database 库名;
显示创建语句:show show create database 库名;
删除数据库:drop database 库名;
查看数据库:show databases;
修改数据库:alter database 库名 charset=字符集/collation=校验规则;对数据库的修改主要指修改数据库的字符集、校验规则。
字符集指编码规则,校验规则指解码规则。
校验规则如:utf8_general_ci(不区分大小写),utf8_bin(区分大小写)
查看系统默认字符集以及校验规则
show variables like 'character_set_database';
show variables like 'collation_database';
查看数据库支持的字符集
show charset;
查看数据库支持的字符集校验规则
show collation;
备份库:mysqldump -uroot -p -B 库名 ... > 需要备份到的路径;备份数据库时,如果没有带-B参数,在恢复数据库时,需要先创建空数据库,然后使用数据库,再使用source来还原。
备份表:mysqldump -uroot -p 库名 表名 ... > 需要备份到的路径;
还原:source 完整路径;
语法:show processlist;
create table 表名 (
field1 datatype,
field2 datatype,
field3 datatype
) character set 字符集 collate 校验规则 engine 存储引擎;
desc 表名;
drop table 表名;
添加列:alter table 表名 add 列名 类型, ... (after 列名);
修改列:alter table 表名 modify 列名 类型, ...;
删除列:alter table 表名 drop 列名;
当插入的数据不合法时,MySQL会直接报错,中断本次操作。

set类型表示一个集合,对应的数据可以是set里面的多个元素。
enum类型表示枚举,对应的数据只能是enum中的一个元素。
1.datetime占用8字节,timestamp占用4字节。
2.对含有timestamp类型列的某行数据做任何操作,都会更新timestamp到当前时间。
约束是指强迫我们做出的操作符合某些条件,来保证数据的合法性。
对应的字段不能为空。
默认值,插入时如果我们没有指定值,该列对应的字段会使用default中的值。
列描述,用来在创建表时,标识字段的含义。
配合数据类型后面的长度使用,当未达到对应长度时,会用 '0' 来填充。
主键,用来唯一地约束该字段里面的数据,不能为空,不能重复,一张表中至多有一个主键。主键所在列通常时int类型。
唯一键,与主键类似,用来唯一地约束该字段里面的数据不能重复。
自增长,若一张表的某个字段被标识auto_increment,那么这张表就会保存auto_increment的值,为当对应的字段中的最大值+1,当对应字段不给值时,会自动将auto_increment中的值赋给该字段。通常搭配主键使用。
特点:
任何一个字段要设置自增长,前提是本身是一个索引。
自增长字段必须是整数。
一张表至多存在一个自增长。
外键,用于定义主表和从表之间的关系,外键对应的字段必须是另一张表的主键或唯一键,外键对应字段中的值,必须在主表中存在。当从表中外键对应字段若存在值,则主表无法删除对应字段的数据。
1.主键在一张表中至多有一个,唯一键在在一张表中可以有多个。
2.主键对应的字段不能为空,而唯一键对应的字段可以为空,为空的字段不做比较。
3.主键更多的是标识唯一性的,唯一键则更多保证不要和别的信息重复。
外键是用来实现表和表之间约束的关系。
外键约束是用来强约束表之间的关系,是通过外键来实现的
insert into 表名 values (值...);
insert into 表名 (列名...) values (值...), (值...);
insert into 表名 (列名...) values (值...) on duplicate key update 列名=值, ...;
replace into 表名 (列名...) values (值...);
若主键或唯一键没有冲突,直接插入,若冲突,则删除后再插入。
select * from 表名;
select 列名, 列名, ... from 表名;
select 列名+... from 表名;
select 列名 as 别名 from 表名;
select distinct 列名 from 表名;
select 列名 from 表名 where 条件;
select 列名 from 表名 where 列名 is null;
select 列名 from 表名 where 列名 is not null;
select 列名 from 表名 order by 列名 desc;降序
select 列名 from 表名 order by 列名 asc;升序
select 列名 from 表名 [where 条件] [order by 列名] [limit n];从0开始选n条结果。
select 列名 from 表名 [where 条件] [order by 列名] [limit s, n];从s开始选n条结果。
select 列名 from 表名 [where 条件] [order by 列名] [limit n offset s];从s开始选n条结果。
update 表名 set 列名=值 [where 条件] [order by 列名] [limit n offset s];
delete from 表名 [where 条件] [order by 列名] [limit n offset s];
truncate 表名;
与delete的区别
1.只能对整表操作,不能针对部分数据操作。
2.实际上mysql不对数据操作,所以比delete更快,但truncate删除数据的时候,不经过真正的事务,无法回滚。
3.会重置auto_increment项。
先执行select,把查询出来的结果插入到一张表中,需要表的结构与查询结果一致。
insert into 表名 select 列名 from 表名;
count()、sum()、avg()、max()、min()。
将查询结果按照指定列分组。
select 列名 from 表名 group by 列名;
where与having的区别
where在查询结果前执行,用来筛选数据。having在查询结果后执行,用来对结果进行过滤。
having经常和group by搭配使用。


user(),查询当前用户。
md5(str),对一个字符串进行md5摘要,摘要后得到一个32位字符串。
database(),显示当前正在使用。
password(),MySQL数据库使用该函数对用户加密。
ifnull(val1, val2),如果val1为null,返回val2,否则返回val1的值。
当对多表进行查询时,表之间通常存在外键约束,表中的数据会做笛卡尔积,此时需要使用where条件过滤出有效数据。
例:显示雇员名、雇员工资以及所在部门的名字。
select emp.ename, emp.sal, dept.dname from emp, dept where emp.deptno=dept.deptno;
指在同一张表连接查询。
例:显示员工FORD的上级领导的编号和姓名(mgr是员工领导的编号--empno)。
select leader.empno, leader.ename from emp leader, emp worker where leader.empno = worker.mgr and worker.ename='FORD';
例:显示SMITH同一部门的员工。
select * from emp where deptno = (select deptno from emp where ename='smith')
in关键字
例:查询和10号部门的工作岗位相同的雇员的名字,岗位,工资,部门号,但是不包含10自己的。
select ename,job,sal,deptno from emp where job in(select distinct job from emp where deptno=10) and deptno!=10;
all关键字
例:显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号。
select ename, sal, deptno from EMP where sal > all(select sal from EMP where deptno=30);
any关键字
例:显示工资比部门30的任意员工的工资高的员工的姓名、工资和部门号(包含自己部门的员工)
select ename, sal, deptno from emp where sal > any(select sal from emp where deptno=30);
例:查询和SMITH的部门和岗位完全相同的所有雇员,不含SMITH本人。
select ename from emp where (deptno, job)=(select deptno, job from emp where ename='smith') and ename!='smith';
例:显示每个高于自己部门平均工资的员工的姓名、部门、工资。
select ename, deptno, sal from emp, (select avg(sal) as avg_sal, deptno from emp group by deptno) as tmp where emp.deptno=tmp.deptno and emp.sal > avg_sal;
union
该操作符用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中的重复行。
例:显示每个高于自己部门平均工资的员工的姓名、部门、工资、平均工资。
select ename, sal, job from EMP where sal>2500 union select ename, sal, job from EMP where job='MANAGER';
union all
该操作符用于取得两个结果集的并集。当使用该操作符时,不会去掉结果集中的重复行。
例:显示每个高于自己部门平均工资的员工的姓名、部门、工资、平均工资。
select ename, sal, job from EMP where sal>2500 union all select ename, sal, job from EMP where job='MANAGER';
内连接实际上就是利用where子句对两种表形成的笛卡尔积进行筛选,之前的查询都是内连接。
语法:select 列名 from 表1 inner join 表2 on 连接条件 and 其他条件;
使用多表查询,左侧的表完全显示,就称为左外连接。以左边为主,如果左表中的字段在右表中不存在,结果会以null的形式显示。
语法:select 列名 from 表1 left join 表2 on 连接条件 and 其他条件;
使用多表查询,右侧的表完全显示,就称为右外连接。以右边为主,如果右表中的字段在左表中不存在,结果会以null的形式显示。
语法:select 列名 from 表1 right join 表2 on 连接条件 and 其他条件;