了解数据库基本概念
什么是数据库?
• 长期存放在计算机内,有组织、可共享的大量数据的集合,是一个数据“仓库”
MySQL数据库的特点
• 开源免费,小巧但功能齐全
• 可在Windows和Linux系统上运行
• 操作方便,适用于中小型甚至大型网站应用
DDL建库建表
# 注释
-- 注释
/*
多行
注释
*/
1.sql不区分大小写
2._(下划线)进行名字的分割,不适用驼峰命名法
3.;语句sql结尾处写一个;来表示结束
4.一般关键词建议使用大写
5.所有名称不允许使用中文
#库
-- 查看所有的库
show databases;
-- 创建库
-- create database 数据库名;
-- 删除库(危险操作)
drop database 数据库名;
-- 使用库/切换库
use 数据库名;
#表的操作
-- 查看该库中所有的表
show tables;
-- 创建表
/*create table 表名(
字段名 类型 属性,
字段名 类型 属性,
...
字段名 类型 属性
);
*/
create table pet(
dog_name varchar(10),
dog_age tinyint,
dog_birth datetime,
dog_id char(3),
dog_hobby varchar(25),
dog_weight decimal(4,1)
);
-- ``反引号:取消关键性
-- DEFAULT NULL 该字段的值可以为空
CREATE TABLE `pet` (
`dog_name` varchar(10) DEFAULT NULL,
`dog_age` tinyint DEFAULT NULL,
`dog_birth` datetime DEFAULT NULL,
`dog_id` char(3) DEFAULT NULL,
`dog_hobby` varchar(25) DEFAULT NULL,
`dog_weight` decimal(4,1) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
#默认字符集和字符排序
DEFAULT CHARSET=utf8mb4
COLLATE=utf8mb4_0900_ai_ci
ENGINE=InnoDB 非常重要 存储:写磁盘的规则innodb 引擎:规则
-- 数据库的本质就是把数据写到磁盘上
#查看表中的字段
#方式一 desc 表名
desc pet;
#方式二
show create table pet;
#查看当前数据库支持的存储引擎:
show engines;
-- 表结构的修改
alter table 表名 关键词 数据;
-- 1.修改表名
alter table 旧表名 rename as 新表名;
-- 2.添加一个字段
alter table 表名 add 新字段名 类型 属性;
-- 3.删除字段(危险操作)
alter table 表名 drop 字段名;
-- 4.修改字段
-- 覆盖式修改
1.一定的默认值default null
2.如果有已经存在具体的数据(tinyint转int char转varchar)--数据是可以做隐式转换的
一旦出现不是字符的数据(字符串) 转int 这种转不了,直接报错
-- 方式一 modify 只能修改数据类型和属性
alter table 表名 modify 字段名 要修改的类型 要修改的属性;
-- 方式二 change 不仅修改类型和属性 还可以修改字段名
alter table 表名 change 旧字段名 新字段名 要修改的类型 要修改的属性;
(危险操作)
-- drop table 表名
# 约束
1.非空约束
create table tb1(
username varchar(10) not null, -- 非空约束
userage int
);
create table tb2(
username varchar(10) not null default '无名', -- 非空约束
userage int
);
2.唯一约束
是可以为null 并且可以有多个null,因为null 是一个类型
create table tb3(
username varchar(10) unique, -- 唯一约束 行级约束
userage int unique -- 每个字段都是各自的唯一约束
);
create table tb4(
username varchar(10),
userage int,
unique(username,userage) -- 表级约束, 联合唯一约束
-- 字段是有关联的,必须每个字段的值都相同时才会触发唯一约束
);
create table tb5(
username varchar(10),
userage int,
CONSTRAINT name_age_unique unique(username,userage)
-- 表级约束可以给约束起名字(方便以后通过这个名字来删除这个约束)
);
3.主键约束
- 每张表必须有且只有一个主键
- 主键的值是唯一
- 主键是不能为null
create table tb6(
username varchar(10) primary key,
userage int primary key -- 错误,主键在一张表中只能有一个
);
create table tb8(
username varchar(10),
userage int,
primary key(username,userage) -- 联合主键,联合约束
-- 多个字段的值,只有完全相同时,才会触发约束
);
#一般主键的建立方式
主键的值是不会回补
create table tb9(
tid int primary key auto_increment, -- 自增
username varchar(10),
userage int
);
4.外键约束
- 外键的值可以重复
- 外键可以为null
- 外键必须要写 父表中有的数据
- 父表中的关联字段必须是一个具有唯一性的数据
- 父表的字段名和从表的字段名不一定要相同,但是数据类型必须一致
- 一个表中可以有多个外键,也可以有多个外键约束,但是只能有一个主键
- 使用外键关系,不去建立外键约束
create table a(
aid int primary key auto_increment,
aname varchar(10)
);
create table b(
bid int primary key auto_increment,
bname varchar(10),
aid int,
FOREIGN key(aid) references a(aid)
);
约束的添加:
- 加非空约束
- alter table 表名 modify test_student char(10) not null;
- 添加唯一约束
- alter table 表名 add unique(表字段名,字段,字段,字段);
- 添加主键约束
- alter table 表名 add primary key(表的字段名,字段,字段);
- 添加外键约束
- alter table 表名 add constraint N1 foreign key (表字段名) references 父表(父表字段名);
约束的删除:
- 删除not null约束
- alter table 表名 modify 列名 类型;
- 删除unique约束
- alter table 表名 drop index 唯一约束名;
- 删除primary key约束
- alter table 表名 drop primary key;
- 删除foreign key约束
- alter table 表名 drop foreign key 外键名;
DML数据操作语句
#.新增
insert into 表名 (字段名,字段名,...,字段名)values/value(值,值,...,值)
-- 日期 使用字符串的形式进行书写日期格式 (yyyy-MM-dd HH-MM-SS)
#全字段的插入
--方式一
insert into student(sid,sname,birthday,ssex,classid) values(9,'张三','2007-1-1','男',1);
--方式二 1.null 2.default
insert into student values(null,'李四','2010-2-9','女',1);
insert into student values(default,'lili','2009-8-20','女',1);
#部分字段插入
insert into student(sname,ssex) values('zz','女');
alter table student modify ssex varchar(10) not null default '保密';
insert into student(sname) values('peter');
#一次性添加多条数据
-- 方式一
-- insert into 表名 (字段名..) values(值..),(值..)...
insert into student(sname,ssex) values('pony','女'),('ken','女'),('daven','女');
-- 方式二 不常用
-- insert into select
-- 插入和被插入的表都必须存在
create table newstu(
stuname varchar(10),
stusex varchar(10),
classid int
);
insert into newstu(stuname,stusex,classid) select sname,ssex,classid from student;
-- 方式三
-- create table select
-- 被插入表不能存在 --被插入表没有任何约束 仅仅是将查询结果放到新表
create table stu1 select sid,sname,birthday from student;
-- io高 既要输入又要输出 容易锁表
#.修改
update 表名 set 字段名=值,字段名=值,...,字段名=值 where 子句条件;
where子句 中的条件是对表中每一条数据进行判断,判断成立,该数据的父句执行;判断不成立,该数据的父句不执行
update stu1 set birthday='1999-10-22' where sname='peter';
update newstu set classid=200 where stusex!='男';
#.删除
delete from 表名 where 子句
delete from newstu;-- 删除表中数据
drop table newstu;-- 删除表
delete from stu1 where sname='daven';
-- 清空表(截断表)
truncate 表名 效果和删除表一样 删除表中数据
truncate stu1;
delete truncate drop的区别:
delete只删数据; truncate不仅删数据 还把索引删掉了
drop 不仅删数据,还删除了索引,表结构也删了
DQL语句
所有的查询都会得到一张虚拟表 不会发生变化 除非重新查
#查询
-- 最简单的查询
select 123;
select 'abc';
select 1+2;
-- 从表中获取数据
-- select 字段名,字段名 from 表名
-- 全字段查询
select sid,sname,birthday,ssex,classid from student;
select * from student;-- 效率比全字段查询慢 不推荐使用
-- 部分字段查询
select sname,ssex from student;
-- 字段名起别名
select sname as '姓名',birthday '生日',ssex 性别 from student;
-- 添加字段
select sname,'university' 学校 from student;
#distinct 去重
所有字段的数据要一致才会去重
select distinct sname,ssex from student;
#带条件的查询 where子句
select * from student where sid=5;
select * from student where sid<>5;
select * from student where sid between 3 and 5;
#面试题常考
-- 查询年龄大于1990-1-1的学生
select * from student where birthday<'1990-1-1';
#in 在某个特定的范围内
-- or会让索引失效
select * from student where sid=3 or sid=5 or sid=7;
-- 推荐使用in 可以使用到索引
select * from student where sid in (3,5,7);
#like 模糊查询
- 模糊符号
- % 任意多的任意字符
- _ 一个任意字符
select * from student where sname like '%杨%';
#null
-- is 是一个什么
select * from student where birthday is null;
select * from student where birthday is not null;
#聚合函数
-- 把多个值变为一个值
- count() 统计个数
- max() 求最大值
- min() 求最小值
- sum() 总和
- avg() 平均值
1.count
#select count(字段\常量\*) from 表名;
select count(sid) from student;-- 主键
select count(classid) from student;-- 不统计null类型
select count('a') from student;-- 不推荐使用
select count(123) from student;-- 推荐使用
select count(*) from student;-- 推荐使用
2.sum avg min max 数值类型
select sum(score) from sc;
select avg(score) from sc;
select max(score) from sc;
select min(score) from sc;
例:统计出成绩表中一共有多少次考试,总成绩,平均分,最高分,最低分
select count(*) 考试次数,sum(score) 总成绩,avg(score) 平均分,max(score) 最高分,min(score) 最低分 from sc;
#group by 分组
select ssex,count(*) from student group by ssex;
having和where的区别:
- where是对表中每一条数据进行判断
- having是对分组聚合后的数据进行条件筛选
#order by 排序
默认是按主键升序排序
#按班级降序desc必须声明 默认不写就是升序asc
select * from student order by classid desc;
#先写先排
select * from sc order by score desc,cid desc;
#limit 分页
0 开始 (页码-1)*步长,步长
#select * from 表名 limit 位置,步长;
select * from student limit 3,3;-- 从3开始