数据库
定义
数据库是持久存储有组织可共享数据的容器
分类:
关系型数据库:MySQL、Oracle、SQL Server、SQLite、DB2
非关系型数据库:Redis、MongoDB
数据库管理系统
定义
数据库管理系统是操作和管理数据库的软件
包括:
MySql Oracle DB2
SQL分类
存储引擎
定义
存储引擎是给数据库提供数据存储、处理和保护等核心服务的程序
包括:
InnoDB MyISAM
注:MySQL5.5后的默认存储引擎为InnoDB
两个存储引擎的区别
数据库操作的语法
创建数据库: CREATE DATABASE [IF NOT EXISTS] 数据库名;
查看数据库: SHOW DATABASES;
使用数据库: USE 数据库名;
删除数据库: DROP DATABASE [IF EXISTS] 数据库名;
数据表字段操作的语法
创建表语法(create 属于ddl)
CREATE TABLE [ IF NOT EXISTS ] 表名
(
字段名1
数据类型 [属性],
字段名2
数据类型 [属性],
… …
字段名n
数据类型 [属性]
) ;
设置存储引擎和指定数据表编码格式:
CREATE TABLE [ IF NOT EXISTS ] 表名
(
字段名1
数据类型 [属性],
字段名2
数据类型 [属性],
… …
字段名n
数据类型 [属性]
) [ 存储引擎 ] [ 表字符集 ];
加入注释
CREATE TABLE [ IF NOT EXISTS ] 表名
(
字段名1
数据类型 [属性] COMMENT [字段注释],
字段名2
数据类型 [属性] COMMENT [字段注释],
… …
字段名n
数据类型 [属性] COMMENT [字段注释]
) [ 存储引擎 ] [ 表字符集 ] [表注释];
查看数据库中的表:
SHOW TABLES;
显示表结构:
DESC 表名;
删除表语法(DROP属于DDL)
DROP TABLE [ IF EXISTS ] 表名;
修改表名: ALTER TABLE 旧表名 RENAME AS 新表名
添加字段: ALTER TABLE 表名 ADD 字段名 字段类型 [ 属性 ]
修改字段:
ALTER TABLE 表名 MODIFY 字段名 字段类型 [ 属性 ]
修改属性:
alter table student modify sex enum(‘男’,‘女’);
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 字段类型 [ 属性 ]
删除字段:
ALTER TABLE 表名 DROP 字段名;
展示表的创建过程
show create table 表名;
更改表的存储引擎
ALTER TABLE 表名 ENGINE = 存储引擎
数据表中数据的操作
dml 数据操作语言 insert 添加 数据的 delete 删除数据 update 修改数据
1. 添加数据
-
标准的添加的sql语句
insert into student(id,name,sex,birthday,grade,scid) values(1,‘张三’,‘男’,‘2017-12-12’,60.23,2 ); -
常用的添加的sql语句 student 表名后面不写字段默认的是 这个表的所有的字段名
insert into student values(2,‘李四’,‘女’,‘2006-06-06’,99,5); -
指定 字段添加数据
insert into student(id,name,sex,scid) values(3,‘王五’,‘男’,6); -
指定字段的赋值
insert into student set id=4,name=‘赵六1’,sex=‘男’,birthday=‘2016-11-01’ ;
insert into student set id=3, name=‘赵六’, sex=‘男’, birthday=‘2016-10-01’;
修改 update
指定字段名 的值
update student set name=‘李七’ where id=4;
update 表名 set 字段名=新字段值,字段名=新字段值,字段名=新字段值,字段名=新字段值 where 指定字段名=指定字段名的值;
update student set name=‘潇潇’, sex=‘女’ , grade =65, scid=9 where id=4;
update student set name=‘李七’;
删除 delete 单删
指定 一个 字段 进行删除 前提条件 这个字段的值 是 唯一的
1.delete from student where id=4;
delete from student;
删除数据
2.truncate table student;
3.drop table student;
DELETE语句和TRUNCATE TABLE语句对比
dql 数据查询语言 selete 查询 展示数据的
* 代表的是 所有的字段名
– 空 null
select * from student
– 要求 只展示studnet 表中的 编号 和名称
select id,name,sex,birthday ,grade,scid from student;
– 要求 只展示studnet 表中的 编号 和名称
select id ,name from student;
约束
定义
约束是为了确保表中数据的完整性而做出的限制。
主键约束:primary key
唯一约束:unique
非空约束:not null
默认约束:default
外键约束:foreign key
检查约束:check
约束 规则
在 创建表的时候 可以 添加约束 或者是在修改 表结构的时候 添加约束
create table student(
id int primary key , -- 主键 非空 null 且唯一 方便 外面的表便于数据引用 和 对表中的字段的约束
name varchar(30) not null, -- 名称不能 为 空
sex varchar(3) default '男' , -- 默认 是 男
email varchar(60) unique -- 唯一约束
);
-- check 检查性约束
外键约束
列后加入:references 主表名(主键列);
foreign key (字段名) references 主表名 (主键列);
alter table 表名 add foreign key(列名) references 主表名(主键列)
删除约束 alter table 表名 drop foreign key 外键名;
唯一约束
列级约束 xs_idnum VARCHAR(11) unique
表级约束 unique(字段1,字段2)
修改表 alter table 表名 modify 字段名 字段类型 unique;
alter table 表名 add [constraint <唯一键名>] unique(字段名 字段类型);
alter table 表名 drop index 惟一键名称;
检查约束
列后加入:check(xs_sex=‘男’ OR xs_sex=‘女’);
删除约束: alter table 表名 drop check 检查约束名称;
默认约束
修改表时添加约束:
alter table 表名 alter 字段名 set default 默认值
删除约束 alter table 表名 alter 字段名 drop default;
非空约束
alter table 表名 modify 字段名 字段类型 not null;加入非空约束
alter table 表名 modify 字段名 字段类型 null;取消非空约束
E-R图
定义:
E-R图是用来描述现实世界实体及实体间关系的概念数据模型
E-R图符号
数据表中的查询
条件查询是通过WHERE子句进行检索的查询方式
select * from 表名 where 字段 = 值;
select* from comments where cmtId=1;
多条件查询是利用逻辑运算符把多个条件组合起来的条件查询
select * from 表名 where 字段1=值 逻辑值 字段2=值;
SELECT * FROM comments WHERE cmtId=1 AND cmtAuthor=‘张三1’;
IN关键字(查询符合括号内条件的数据 )
select 字段列1,字段2……from 表名 where 字段名 in(值1,zhi2);
SELECT * FROM comments WHERE newsId IN(1,2);
between and(查询值1和值2区间的数据,并且包含值1和值2)
select 字段列1,字段2 ,…FROM 表名 where 字段x between 值1 and 值2;
SELECT * FROM comments WHERE cmtId BETWEEN 1 AND 10
模糊查询是使用SQL 通配符替代一个或多个字符的条件查询
select * from表名 where 字段 like ‘包含通配符的值’;
_ 一个字符 A LIKE ‘C_’ CS、 Cd等
% 任意长度的字符串 B LIKE ‘CO%’ CONST、COKE等
[ ] 括号中所指定范围内的一个字符 C LIKE ‘9W0[1-2]’ 9W01或9W02
[^] 不在括号中所指定范围内的一个字符 D LIKE ‘9W0[^1-2]’ 9W03或9W07等
distinct关键字(去掉SELECT查询返回的记录结果中重复的记录, 相同记录只返回一条)
SELECT DISTINCT 字段名1, 字段名2… FROM 表名
SELECT DISTINCT cmtContent FROM comments ;
order by 关键字(一组数据按照升序或降序排列)
SELECT 字段名列表 FROM 表名 [WHERE <查询条件>]
[ORDER BY <排序的列名> [ASC 或 DESC]]
SELECT * FROM comments order by cmtId DESC
limit关键字(MySQL查询语句中使用LIMIT子句限制结果集)
SELECT <字段名列表> FROM <表名> [WHERE <查询条件>]
[ORDER BY <排序的列名> [ASC 或 DESC]] [LIMIT [位置偏移量, ]行数];
SELECT * FROM comments LIMIT 2,5
null 关键字
SELECT * FROM comments where cmtAuthor is null;(is not null )
聚合函数(聚合函数是可以对一组值进行计算,并返回单个值的函数)
SELECT 聚合函数 FROM <表名>
SELECT COUNT(*) AS 总数 FROM comments;
分组查询(按照指定的字段分类汇总结果的查询方式 )
SELECT <字段名列表> FROM <表名>
[WHERE <查询条件>]
[GROUP BY <分组的字段名>]
[ORDER BY <排序的列名> [ASC 或 DESC]]
[LIMIT [位置偏移量, ]行数];
SELECT newsId 新闻编号,COUNT(*) AS 数量 FROM comments GROUP BY newsId
高级查询
字符串连接
select concat(‘my’,‘s’,‘ql’)字符串连接;
– 字符串替换
select insert(‘这是sql语言’,2,3,‘mysql’)字符串替换;
– 字符串转小写
select lower(‘aADASDAFaFSDFGREW’)字符串转小写;
– 字符串转大写
select upper(‘asdafsdsaafs’)字符串转大写;
– 字符串截取 从1开始
select substring(‘老二是我儿’,1,3)字符串截取 ;
– 字符串字符个数
select char_length(‘老二是我儿’)字符串字符个数;
– 字符串去左右空格
select trim(’ 老二是我儿 ')字符串去左右空格;
– 将字符串重复count次后返回
select repeat(‘老二’,3)将字符串重复count次后返回;
– 将字符串反转后返回
select reverse(‘老二是弟弟’)将字符串反转后返回;
– 获取当前日期
select curdate()获取当前日期;
– 获取当前时间
select curtime()获取当前时间;
– 获取当前时间日期
select now();
– 返回日期date为一年中的第几周
select week(now())返回日期date为一年中的第几周;
– 返回日期date的年份
select year(now())返回日期date的年份;
– 返回时间time的小时值
select hour(now())返回时间time的小时值;
– 返回时间time的分钟值
select minute(now())返回时间time的分钟值;
– 返回日期参数date和date之间相隔的天数
select datediff(now(),‘2018-8-8’);
– 计算日期参数date加上n天后的日期
select adddate(now(),5)计算日期参数date加上n天后的日期;
– 返回大于或等于数值X的最小整数
select ceil(2.3)向上取整;
– 返回小于或等于数值x的最大整数
select floor(2.3)向下取整;
– 返回0~1间的随机数
select rand() 返回0到1间的随机数;
– 求一个数的绝对值
select abs(-48954)绝对值;
– 求一个数的平方根
select sqrt(9)平方根;
– 求一个数的幂运算符
select power(2,3)幂运算;
– 返回当前数据库名
select database()返回当前数据库名;
– 返回当前客户的连接id
select connection_id()返回当前客户的连接id;
– 返回最后一个select查询进行检索的总行数
select found_rows()返回最后一个select查询进行检索的总行数;
– 返回当前登录用户名
select user()返回当前登录用户名;
– 返回mysql服务器的版本
select version()返回mysql服务器的版本;
连接查询
– 两表查询
-- 查询 员工 的 详细信息 包含他的所在部门的名称
select * from dept;
-- 隐式内连接
select * from emp e, dept d where e.deptno=d.did ;
-- 内连接 inner join on 筛选条件的关键字 查出的数据是两表的交集的数据
select * from emp inner join dept on emp.deptno=dept.did;
外连接 左 left join on 连接 右连接 right join on
-- 左连接 是 以 左为主 left join 表名 on 条件
select * from emp left join dept on emp.deptno=dept.did;
-- 右连接 是 以 左为主 right join 表名 on 条件
select * from emp right join dept on dept.did=emp.deptno;
– 全连接 – FULL join
-- UNION
select * from emp left join dept on emp.deptno=dept.did
UNION
select * from emp right join dept on dept.did=emp.deptno;
-- 分组 group by
-- 查询 每个部门中 的 员工的 数量 并显示 部门的名称 以及员工的数量
-- select dept.dname , count(*) from emp right join dept on emp.deptno = dept.did group by emp.deptno;
-- 按照 有员工的部门 的编号进行分组 并 计算出部门中的员工的个数
select dept.dname, count(*) from emp inner join dept on emp.deptno=dept.did group by dept.did;
-- 按照 有员工的部门 的编号进行分组 并 计算出部门中的员工的个数 且 员工的个数大于 1的
select dept.dname, count(*) from emp inner join dept on emp.deptno=dept.did group by dept.did having count(*) >1;
-- 各个部门薪水最高的员工信息
-- in()
select e.*, d.dname from emp e inner join dept d on e.deptno=d.did where e.sal in (select max(sal) from emp group by deptno )
子查询
EXISTS子查询
SELECT 字段 FROM 表名 WHERE EXISTS(子查询);
注:子查询有返回结果:EXISTS子查询结果为TRUE,外层查询执行
子查询无返回结果:EXISTS子查询结果为FALSE,外层查询不执行
范式
定义
范式是为了设计冗余较小、结构合理的关系型数据库而遵循的规范
- 第一范式是为确保数据表的字段都符合原子性的范式
- 第二范式(2NF)是指在1NF的基础上,表中必须有主键,
其它列必须与主键完全依赖的范式 - 第三范式(3NF)是 在2NF的基础上,非主键列必须
直接依赖于主键的范式