1.关系型数据库(支持sql(结构化语言))
mysql(3306)
oracle(1521)
sqlserver(1433)
db2()
- 关系:
①字段间有关系
②数据间有关系
③表间有关系
2.非关系型数据库
redis
DDL命令:数据库定义语言
手动开启服务器:计算机管理-服务-管理
登录数据库: mysql -uroot -p
显示所有数据库: show databases;
进入特定数据库:use 数据库名;
查看特定数据库的所有表:show tables;
查看表中内容:select * from 表名;
创建表和内容:create table 表名(
字段名 字段类型(字段长度),
字段名 字段类型(字段长度));
DB结构
库
——表
——数据(表格形式)
——行(记录/数据) 列(字段)
信息孤岛
数据库三范式①字段不可分割(一个字段只能表达一个意思)
②记录不可重复
③一个表只能表示一个实体
eg:user表只记录user的个人信息,show表记录演出时间和人员间的关系
建库 建表: 命名驼峰式命名/tb_表名/下划线表示法
三键四约束 1.主键(标识一条数据的唯一性;字段不能重复且不能为空)
SQL语句: create table cat ( id int(11), name varchar(2)); CREATE TABLE cat1( id int(11) PRIMARY KEY, //设置主键 name VARCHAr(5) NOT NULL//设置非空,非空约束 );2.外键
- A表的某个字段值必须来源于B表的主键值,A表的字段就是外键(此时B表的主键值不能删除)
- 在建表leave的初始设置外键;
- 主键才能做别的表的外键,才能被别的表依赖
(主键的任一键可以相同,但不能同时相同)
4.1非空约束(不是null):字段不可为空
4.2唯一约束字段不能重复但可以为空
- 唯一索引不能出现多个null值,即只能有1个null值
- 主键与唯一约束的区别
①主键不可为null,唯一约束可以允许一个值为null;
②主键默认是唯一索引,但唯一索引不一定是主键
③主键若为int型,可设自增约束;但唯一不行
④主键可作为另一张表的外键来源,
⑤唯一约束可以有多个,主键只有一个
(数据库的目录:提高检索效率;占用空间,需要维护;)
1)唯一索引:表的目录
2)全文索引
3)普通索引
4)联合索引
(字段得是int型且为主键)
id进行自增约束
varchar:(得加英式的单引号‘’)当sex没有被人为赋值,即默认为’男’
字段类型①int类型:可不写长度
②小数类型:float、double
③char(字符类型):必须提前规定长度
eg:当规定5长度,但实际只用了1,就会浪费空间
④varchar(可变字符类型),必须规定长度
但根据实际情况变化使用空间——一般用于name(因名字长度不一定)
⑤date(日期类型):年月日 ,长度不用写
⑥datetime(日期时间类型):年月日时分秒
⑦text(大文本类型)
id(一般为主键),name,date不可为空
SQL语言
数据持久化把数据存储到磁盘上;
mysql的数据都是持久化的;redis的数据存在内存空间
漂号:``,起区分作用
navicat中快捷键:ctrl+“++” /鼠标左键+滚动滑轮
表——导入向导——Excel文件(xls)——选择要导入的xls文件——下一步——复制——下一步——开始
1.数据定义语言DDL对库和表进行操作
定义库查看数据库:show databases; 切换数据库:use 库名; 建库:create database 库名; 删库:drop database 库名;定义表
建表:create table 表名(字段 数据类型(长度) 约束···,字段 数据类型,···,foreign key(外键名) references 另一张表的(主键名)); 查看所有表:show tables; 查看表中字段信息:desc 表名; 新增表字段:alter table 表名 add 字段 字段类型; 修改字段数据类型:alter table 表名 modify 字段 字段类型; 删除字段:alter table 表名 drop 字段; 更改表名:rename table 表名 to 新表名; 修改字段名称:alter table 表名 change 旧字段 新字段 数据类型; 删除表:drop table 表名;2.数据操作语言DML(curd)
操作数据:增、删、改、查curd >Affected rows:1受影响条数
增加- 字段值与字段名一一对应
- default:
//①
insert into `表名`(字段名,字段名,字段名) values(字段内容,字段内容);
INSERT into boys (id,`boyName`,userCP) VALUES(5,'张云雷',777);
//②当主键自增
INSERT into boys (id,`boyName`,userCP) VALUES(default,'张云雷',777);//default
INSERT into boys (`boyName`,userCP) VALUES('张云雷',777);//省略自增主键
//③当默认自增
INSERT into boys (id,`boyName`,userCP) VALUES(5,default,777);
INSERT into boys (userCP) VALUES(777); //可省略默认
//④当值可为null
INSERT into boys (id,`boyName`,userCP) VALUES(5,'张云雷',default);
INSERT into boys (id,`boyName`) VALUES(5,'张云雷');
删除
1//删除一个表的所有内容:delete from 表名; DELETe FROM cat; 2//删除表中的某一条记录:DELETe FROM `表名` WHERe 删除条件; ①//DELETe FROM `boys` WHERe id=8;//用=判断 ②//当删除内容判断是否为空时,用 is null; DELETe FROM `boys` WHERe userCP is null;修改
1//修改某条记录:UPDATe 表名 SET 想改成的条件where 该条记录; UPDATE `boys` SET userCP=57 where `boyName`='郭'; 2//修改整个表的某个属性:UPDATE 表名 SET 想改成的条件; UPDATE `cat` SET `name`='好'; UPDATE `boys` SET userCP=57,`boyName`='无' where `boyName`='郭';//修改某条记录的多个属性查询(重点)
*:通配符
count(*)/ count(1):查询记录数
原理硬盘的数据通过select语句产生一张虚拟表,所有语句都在虚拟表上修改
关键字:select
from
where:对原始数据筛选
order by:排序
limit:取值范围
distinct:去重
group by:分组
having:对数据二次筛选
Select *|字段名|distinct(字段名)
From 表1 join表2
on 表1.字段=表2.字段
Where 原始数据的筛选条件
Group by 分组字段
Having 统计后数据的筛选条件
Order by 排序字段 排序规则,排序字段 排序规则
Limit 值1,值2
select nationality,count(*) ——想要的字段 5 from tb_student ——从那张表取 1 where age>10 ——第一次筛选 2 group by nationality ——分组 3 having count(*)>30 ——二次筛选 4 order by count(*) desc ——排序 limit 0,3; ——取值SQL语句执行顺序
from——join——on——where——group by(开始使用select中的别名,后面的语句中都可使用)——(聚合函数:avg、sum···——having——select——distinct——order by——limit
普通select查询- 1.//查询一个表的全部内容:SELECT * from 表名;
SELECt * from `boys`;
-
2//查询表中的某几个属性:SELECt 字段名,字段名 from 表名;
SELECt `boyName`,id from `boys`;
-
3.//用条件查询表中的某条记录:SELECt 字段名 FROM 表名 WHERe 查询条件;
SELECt `boyName` FROM `boys` WHERe id=5;
-
4.给字段名起别名 as(对查询出来的数据起作用)
SELECt boyName as '姓名' from boys;
-
字段值去重:distinct(字段) 【单独使用】【常用】
SELECt DISTINCT(boyfriend_id) from beauty;//只显示第一次出现的boyfriend_id
-
比较运算符:= > < >= <= !=(即<>)
select * from `user` where age <5;
-
判断是否为null: is NULL 、 is not NULL
select * from `boys` where userCP is NULL; SELECt * from `boys` where userCP is not NULL;
-
逻辑运算符: AND(&) or(|) not(!)
SELECt * FROM `boys` WHERe userCP=57 or userCP=777; SELECt * FROM `boys` WHERe not userCP=57;
-
区间判断:between and (可读性不好)
SELECt *FROM `boys` WHERe userCP BETWEEN 57 AND 777;//【包含57 和777】
-
多个等值判断:in
SELECt * FROM `boys` WHERe id IN (1,4,5,8); SELECt * FROM `boys` WHERe id=1 or id=4 or id=5 ore id=8;
-
模糊判断:
- %——>若干个字符(0个,1个,多个)
SELECt * FROM `boys` WHERe boyName LIKE '张%';//查询以张开头的的人 SELECt * FROM `boys` WHERe boyName LIKE '%%云%';//查以云开头,或以云结尾的
- _——>表示一个字符
SELECt * FROM `boys` WHERe boyName LIKE '_云%';//查第二个字符是云的 SELECt * FROM `boys` WHERe boyName LIKE '%云_';//查倒数第二个字符是云的
-
-concat(字符串1,字符串2····):从左到右合并字符串
select concat(id,boyName) FROM boys;
-
trim(str):去掉左右所有空格
SELECt trim(boyName) FROM boys;
-
litrm(str):去掉左所有空格
-
rtrim(str):去掉右所有空格
-
substring(str,x,y):从x位置开始,连续取y个str子串
SELECt substring(`boyName`,1,2) from boys;
-
abs(x):返回绝对值
SELECt abs(-12);
-
ceil(x):返回大于x的最小整数
-
floor(x):返回小于x的最大整数
-
mod(x,y):返回x与y的模
SELECT mod(13,24);//模为13,13%24=0···13 SELECT mod(27,24);//模为3,27%24=1···3
-
rand():返回(0-1)之间的随机数 select round(rand()*100);
-
round(x,y):返回参数x的y位小数的四舍五入结果
SELECT round(3.6785,2);
-
year(日期/日期时间类型字段):返回年份
SELECT year(borndate) from beauty; SELECt * from beauty where year(borndate)=1988;
-
month(日期/日期时间类型字段):返回月份
SELECt month(borndate) from beauty;
-
day(日期/日期时间类型字段):返回日期
SELECt day(borndate) from beauty;
特点:只返回一条记录;只能查询一个字段;多个聚合函数可以一起查询
select avg(boyfriend_id) as '平均年龄',max(boyfriend_id) from beauty;//多个聚合函数可以一起查询
-
1.count(*):返回满足条件的记录数,尽量不再查询其他字段,没意义
-
SELECt COUNT(*) FROM 表名; //查询表中的记录的总条数
-
null:不算条数——>尽量用count(*),避免字段的条数为null,出错
SELECt COUNT(*) FROM `boys`; <==>SELECt COUNT(1) FROM `boys`;//count(1)查询得快 SELECt COUNT(*) as '记录数' FROM `boys`; SELECt COUNT(0) FROM `boys`;//查询第一个字段的总条数
-
-
2.sum(数值类型的字段):返回满足条件的字段值的和
SELECt sum(boyfriend_id) from beauty;//返回boyfriend_id的总和
-
3.max(数值类型的字段):返回满足条件的字段值的最大值
SELECt max(boyfriend_id) from beauty;
-
4.min(数值类型的字段):返回满足条件的字段值的最小值
SELECt min(boyfriend_id) from beauty;//若最小记录有多条相同的,也只返回一条
-
5.avg(数值类型的字段):返回满足条件的字段值的平均值
SELECt avg(boyfriend_id) from beauty;
(与where查询平级)
order by【默认排序是asc升序】
格式:order by 主关键字 排序规则(asc|desc),次要关键字 排序规则,次次要关键字 排序规则
SELECt * FROM boys ORDER BY userCP asc, id desc;//按cp数量升序排,id降序排 SELECt * FROM boys ORDER BY userCP asc, id;//按cp数量升序排,id按默认升序排取记录范围limit
记录的索引值从0开始
-
limit 值n:从索引值0开始,连续取值n条记录(默认从0开始)
SELECt * from boys LIMIT 0,5;//从boys表中从0起连续取5条记录
-
limit 索引值,值1:从索引值开始,连续取值1条记录
项目中的翻页代码:select * from 表名 limit(页码-1)*每页记录数,每页记录数
配合聚合函数使用(此时返回不止一条);务必把分组的字段也查询出来
-
返回的记录数即分组字段的不重复值的数量
SELECt borndate,count(*) from beauty GROUP BY borndate;//查borndate务必把分组的字段也查询出来 select * from beauty GROUP BY borndate;//按照生日分组 select * ,count(*)from beauty GROUP BY borndate;//按照生日分组,并统计数量
-
distinct与group by的区别
- group by侧重分组统计,distinct侧重去除重复记录
distinct是每种类型取一条数据;group by是按每个类型进行分组(不止1条数据)
- SQL的执行阶段不同,先执行group by,后执行distinct
- group by配合聚合函数使用,distinct无法直接配合聚合函数
- group by的效率高于distinct
对已经筛选的数据进行二次筛选
select * from boys HAVINg userCP>50; select nationality,count(*) from tb_student where sex='男' group by nationality having count(*)>30;//将男生按照民族进行分组并输出民族和各民族男生数量【1次筛选】,再加入having关键字后,可以筛选出其中男生数量>30的民族【即2次筛选】
- where和having的区别
- where在group by前;having在group by后
- where是对原始数据(分组前数据)的条件过滤;having是对统计后的数据(分组后)的条件过滤
- where后不能用聚合函数;having后可以
查询两表间的共同数据;返回相交数据;
SELECt * from `project` inner join `department`;//笛卡尔积(两表数据相乘) SELECt * from `project` inner join `department` on `project`.dnum=`department`.dnumber; //两表相乘后寻找相交数据外连接 左连接 右连接 外连接
子查询
3.数据控制语言DCL修改数据库的操作权限,eg:授权、收回用户对库的权限etc



