数据库知识整理
什么是数据库
用于存储和管理数据的仓库
数据库特点
1.持久化存储数据;
2.方便存储和管理数据;
3.使用了统一的方式操作数据库–SQL。
SQL的概念:
结构化查询语言(Structured Query Language)简称SQL,是一种数据库查询语言。
MYSQL
是一个关系型数据库管理系统。
数据库三大范式
第一范式:每个列都不可再拆分。
第二范式:在第一范式的基础上,非主键完全依赖于主键,而不是只依赖一部分。
第三范式:在第二范式的基础上,非主键只依赖于主键,二部依赖于其他非主键。
在设计数据库时,尽量遵守三大范式,如果不遵守,要有足够的理由,比如性能。
数据类型
1.整数类型:int:整数(32位二进制);smallint:小的整数(16位二进制)。
2.小数类型:double:双精度浮点数;float 单精度浮点数。
3.日期: date:只包含年月日,yyyy-MM-dd
datetime:包含年月日时分秒,yyyy-MM-dd HH:mm:ss
timestamp:尽量使用timestamp,空间效率高于datetime。
4.字符串类型:char(定长)、varchar(存储可变长字符串)。
DDL操作数据库和表
1.创建:
创建数据库:
create database 数据库名称;
创建表:
create table 表名(
列名1 数据类型1,
列名2 数据类型2,
...
列名n 数据类型n
);
2.查询
查询所有数据库名称:
show database;
查询某个库中所用表的名称:
show tables;
查询表结构:
desc 表名;
3.修改
修改数据库的字符集
alter database 数据库名称 character set 字符集名称;
修改表名
alter table 表名 rename to 新的表名;
添加一列:
alter table 表名 add 列名 数据类型;
删除一列:
alter table 表名 drop 列名;
4.删除
删除数据库:
drop database 数据库名;
删除表:
drop table 表名;
5.使用数据库
查询当前正在使用的数据库名称
select database();
使用数据库
use 数据库名称;
DML数据操纵语言
1.添加数据
insert into 表名(列名1,列名2,...列名n) values (值1,值2,...值n);
1).列名和值要一一对应。
2).如果表名后,不定义列名,则默认给所有列添加值。
insert into 表名 values(值1,值2,...值n);
2.删除数据
delete from 表名 (where 条件);
3.修改数据
update 表名 set 列名1 = 值1,列名2 = 值2,...(where 条件);
DQL数据库查询语言
语法:
select
字段列表
from
表名列表
where
条件列表
group by
分组字段
having
分组之后的条件
order by
排序
limit
分页限定
1.查询表中所有内容
select * from 表名;
2.基础查询
1)多字段查询
select 字段名1,字段名2...from 表名;
2)去除重复
distinct
3.条件查询
where子句后跟条件。
4.排序查询
order by 排序字段1 排序方式1,排序字段2 排序方式2...
ASC:升序,默认的
DESC:降序
5.聚合查询:将一列数据作为一个整体,进行纵向的计算。一般选择非空的列
count 计算个数
max:计算最大值
min:计算最小值
sum:计算和
avg:计算平均值
select 属性1,count(*) from 表名;
6.分组查询
语法:group by 分组字段
where 和 having的区别?
where 在分组之前进行限定,如果不满足条件,则不参与分组。having在分组之后进行限定,如果不满足结果,则不会被查询出来。
where 后不可以跟聚合函数,having可以进行聚合函数的判断。
7.分页查询
语法:limit开始的索引,每页查询的条数;
公式:开始的索引 = (当前的页码 - 1) * 每页显示的条数
–每页显示3条记录
SELECT * FROM student LIMIT 0.3; --第1页
SELECT * FROM student LIMIT 3.3; --第2页
SELECT * FROM student LIMIT 6.3; --第3页
约束
对表中的数据进行限定,保证数据的正确性、有效性和完整性。
1.主键约束:primary key :用于控件字段内容不能重复,但它在一个表只允许出现一个。
2.非空约束:not null
3.唯一约束:unique: 控件字段内容不能重复, 一个表允许有多个 Unique 约束。
4.外键约束:foreign key
自动增长:auto_increment
create table stu(
id int primary key auto_increment,
name varchar(20)
);
子查询
1.条件:一条SQL语句的查询结果做为另一条查询语句的条件或查询结果
2.嵌套:多条SQL语句嵌套使用,内部的SQL查询语句称为子查询。
三种情况
1.子查询是单行单列的情况:结果集是一个值,父查询使用:=、 <、 > 等运算符
-- 查询工资最高的员工是谁?
select * from employee where salary=(select max(salary) from employee);
2.子查询是多行单列的情况:结果集类似于一个数组,父查询使用:in 运算符
-- 查询工资最高的员工是谁?
select * from employee where salary=(select max(salary) from employee);
3.子查询是多行多列的情况:结果集类似于一张虚拟表,不能用于where条件,用于select子句中做为子表
-- 1) 查询出2011年以后入职的员工信息
-- 2) 查询所有的部门信息,与上面的虚拟表中的信 息比对,找出所有部门ID相等的员工。
select * from dept d, (select * from employee where join_date > '2011-1-1') e where e.dept_id = d.id;
– 使用表连接:
select d., e. from dept d inner join employee e on d.id = e.dept_id where e.join_d