MYSQL
了解数据库(非必修)
DDL语句:数据库定义语言(进行库表操作:create创建,alter修改,drop删除)
DML语句:针对数据操作(进行数据的操作:create创建,alter修改,delete删除,select查询)
数据库系统DBS:
DBS=DB+DBMS+应用系统+数据库管理员(DBA)+用户
关系模型:
关系运算(从表的角度进行操作):选择(从行的角度选择若干个行)、投影(从列的角度选择若干个列)、连接(若把集合A看成表A,集合B看成表B,A和B进行连接运算会把两个表中匹配的数据结合起来)
关系模型引入范式(NF)消除存储异常,保证数据的合法性,减少数据冗余,保证数据完整性和存储效率。一般情况下是要遵循第三范式的要求。即3NF
一个基本的关系型数据库要满足第一范式,一个完整的关系型数据库要满足第三范式
一、数据库基础语句
查询数据库
show database;
创建数据库
create database 库名;
删除数据库
drop database 库名;
注释的两种方法
– 对应注释内容
/**/
二、表的基础语句
建表
create table 表名(
属性名 数据类型,
属性名 数据类型
);
删除表
drop table 表名;
删除多张表:drop table 表名1,表名2…;
修改表
添加列:alter table 表名 add 属性名 数据类型;
删除列:alter table 表名 drop 列名;
修改列的数据类型(修改属性):alter table 表名 modify 列名 新的数据类型;
修改列名:alter table 表名 change 旧列名 新列名 数据类型;(如果想同时修改数据类型,直接将最后的数据类型写成新的即可)
显示表
显示表结构:desc 表名;
数据的完整性
指的是存储在数据库中的数据应该保证数据的准确性和可靠性
那么如何保证数据的可靠性和准确性—需要关系的完整性约束(限制或者要求)
– 实体完整性
1.主键约束:primary key
主键约束在一个表中有且只有一个
描述:针对一个表中的列来进行设定的,一旦该列设置成主键,就要遵循唯一、不重复、不为空。
1.1创建表的同时创建主键约束
格式一:
create table 表名(
列名1 数据类型 primary key,
列名2 数据类型,
…
);
格式二:主键约束的名字一般命名规则:PK_列名
create table 表名(
列名1 数据类型 ,
列名2 数据类型,
…
constraint 主键约束的名字 primary key(列名1)
);
格式三:
create table 表名(
列名1 数据类型,
列名2 数据类型,
primary key(列名)
);
1.2针对已存在的表添加主键约束
格式一:
alter table 表名 add constraint 主键约束名 primary key(列名);
格式二:
alter table 表名 add primary key(列名);
格式三:
alter table 表名 modify 列名 数据类型 primary key;
1.3删除主键约束
alter table 表名 drop primary key;
2.联合主键
在一个表中,把两个列看成是一个整体,要求这两个列都是唯一、不重复、不为空
2.1创建表的同时创建联合主键
格式一:主键约束的名字一般命名规则:PK_列名
create table 表名(
列名1 数据类型 ,
列名2 数据类型,
…
constraint 主键约束的名字 primary key(列名1,列名2)
);
格式二:
create table 表名(
列名1 数据类型,
列名2 数据类型,
primary key(列名1,列名2)
);
-- 创建一个选课表(学号,课程号,成绩;联合主键)
create table 选课表(
学号 varchar(20),
课程号 varchar(10),
成绩 decimal,
primary key(学号,课程号)
);
2.2针对已经存在的表来添加联合主键
格式一:
alter table 表名 add constraint 主键约束名 primary key(列名1,列名2);
格式二:
alter table 表名 add primary key(列名1,列名2);
-- 把student表中的学号和姓名设置成联合主键
alter table student add constraint PK_SNAME primary key(学号,姓名);
3.唯一约束
索引:等同于书本的目录=加快数据的查询
实体完整性–唯一约束:unique
特征:
1.唯一约束是针对表中的列来进行设置,保证数据的唯一性
2.唯一约束不允许出现重复的值,但是可以有空值(null)
3.一个表中可以有多个唯一约束
4.唯一约束的名字默认和列名是一致的
5.拥有唯一约束的列,系统默认会给该列建立一个唯一索引
1.创建表的同时创建唯一约束
格式一:
create table 表名(
列名1 数据类型 unique,
列名2 数据类型 unique,
列名n
);
格式二:
create table 表名(
列名1 数据类型,
列名2 数据类型,
列名3 数据类型,
constraint 唯一约束的名字 unique(列名1),
constraint 唯一约束的名字 unique(列名2)
);
-- 创建商品表(商品号 主键约束,商品名称 唯一约束,价格,数量)
create table 商品表(
商品号 varchar(20) primary key,
商品名称 varchar(20) unique,
价格 decimal,
数量 decimal
);
-- 创建会员表(会员编号 唯一约束,姓名,手机号)
create table 会员表(
会员编号 varchar(10),
姓名 varchar(10),
手机号 varchar(11),
constraint UN_会员编号 unique(会员编号)
);
2.针对已存在的表添加唯一约束
格式:alter table 表名 add unique(列名);
-- 把手机号设置成唯一约束
alter table 会员表 add unique(列名);
3.删除唯一约束
格式: alter table 表名 drop index 唯一约束的名字;(这里是有约束名称根据名字删,如果没有就按照列名删)
-- 删除商品表中的唯一约束
alter table 商品表 drop index 商品号;
-- 删除会员表中的唯一约束
alter table 会员表 drop index UN_会员编号;
4.域完整性
描述:域完整性可以确保不会输入无效的值
1.默认约束
默认约束:default
特征:如果不给某列填充数据,也会把默认的值给补充在表中。一个表中可以有多个默认值
1.1创建表的同时创建默认约束
create table 表名(
列名1 数据类型 default ‘值’,
列名2 数据类型 default ‘值’
);
如果是数值不用加单引号,如果是其他字符必须要单引号
-- 创建一个课程表(课程号,课程名,学时 默认约束 4)
create table 课程表(
课程号 varchar(10),
课程名 varchar(10),
学时 int default 4
);
1.2针对已存在的表添加默认约束
alter table 表名 modify 列名 数据类型 default ‘值’;
-- 课程名添加默认约束 c03
alter table 课程表 modify 课程名 varchar(10) default 'c03';
1.3删除默认约束
alter table 表名 modify 列名 数据类型;(这里不需要drop了,只要没有带default就表示没有了)
-- 删除课程名的默认约束
alter table 课程表 modify 课程名 varchar(10);
5.参照完整性
外键约束:foreign key 针对两个表来进行的操作
描述:1.也是针对表中的列来进行设定的;
2.外键约束是设置在从表中的列;
3.主表和从表的区分:就看两个表之间的参照关系;表A参照或者引用表B,表B是主表,表A是从表
4.主表与从表之间的参照关系是通过两个表中共有的列来进行的
5.共有列的要求:列名可以不一致,但是列的数据类型和保存的内容必须一致
6.从表参照引用主表的列,要求主表的列必须是主键约束或者唯一约束
7.一旦外键约束建立成功,从表做数据的插入,必须先问主表,主表中有记录,允许插入;没有的话,拒绝插入
8.主表删除记录时,先看从表有没有参照引用,如果有,拒绝删除;如果没有,可以直接删除
1.创建表的同时创建外键约束
create table 主表表名(
列名1 数据类型 primary key,
列名2 数据类型
);
create table 从表表名(
列名1 数据类型,
列名2 数据类型,
列名3 数据类型,
constraint 外键约束的名字 foreign key(从表列名1) references 主表表名(主表列名1)
);
外键约束名字:FK_列名
create table 从表表名(
列名1 数据类型,
列名2 数据类型,
列名3 数据类型,
constraint 外键约束的名字 foreign key(从表列名1) references 主表表名(主表列名1),
constraint 外键约束的名字 foreign key(从表列名2) references 主表表名(主表列名2)
);
-- 创建一个成绩表(学号,课程号,成绩),学号参照引用student表中的学号
create table 成绩表(
学号 varchar(10),
课程号 varchar(10),
成绩 int,
constraint FK_学号 foreign key(学号) reference student(学号)
);
2.针对已存在的表添加外键约束
alter table 从表的表名 add constraint 外键约束的名字 foreign key(从表的列名) reference 主表表名(列名)
-- 给选课表的学号添加一个外键约束,参照引用student表中的学号
alter table 选课表 add constraint FK_SNO foreign key(学号) reference student(学号);
3.删除外键约束
alter table 表名 drop foreign key 外键约束的名字;
-- 删除选课表的外键约束
alter table 选课表 foreign key FK_SNO;
三、表的增删改
SQL:结构化查询语言,是一种数据库查询和设计语言。
SQL语言的第一个分支:DDL语句:create、alter、drop–操作对象:库表
SQL语言的第二个分支:DML语句:insert、delete、select–操作对象:表中的数据
insert语句
向表中添加数据。
格式一:值和列一定是一一对应关系
insert into 表名(列名1,列名2,…) values(值1,值2,…);
格式二:
insert into 表名 values(值1,值2…);
格式三:如果值是数字直接写,如果是字符串等用单引号‘’
insert into 表名 values(值1,值2…),(值1,值2,…),(值1,值2…);
-- 查看员工信息表的表结构
desc 员工信息表;
--向student表中插入一条记录
insert into student(学号,姓名,年龄,性别,系别) values('103','张三',18,'男','计算机系');
-- 格式二:
insert into student values('103','张三',18,'男','计算机系');
-- 一次性插入多条记录
insert into student values('104','李四',17,'男','计算机系'),('105','王五',19,'男','物理系'),('106','诗诗',18,'女','计算机系');
delete语句
删除表中的数据。
格式一:删除整个表中的所有数据
delete from 表名;
格式二:根据条件删除数据
delete from 表名 where 条件;
-- 删除student表中的所有数据
delete from student;
-- 删除系别是物理系的学生
delete from student where 系别='物理系';
or 或:给定多个条件,但只要满足其中一个即可
格式:delete from 表名 where 条件1 or 条件2 or 条件3…
and 和:给定多个条件全部满足才行
格式:delete from 表名 where 条件1 and 条件2 and 条件3…
-- 删除年龄为17或者系别为物理系的学生
delete from student where age=17 or 系别='物理系';
-- 删除年龄为17并且系别为物理系的学生
delete from student where age=19 and 系别='物理系';
update语句
对表中数据更新或者修改的操作
格式一:
update 表名 set 列=值;
格式二:
update 表名 set 列名1=值,列名2=值,…;
格式三:有条件的更新
update 表名 set 列名=值 where 条件;
-- 格式一:更改学生年龄为16
update student set 年龄=16;
-- 格式二:更改学生年龄为16,系别为物理系
update student set 年龄=16,系别='物理系';
-- 格式三:把103学生年龄改成20,系别改成文学系
update student set 年龄=20,系别='文学系' where 学号='103';
扩展:在更新的时候可以进行列的计算
如:把学号为104的学生的年龄,在原有基础上增加10岁
update student set 年龄=年龄+10 where 学号=104;
四、查询
select
查询表中的数据。
基本格式:
select 列名1,列名2,… from 表名;
select子句:用来指定要查询的列
from子句:用来指定查询时用到的表
*代表所有
select * from 表名;
-- 查看student表中所有的内容
select * from student;
-- 查看course表中所有内容
select * from course;
-- 查看student表中的学号,姓名,系别
select sno,sname,sdept from student;
去重查询
distinct:去重复查询——针对查询出来的结果进行去重复
格式:select distinct 列名 from 表名;
-- 查看从student表中查看学生来自于哪些系别?
select distinct sdept from student;
-- 从学生信息表中统计该班学员来自于哪些地方
select * from 学生信息;
select distinct 籍贯 from 学生信息
别名查询
别名查询:指的是针对查询结果的标题进行的命名。
格式一:
select 列名1 ‘别名1’ ,列名2 ‘别名2’… from 表名;
-- 从student表中查询学号,姓名,性别,年龄
select sno '学号',sname '姓名',ssex '性别', age '年龄' from student;
格式二:as
select 列名1 as ‘别名1’,列名2 as ‘别名2’,… from 表名;
-- 从student表中查询学号,姓名,性别,年龄
select sno as '学号',sname as '姓名',ssex as '性别', age as '年龄' from student;
查询结果计算
在查询过程中,也可以对查询列的结果进行计算操作
-- 从成绩表中查看每个学员成绩都增加10分之后的结果
select 学号,课程编号,成绩 '原始成绩',成绩+10 '加分后的成绩' from 成绩表;
优化后:
select 学号,课程编号,成绩+10 '加分后的成绩成绩',成绩 '原始成绩' from 成绩表;
选择查询
条件查询或称为选择查询:根据条件来进行数据的查询工作
格式:select 列名|* from 表名 where 条件;
where子句:写的是查询条件
1.比较运算符的应用
< > 、!=均表示不等于
-- 查看计算机系学生的个人信息
select * from student where sdept='计算机系';
-- 从sc表中查看选课成绩及格的学生有哪些?
select * from sc where grade>=60;
-- 从student表中查询不是计算机系的学生
select * student where sdept!='计算机系';
2.逻辑运算符的应用
and、or
-- 查看既选修了c02这门课,且成绩及格的学生
select * from sc where cno='c02' and grade>=60;
-- 查看选修了计算机这门课或者性别为女的学生记录
select * from student where sdept='计算机系' or ssex='女';
3.范围搜查询索
3.1在某个范围区间内
between 最小值 and 最大值
格式:select 列名|* from 表名 between 最小值 and 最大值;
3.2不在某个范围区间内
not between 最小值 and 最大值
格式:select 列名|* from 表名 not between 最小值 and 最大值;
-- 从sc表查询成绩在80-100之间的学生记录
select * from sc where grade between 80 and 100;
-- 从sc表查询成绩不在80-100之间的学生记录
select * from sc where grade not between 80 and 100;
4.列表搜索条件
给定一个列表,列表中包含了多个值,只要能够匹配到任意一个值,都会有查询结果的。
格式:select 列名|* from 表名 where 列名 in(值1,值2,值3…);
-- 从学生信息表中查看来自北京和江苏的学生信息
select * from 学生信息表 where 籍贯 in(北京,江苏);
select * from 学生信息表 where 籍贯='北京' or 籍贯='江苏';
not in:不要列表中的内容
格式:select 列名|* from 表名 where 列名 not in(值1,值2,值3…);
-- 不需要计算机系和文学系的学员信息
select * from student where sdept not in(计算机系,文学系);
5.模糊查询
亦称:字符匹配符查询
like:给定一个字符模板,拿上模板来和表中的数据进行匹配,匹配成功就会有输出。
%代表的是0个或多个字符,_代表的是一个字符
格式:select 列名|* from 表名 where 列名 like ‘字符模板’;
-- 从student表中查看姓王的学生有哪些?
select * from student where sname like '王%';
not like:表示不需要某个指定模式的数据。
格式:select 列名|* from 表名 where 列名 not like ‘字符模板’;
判空操作
1.数据库中判空操作
格式:select 列名|* from 表名 where 列名 is null;
2.不为空的判定
格式:select 列名|* from 表名 where 列名 is not null;
-- 查看没有考试成绩的学生信息 sc表
select * from sc where grade is null;
-- 查看有考试成绩的学生信息 sc表
select * from sc where grade is not null;
聚合函数
SUM:求列和——sum(列名)
AVG:求列平均值——avg(列名)
MAX:求列最大值——max(列名)
MIN:求列最小值——min(列名)
COUNT(*):统计表中元组个数
COUNT(列名):统计该列中元组个数
格式:select 聚合函数 from 表名;
-- 成绩求和
select sum(grade) '总成绩' from sc;
-- 成绩求平均分,最高分,最低分
select avg(grade) '平均成绩',max(grade) '最高分',min(grade) '最低分' from sc;
-- 从student表中统计学生人数
select count(*) '总人数' from student;
-- 从sc表统计下有成绩的记录数
select count(grade) '成绩的记录数' from sc;
除了count(*)统计时会把null值加入计算,其他函数在计算过程中均忽略空值。
行数限定
limit:指定行数查看——从某一行数据开始查看到指定行结束
格式:select 列名|* from 表名 limit [指定开始位置的下标,]查询的总行数;
下标=位置-1
-- 查看student表中前四行数据
select * from student limit 4;
-- 查看student表中数据,从第三行开始查看,查看四条记录
select * from student limit 2,4;
分组
group by语句用于结合合计函数,根据一个或多个列队结果集进行分组。
格式:select 列名 聚合函数 from 表名 group by 列名;
-- 从student表中,统计每个专业有多少人?
-- 分析:该处要查询的是总人数,只不过统计维度具体到每个专业
select sdept,count(*)
from student
group by sdept;
-- 从sc表中,统计每门课的选课人数?
select cno,count(*) '选课人数'
from sc
group by cno;
-- 从sc表中,统计每个学生的选课人数
select sno,count(*) '选课门数'
from sc
group by sno;
分组条件
having指的是在分组查询过程中,有额外的分组条件,条件放在having之后
格式:
select 列名,聚合函数 from 表名 group by 列名 having 聚合函数当条件;
注意:1.having的使用必须有group by语句
2.where后面不能直接写聚合函数,having是可以的。
-- 从sc表查看选课门数大于等于3门课的学生信息(学号,选课门数)
select sno,count(*) '选课门数'
from sc
group by sno
having count(*)>=3;
排序
order by:针对查询出来的列进行升序或降序排列
格式:
select 列名|* from 表名 order by 列名 asc|desc;
默认情况下是asc(升序排列)
总结
查询语句的语法结构格式如下
如果这些关键词都出现,先后顺序如下:
如果还想再深入了解mysql可以看这篇: