1.DB的概念
2.完整性的分类
3.满足完整性的数据特点
4.完整性的分类
5.约束条件
6.数据库的分类
7.数据库管理提供的功能
8.DBMS(数据库管理)具备的内容
9.数据模型
10.SQL语言简介
11.命名规则
12.sql的数据类型
13.常用的数据类型
14.sql常用命令 1.对数据库的操作 2.对表的操作 3.单表操作 4.多表操作
对语句的总结
使用数据库 : use 数据库名;
设置别名 : select 字段名1 [as] 别名1,字段名2,别名2 from 表名 [as] 别名
查询语句 : select....from 表名
添加语句 : insert into 表名 values(字段名1=值1,字段名2=值2)
修改语句 : update 表名 set 字段名1=值1,字段名2=值2 where 条件
删除语句 : drop database 数据库名; drop table 表名;
delete from 表名 where 条件 (删除一条记录)
1. 数据库 database DB
概念:一个存储数据的仓库。数据库里可以存放文字,图片,音频,视频等信息。
数据库存储完毕之后形成一个文件,存储在硬盘中。
.db .sql 文件等
数据库的存储也称之为 持久化存储 data persistence
Navicat中可以转储文件,也可以执行文件,后缀名sql(对数据库文件导入导出)
2.完整性
确保db中包含的数据尽可能的准确和一致的数据特性。
如果db中存储有不正确的数据值,则该db就丧失了数据的完整性,比如student表中有birthday字段名(date类型),
则该字段存储的值必须为date的值,不能存储其他类型的值。
3.满足数据完整性的数据的特点
3.1 数据的值正确无误
3.2 数据的存在必须确保统一表格数据之间的和谐统一
3.3 必须维护不同表格之间的数据的和谐统一
为了维护数据的完整性,防止不合法的数据录入到表中,DBA和开发人员可以定义完整性规则,限制表的数据。
4.数据完整性的分类
1 域完整性
2 实体完整性
3 参照完整性
5.实现完整性,需要约束
约束 constraint
5.1 非空约束 not null 例如一个表的序号
5.2 唯一unique约束 不重复 字段中的值不能重复 例如:一个表 的序号
5.3 默认值default约束 例如字段表示时间,即可以给定一个默认值
5.4 检查check约束(mysql不支持)
5.5 主键primary key约束: 非空唯一 一个表必须有一个主键,一般主键使用id。
5.6 外键foreign key 约束 : 保持关联表的完整性。一个表的主键在另外一个表中存在。
举例:student表中有id(主键) name age c_id;
course表中有c_id(主键) c_name
对student表来说,c_id不是它的主键,却是course表的主键,这两个表连接起来
6. 数据库管理系统及数据库分类
DBMS Database Management System
2.1 关系型数据库
2.2 非关系型 No-SQL
MongoDB Redis
No-SQL 数据库一般情况下用于做缓存。
7.数据库管理 提供一些功能
7.1 管理数据库的表
创建db(database)中表 table,和excel表格一样的结构。
7.2 管理数据库中的数据
Create 创建 增加
Read 读取 查询
Update 修改 更新
Delete 删除
7.3 数据的完整性
7.4 数据的安全性
7.5 有数据故障恢复的功能,保证数据库的可靠运行
8. 真正的DBMS,需要包含
(1) DB 数据库
(2) DBA 数据库管理员
(3) Developer 开发者 工程师 程序员
(4) User 用户
9. 数据模型
(1)对象模型 :把对象抽离出数据库中对应的表名。比如 用户------>db中 User表
(2)层次模型 :郑大学校有计算机学院 物理学院 数学院,每个学院下面又有多种专业
(3)网状模型
(4)关系模型 : 可用ER图表示
以行和列的表格形式呈现出来,这样的模型称之为关系模型
每一行 称为一个记录
每一列 称为一个字段
每个字段的标题称为字段名
目前市面上流行的大多为关系模型进行数据组织和管理,操作起来比较简洁,直观。
采用关系模型的称为关系型数据库,比如mysql,oracle,sql server,db2等。
10. SQL
最新mysql的版本是5.8 ,也称为Mysql8
操作关系型数据库,需要使用标准的语言,称之为SQL(Structure Query Language 结构化查询语言)。
SQL语言功能分4部分:
1 数据查询 select
2 数据的操纵 insert/update/delete
3 数据的定义 create/alter/drop
4 数据的控制 grant/revoke
11 Mysql 的命名规则
针对数据库、表、索引、字段
规则如下:
1 由服务器所采用的字符集中任意的字母、数字、_和 $ 组成。
2 可以数字开头,但是不能只有个数字组成。
3 数据库、表、字段最多可右64个字符组成。别名最多可长达256个字符。
12 Mysql的数据类型
四种:
1 数值型 : 处理十进制的数据,可以处理十六进制的数据
2 字符型 : 保存字符串 char varchar(可不字符串)
3 日期和时间类型 : 诸如2019-8-1 或 16:02:15
4 NULL : 空 无类型的值
13 Mysql中常用的数据类型:
数据类型 描述 字节 推荐使用
1.smallint 整数:从-32000到32000范围 2 存储相对较小的整数 如:年纪,数量
2.int 整数:从-20 0000 0000到20 0000 0000 4 存储中等整数 如:距离
3.bigint 整数:不能用smallint或int描述的超大整数 8 存储超大的整数 如:科学/数学数据
4.float 小数: 单精度浮点型数据 4 存储小数数据 如:测量,温度
5.double 小数:双精度浮点型小数 8 需要双精度存储的小数 如:科学数据
6.decimal 小数:用户自定义精度的浮点型小数 变量:取决于精度和长度 以特别高的精度存储小数数据
7.char 固定长度的字符串 最高255字符 存储包含预定义字符串的变量 如:定期航线,国家或邮编
8.varchar 具有最大限制的可变长度的字符串变量 高达255字符存储 高达一个特定最大限度 如:名字,密码,短文标签
9.text 没有最大长度限制的可变长度的字符串 存储大型文本数据 如:新闻故事 产品描述 小说
10.blob 二进制字符串 存储二进制数据 如:图片,附件,二进制文档
11.date 以yyyy-mm-dd格式的日期 3 存储日期 如:生日,产品满期
12.time 以hh:mm:ss格式的时间 3 存储时间或时间间隔 如:两时间之间的间隔,任务开始/结束时间
13.datetime 以yyyy-mm-ddhh:mm:ss格式结合日期和时间 8 存储包含日期和时间的数据 如:提醒的人,事件
14.SQL语句
(1) 对数据库的操作:
1 展示所有的数据库
show databases;
2 创建一个数据库
create database [if not exists] 数据库名;
如果不存在这个数据库就创建,如果存在就不再进行创建
3 展示数据库中所有的table
首先使用这个数据库:use 数据库名;
其次 :show tables;
4 删除数据库
drop database 数据库名;
5 退出数据库
exit
(2) 对表的操作:
1 创建表 create table 表名();
create table 表名(
列名1 数据类型 [约束],
列名2 数据类型 [约束],
...
列名n 数据类型 [约束]
);
2 添加数据
(1)insert into 表名 values(各字段对应的值);
(2) Insert into 表名(字段名1,字段名2) values(字段对应的值1,值2);
3 查看表中的数据
3.1查询表中所有的数据
(1)select id,name,age from 表名;
(2)select * from 表名;(不建议使用,效率最低)
3.2查询某些字段的数据
select id,name from 表名;
select 字段(如name) from 表名 where 条件(如id=1);
4 可以设置别名
Select 字段名1 [as] 别名1,字段名2 [as] 别名2,.... from 表名 [as] 别名;
注意:可省略as,表名也可以设置别名。
5 修改
update 表名 set 字段名1=值1,字段名2=值2 ....;
6 修改某一记录的数据
update name='zhangsan' Where id=1(条件:也可以是大于小于);
注意:一般情况下,where后面的条件常使用id,因为在表id字段是不重复(唯一),当然了,在创建表时,需要对id加约束。
7 删除一条记录
delete from 表名 where 条件
(3)单表操作
8 查询年龄为18
select * from student where age = 18;
9 查询年龄大于18
select * from student where age > 18;
10 查询年龄在18和23之间的(and between...and)
select * from student where age>18 and age<23;
select * from student where age between 18 and 23;
11 查询年龄为20和25的(or)
select * from student where age=20 or age=25;
12 查询年龄在20和25之间的(in):包括20和25
select * from student where age in(20,25);
13 模糊查询(like,not like)
select * from 表名 where name like''
%:匹配0到多个字符(如:'l%':以l开头的名字)
_ :匹配一个字符 (如:'_l':匹配第二个字符是l的名字)
注:一个汉字占两个字符
14 聚合函数
1.count(字段名/列名) 统计
select count(id) from student; 结果是以表格形式出现。有一列,第一行为列名 为count(id),第二行是表中的id数量
2.sum() 求和
3.max() min()
使用嵌套查询,首先统计出年龄的最大数,再查询年龄最大的学生信息
select * from student where age = (select max(age) from student);
4.avg()
select avg(age) from student;
(4)多表操作
有两个表:student表中的c_id与course表中的c_id关联,设置student中的c_id为其外键(可在Navicat中设置)
student(学生信息表): s_id (Primary Key) name age c_id
1 zhangsan 18 1
2 lisi 20 2
3 wangwu 21 1
4 mazi 22 3
course (课程表) : c_id(Primary Key) c_name
1 java
2 mysql
3 html
4 jsp
15. 查询选择java课程的学生有多少个
select count(s_id) from student where c_id=1;
16.查询每个课程都有多少学生选择(分组查询:group by)
按照课程号进行分组(不同的c_id为一组)(过滤掉重复的课程号),统计每个组中的数量
按课程号进行分组,统计这个课程号在表中出现的次数
select c_id,count(s_id) from student group by c_id;
意思:对c_id进行分组,过滤掉重复的c_id(过滤掉c_id这一列中重复的),统计出这一列中出现各个课程号的次数count(c_id)
17.查询选择某一个课程的人数大于1的 信息(课程编号和学生人数)(数量统计:having)
由于WHERE后不可跟COUNT()函数,故用HAVING语句来限定条件
对聚合函数的输出进行限制
select c_id,count(s_id) from student group by c_id having count(s_id)>1;
18.排序:查询所有学生信息,并按照年龄排序 (asc升序/desc降序) (Order by排序)
select * from student order by age asc;
19.分页:将两条信息作为一页(limit)
查询前两条信息学生信息 作为一页显示。
limit a,b; a:从第几条记录开始(包含这一条。默认第一条为0) b:每次查询几个(几条记录)(每页显示的条数)
select * from student limit 0,2;
select * from student limit 2,2;
20.查询所有学生信息
1.全连接,查询到的结果是一个笛卡尔积
select * from student,course;
结果:student表中4个s_id都要与course中的4个c_id分别匹配。
2.等值连接
select * from student,course where student.c_id = course.c_id;
select * from student s,course c where s.c_id=c.c_id; (设置表的别名)
3.左连接(left join 表名 on)
查询出左表的所有信息和右表里面符号条件的信息
select * from student s left join course c on s.c_id=c.c_id;
4.右连接(right join 表名 on)
根据右表中的数据显示:如course表中有4个c_id,而student表中只用到3个,因为是右连接,所以要把右表中的数据都显示出来。
最后一行中的student数据为null即可。
查询出左表的所有信息和右表里面符号条件的信息
select * from student s left join course c on s.c_id=c.c_id;
优先级:
对于一个很长的查询sql:
select */字段名 [as] 别名 ,...
from 表名 [as] 别名
[where 条件]
[group by 字段名]
[having 条件]
[order by asc/desc]
[limit ?,?];