MYSQL

了解数据库(非必修)

DDL语句:数据库定义语言(进行库表操作:create创建,alter修改,drop删除)

DML语句:针对数据操作(进行数据的操作:create创建,alter修改,delete删除,select查询)

数据库系统DBS:

DBS=DB+DBMS+应用系统+数据库管理员(DBA)+用户

mysql数据库sql语法chm文档_mysql


关系模型:

mysql数据库sql语法chm文档_表名_02


mysql数据库sql语法chm文档_mysql数据库sql语法chm文档_03


mysql数据库sql语法chm文档_mysql_04


关系运算(从表的角度进行操作):选择(从行的角度选择若干个行)、投影(从列的角度选择若干个列)、连接(若把集合A看成表A,集合B看成表B,A和B进行连接运算会把两个表中匹配的数据结合起来)

关系模型引入范式(NF)消除存储异常,保证数据的合法性,减少数据冗余,保证数据完整性和存储效率。一般情况下是要遵循第三范式的要求。即3NF

mysql数据库sql语法chm文档_sql_05


一个基本的关系型数据库要满足第一范式,一个完整的关系型数据库要满足第三范式

一、数据库基础语句

查询数据库

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 表名;

数据的完整性

指的是存储在数据库中的数据应该保证数据的准确性和可靠性

那么如何保证数据的可靠性和准确性—需要关系的完整性约束(限制或者要求)

– 实体完整性

mysql数据库sql语法chm文档_数据库_06

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.域完整性

mysql数据库sql语法chm文档_sql_07

描述:域完整性可以确保不会输入无效的值

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数据库sql语法chm文档_mysql_08


如果还想再深入了解mysql可以看这篇: