数据库的完整性和有效性
核心信息
打开Windows 的服务
PHP Study 启动Mysql 服务
连接步骤:
1. 打开 Navicat
2. 点击右上角连接
3. 输入连接信息
1. 连接名-- 随便输入
2. 主机名-- localhost 本机, 127.0.0.1
3. 端口号 3306
4. 用户名和密码 root/root
123456 111111 1234 root
表的操作
数据的操作
字段的操作
主键约束:
备份
恢复
1.创建表
1. 语法
create table 表名(
字段1 类型 约束,
字段2 类型 约束,
字段3 类型 约束
)
-- 1. 创建一个学生表, 姓名name的长度是 10.
create table student(
name varchar(10)
)
-- 2. 创建学生表, 姓名, 年龄 ,身高小数点2位
create table student2(
name varchar(10),
age int unsigned,
height decimal(5,2)
)
---- 3. 创建学生表, 姓名, 年龄 ,身高小数点2位
-- 加主键 id ,自增长,
create table student3(
id int unsigned primary key auto_increment,
name varchar(10),
age int unsigned,
height decimal(5,2)
)
1. 打开方式:
选择数据库 -->查询-->右键-->新建查询
2. 内容
-- sql语句
-- 注释: 对sql语句的解释说明。
-- 两个中扛加空格
-- ctrl+/
3. SQL语句的运行
1. 选中要运行的代码,-->右键运行 /或者点击上方运行已选择语句
2. 什么都不选, 点击运行, 运行所有的SQL语句。
4. 下方给出运行的结果
## 5.2 数据库操作--删除表
```sql
-- 1. 语法
drop table 表名;
-- 若表不存在, 会报错。
-- 2. 方式2
drop table if exists drop;
-- 如果表存在, 删除, 若不存在不删除不报错。
-- 举例
drop table stduent2;
drop table if exists student2;
--1. 增加数据: 往数据库的表中插入数据 全部字段
-- 1. 语法
insert into 表名 values (字段值1 , 字段值2, 字段值3)
-- 自增长(不用填写)站位值(0 , null ,default)
练习插入小刚信息:
insert into student3 values (null, '小刚',16,178.43)
-- 2. 插入数据, 部分字段
insert into 表名(字段1, 字段2) values(字段1值, 字段2值)
-- 举例:
-- student 插入两条数据 姓名和年龄
insert into student3(name, age) values('黑白', 999);
insert into student3(name, age) values('无常', 888);
-- 插入多条数据
1. 插入全字段多条数据
insert into 表名 values(字段1值,字段2值..),(字段1值,字段2值 ..)
-- 练习
-- 插入多条数据
insert into student3 values(0,'小花5',18,160), (0,'小花6',19, 170),(0,'小花7',19, 170);
2. 插入部分字段 多条记录
insert into 表名(字段1,字段2) values(字段1值,字段2值),(字段1值,字段2值);
--练习:
-- 插入部分字段多条记录
insert into student3(name, age) values ('Lucy', 19),('Lily',18);
语法:
delete from 表名 where 条件
-- 删除ID为6 的学生信息
delete from student3 where id=6;
-- 删除所有的数据
delete from dog;
-- 1.语法 更新数据
update 表名 set 字段=字段值, 字段2=字段值 where 字段=XX; -- 注意字段间逗号隔开
-- 练习
-- 修改学号为5 的学生, 姓名 狄仁杰 年龄 20
update student3 set name='狄仁杰', age=20 where id=5;
-- 如果没有条件 全部更新
update student3 Set height=180;
-- 查询所有字段信息
select * from 表名
练习:
-- 查询students 所有的学生信息
select * from students;
-- 查询部分字段:
select 字段1,字段2.。。 from 表名
练习:
-- 查询学生的 姓名和年龄
select name,age from students;
-- 课堂练习
1. 查询所有学生信息
2. 查询学号 ,name,班级信息。
1 .给字段取别名
语法:
select 字段1 as ‘别名1’ ,字段2 as '别名2' from 表名
. 练习:
-- 给 字段取别名
select studentno as '学号' , name as '姓名', class as '班级' from students;
2. 给表取别名
语法:
select 别名.字段名 from 表名 as 别名
练习
-- 表别名
select s.studentno from students as s;
-- 其他格式
select s.studentno from students s;
-- 作用: 去掉重复的数据
-- 语法:
select distinct 字段1,字段2 from 表名
-- 练习
-- 查询 学生的性别信息, 去掉重复
select distinct sex from students;
-- 查询学生来源于哪些地方
-- 查询学生的班级信息,所有的班级信息
-- 查询数据添加查询条件:
语法:
select 字段1,字段2.. from 表名 where 条件
-- 练习:
select * from students where age = 20;
-- 查询所有的男同学。
比较运算
-- 语法
等于: =
小于:<
大于>
大于等于>=
小于等于<=
不等于!= 或者 <>
-- 写SQL语句注意事项:
1. 确定操作的表。
2. 确定操作的字段
3. 编写SQL语句。。。
select 格式 :
select 字段信息 from 表名 where 条件;
逻辑运算符
概念: 条件1和条件为例
1. and : 与, 需要两个条件同事满足。
2. or : 或, 两个条件满足一个就可以。
3. not : 取反, 当前条件以外的值。
-- 练习:
-- 查询年龄小于20的女同学
-- 年龄 性别
select * from students where age<20 and sex='女';
-- 查询女学生或者是1班的学生; -- or
-- 性别 班级
select * from students where sex='女' or class='1班';
-- 查询非天津的学生 -- not
-- hometown
select * from students where not hometown='天津';
模糊查询
模糊查询的关键字 : like
语法:
% : 代表任意多个字符。
_: 代表一个任意字符。
练习:
-- 1. 查询姓孙的同学
select * from students;
select * from students where name like '孙%'
-- 2. 查询姓孙 且名字是一个字的学生。
select * from students where name like '孙_'
-- 3. 查询姓名以乔结尾的学生。%
select * from students where name like '%乔'
-- 4. 查询姓名包含白的学生
select * from students where name like '%白%'
范围查询
-- 语法
-- 1. in 在下面的范围内, 则返回数据。
select * from 表 where 字段 in 集合
-- 查询家乡是北上广的学生信息
select * from students where hometown in ('上海','北京','广东')
-- 2. between and -- 在什么 到什么范围内 (包含边界值)
between 值1 and 值2
-- 查询年龄在18 到20 之间的学生信息
select * from students where age between 18 and 20;
课堂练习:
-- 查询 18 19 22 的女生
select * from students where age in (18,19,22) and sex='女';
-- 查询年龄在 20 -25 以外的学生
select * from students where age not between 20 and 25;
空判断
1. null 和''的区别
null 是空没有被赋值
''空字符串,赋值后被清空。
语法:
判断为空 is null
判断不为空 is not null
练习:
-- 查询没有身份证的学生 。
select * from students where card is null;
-- select * from students where not card is null;
-- 查询填写了身份证的学生。
select * from students where card is not null;
语法:
order by 字段1 参数, 字段2 参数
参数:
-- asc : 升序 -- 上面小 下面大
-- desc: 降序 -- 上面大 下面小
-- 不填写参数, 默认升序排列。
两个字段排序 , 先按照第一个字段排序, 第一个字段值相同的, 在按照第二个字段排序。
练习:
-- 学生年龄的排序-- 升序
select * from students order by age asc;
-- 学生年龄的排序-- 降序
select * from students order by age desc;
-- 学生年龄的排序-- 默认排序方式是升序
select * from students order by age;
-- 查询学生的信息 按照年龄从大到小 排序, 年龄相同 学号从小到大排序
-- 从大到小 --降序
-- age studentno -- 升序
select * from students order by age desc, studentno asc;
-- 语法 计数:
count(字段名 或者 *)
作用是返回结果有多少天记录。
select count(*) from students;
-- 执行逻辑顺序:
1. 查询表中数据。
2. 条件判断,找出满足条件的记录
3. 有了最终结果 -- count 从1-最后计算出有多少条。
-- 字段 NUll 没有被计数
count(card) -- 11
语法关键字:
1. 求和 sum
2. 求最大值 max
3. 求最小值 min
4. 求平均值 avg -- 返回值是小数。
聚合函数的执行顺序:
1. 查询的结果,进行聚合函数的计算。
-- 聚合函数
-- 查询女生最大的年龄
-- 最大值 max
select max(age) as '最大年龄' from students where sex='女';
-- 查询一班最小年龄
-- min
select min(age) from students where class ='1班';
-- 查询北京学生的年龄总和
-- 求和关键字 sum
select sum(age) as '年龄总和' from students where hometown='北京';
-- 查询女生的平均年龄
-- avg 平均值
Select avg(age) from students where sex='女';
-- 课堂练习
-- 1. 查询所有学生的最大年龄,最小年龄,平均年龄
select max(age) as 最大值, min(age) as 最小值 , avg(age) as 平均年龄 from students;
-- 2. 一班共有多少个学生?
select count(*) as 一班人数 from students where class='1班';
-- 3.查询3班年龄小于18岁的学有几个?
select count(*) from students where class='3班' and age<18 ;
分组的作用:
按照字段相同的数据, 放在一组。
语法:
group by 字段名称1, 字段2.。
-- 分组执行的步骤
select max(age) from students where age <20 group by class;
1. 表中找出所有的数据
2. 条件筛选 -- <20 的学生
3. 对小于20 的进行分组, 以class分组
4. 每个班级 求最大值。
-- 练习:
-- 分组 查询各个性别的人数
select sex, count(*) from students group by sex;
-- 查询每个班级中各个性别的人数。
-- 各个班级-- 以班级分组
-- 各种性别人数 -- 性别分组
select class,sex, count(*) from students group by class, sex;
-- 课堂练习:
-- 查询各个班级学生的平均年龄 最大年龄 最小年龄。
-- 以什么分组? 班级
-- 处理哪个字段? age
select avg(age), max(age), min(age) from students group by class;
-- having 分组后筛选
语法:
having 字段条件 聚合函数条件
练习:
-- 查询不同班级人数大于3人的 班级信息。
select class from students
group by class -- 分组成各个班级
having count(*)>3; -- 判断 班级人数。
where 和having 区别:
1. 执行顺序不一样, where 最开始执行 having 分组后执行。
2. where 不能执行 聚合函数 having可以(已经分组了。)
-- 查询部分行数据
limit start, count
start 从第几行开始 0;
count 查询多少行数据;
查询第6-10行数据;
-- start count
5,9
查询 11-12行
10,2
-- 思考 查询年龄的最大值 不用max;
select * from students order by age desc limit 1;
作用:当查询结果的列来源于多张表时,需要将多张表连接成一个大的数据集,再选择合适的列返回
-- 两者表连接, 两表数据, 匹配到返回记录。
--语法
select * from 表1
inner join 表2 on 表1.sno = 表2.sno
-- 练习
-- 查询学生信息及学生成绩
-- *
select *
from students stu
inner join scores sco on stu.studentno = sco.studentno;
-- 内连接扩展:
select * from 表1, 表2
where 表1.字段= 表2.字段
-- 三表连接 A B C
-- 原理
1. A表和B表 两表连接,产生结果AB(看做一张表)
2. AB和C表连接, 产生结果ABC。
-- 三表连接 students scores courses
-- 练习
select *
from students st
inner join scores sc on st.studentno=sc.studentno
inner join courses co on co.courseNo=sc.courseNo;
--左连接:
1. 两表左连接,左边表数据全部显示
2. 匹配右边, 匹配到右表数据, 数据显示
3. 匹配不到右表的数据, 用NULL填充
-- 查询所有的学生的成绩,包括没有成绩的学生
select *
from students st
left join scores s on st.studentno=s.studentno;
-- 查询所有学生的成绩, all,需求显示课程名
select *
from students st
left join scores s on st.studentno =s.studentno
left join courses c on c.courseNo = s.courseNo
-- 介绍:
以右表为基准, 右表的数据全部显示,
匹配左表,匹配到数据左表数据显示
匹配不到数据, 左表数据用NULL填充。
-- 语法
select *
from 表1
right join 表2 on 表2.字段=表1.字段
-- 查询所有的学生成绩, ALL
-- 右连接 (学生表)
select *
from scores sc
right join students st on st.studentno = sc.studentno
-- 查询所有学生的成绩, all,需求显示课程名
-- 三表连接
-- 右表是 学生信息表, 左表-- 成绩表
-- 3课程表-- 课程名
select *
from scores sc
right join students st on st.studentno=sc.studentno
left join courses c on sc.courseNo = c.courseNo
-- 自关联, 将自己看做两张表, 进行表连接
-- 表名一样, 两张表要取别名
-- 其他和表连接一致。
-- 课堂练习
-- 查询河南省所有的城市
select a2.atitle
from areas a1
inner join areas a2 on a1.aid=a2.pid
where a1.atitle='河南省';
-- 查询郑州市的所有的区。
select a2.atitle
from areas a1
inner join areas a2 on a1. aid=a2.pid
where a1.atitle='郑州市';
-- 查询 河南省的所有的区县
select a3.atitle
from areas a1
inner join areas a2 on a1.aid= a2.pid
inner join areas a3 on a2.aid=a3.pid
where a1.atitle='河南省';
应用的场景
group by 其他:
1. group 分组的概念
2. group 分组和 聚合函数配合使用
3. 其他不合理的操作。
4. group by 多个字段
概念:
应用到select语句的嵌 -- 子查询
外层select -- 主查询
里面select -- 子查询
---- 1. 查询比平均年龄大的学生
select *
from students
where age >(
select avg(age) from students
)
-- 2. 查询王昭君的成绩 要求,显示成绩。
select * from scores
where studentno =(
select studentno from students
where name='王昭君'
);
-- 3. 查询18岁的学生的成绩,要求显示成绩
select *
from scores
where studentno in (
select studentno from students
where age=18
);
-- 多字段子查询
--格式:
select * from 表名
where (字段1,字段2,字段3...) = (
select xx,xx,xx from 表名
)
-- 查询王昭君 同班 同龄的学生信息。
select * from students where (class,age) = (
select class,age from students
where name='王昭君'
)
说明:
select语句查询的结果, 把它当做一个表, 取一个别名
和另外表连接。
-- 数据源
-- 查询 数据库 和系统测试的课程成绩
select *
from courses c
inner join scores s on c.courseno=s.courseno
where c.name in ('数据库', '系统测试')
-- 查询数据库 和系统测试的课程信息
select * from courses where name in('数据库', '系统测试');
-- 课程信息结果作为一个表 c
select * from scores s
inner join (select * from courses where name in('数据库', '系统测试')) c
on s.courseno = c.courseno;
-- in -- 介绍: 在返回结果范围内。
in :
e.g: in (18,19,20) 等于范围内任意一个值就可以
-- any/some
1. =any
=some -- 相当于in 在范围内。
2. any/some >或者 <
-- 大于: 大于范围内任意一个就可以
e.g >some(18,19,20) -- 大于18
-- all -- 全部
-- 大于: 需要大于 范围内全部的值。
e.g: > (18,19,20) --大于20