目录
一. 基础概念
- 关系型数据库
- 行式存储
二. 基础命令
- 命令分类
- 基础命令
- 数据库中常用的数据类型
- 修改数据基本命令
三. MySQL建表约束
- 主键约束
- 自增约束
- 外键约束
- 唯一约束
- 默认约束
- 非空约束
四. MySQL查询
一. 基础概念
1. 关系型数据库
关系型数据库又称为关系型数据库管理系统(RDBMS),它是利用数据概念实现对数据处理的算法,达到对数据及其快速的增删改查操作。
既然被称为关系型数据库,那么它的关系在哪里体现呢?
比如有表单A 和 表单B
其中:
表单A 中有一个名为user_id的字段
表单B 中也有一个名为user_id的字段
可以将他们建立一种联系,当修改表单A的user_id的值时,表单B 中的user_id的值也会自动进行修改,因为他们建立的关系,使得数据具有一致性。这就是所谓的关系型
非关系型数据库正如它的名字,每条数据间都是独立存在的,没有什么关系。
2. 行式存储
name | age | sex |
---|---|---|
二. 基础命令
1. 命令分类
- DML|数据库操控语言|对表中的数据进行增删改|insert delete update
- DQL|数据库查询语言|对表中的数据进行查询|select
- DDL 数据库定义语言|对数据库,数据表结构进行处理|create alter drop
2. 基础命令
- 创建数据库:
create database yolanda; - 查看数据库:
show databases; - 引用数据库:
use yolanda; - 创建表:
create table stu(name varchar(10),age int); - 描述表的结构:
desc stu; - 查看创建了多少张表:
show tables; - 删除表:
drop table stu; - 修改表:
- 加一列:alter table 表名 add 列名
- 修改列名:alter table 表名 change 列名
- 删除列:alter table 表名 drop 列名
3. 数据库当中常用的数据类型
- char/varchar:字符串
- int:整型
- float:浮点型
- date:yyyy-mm-dd 日期值
- year:年份
char和varchar
-
char的长度是不可变的,而varchar的长度是可变的
字段b:类型char(10),值为:abc,存储为:abc (abc+7个空格)
字段d:类型varchar(10),值为:abc,存储为:abc (自动变为3个的长度)
-
超出长度自动截取
字段c:类型char(3),值为:abcdefg,存储为:abc(defg自动删除)
字段e:类型varchar(3), 值为:abcdefg,存储为:abc (defg自动删除)
-
var(10)和char(10),都表示可存10个字符,无论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放10个
-
char最多可以存放255个字符
varchar的最大长度为65535个字节,varchar可存放的字符数跟编码有关
字符类型若为gbk,每个字符最多占2个字节,最大长度不能超过32766个字符
字符类型若为utf8,每个字符最多占3个字节,最大长度不能超过21845个字符 -
char和varchar的最大长度限制是mysql规定的
4. 修改数据基本命令
- 增加 insert
- 删除 delete
- 修改 update
- 查询 select
三. MySQL建表约束
1. 主键约束
- 能唯一确定一张表中的一条数据,给某个字段添加约束,使得该字段不重复且不为空。
- 创建一张表table:
create table user(id int primary key #在id添加主键约束,name varchar(20));
插入数据:
insert into user values(1,‘xiaoming’);
再插入
insert into user values(1,‘xiaoming2’);
报错:因为我们设置了主键,可以使这个字段不重复 - 在id和name上添加主键:
create table user2(id int ,name varchar(20),passwd varchar(20),primary key(id,name))
插入数据:
insert into user2 values(1,‘xiaoming’,‘123’);
再插入数据:
insert into user2 values(2,‘xiaoming’,‘234’);
不报错:因为这个叫做联合主键,只要联合的主键加起来不重复即可,它可以唯一确定一条数据,所以不报错
2. 自增约束
- 创建一张表:
create table user3(id int primary key auto_increment,name varchar(20)); - 插入数据:
insert into user3(name)values(‘zhangsan’);
select * from user3;
没有指定id的情况下会自动加上id
自增约束和主键约束联合起来用,会自动的去管控主键的值,使主键的值不唯一。
3. 外键约束
- 涉及到两个表:父表,子表,父表中没有的数据不能在子表中使用
- 创建两个表:
create table classes(id int primary key,name varchar(20));
create table students(id int primary key,name varchar(20),class_id int,foreign key(class_id)references classes(id)); - 在父表插入数据:
insert into classes values(1,‘yiban’);
insert into classes values(2,‘erban’);
insert into classes values(3,‘sanban’);
insert into classes values(4,‘siban’); - 在子表插入数据:
insert into students values(1001,‘aa’,1);
insert into students values(1002,‘bb’,2);
insert into students values(1003,‘cc’,3);
insert into students values(1004,‘dd’,4); - 再插入以下数据
insert into students values(1005,‘ee’,5);
报错,因为父表中没有5这个class id
父表中的记录如果被子表引用,是不能被删除的。
4. 唯一约束
- 修饰的字段的值不可以重复
- 创建一张表
create table user5(id int,name varchar(20)unique/unique(name)); - 添加唯一性约束:
alter table user5 add unique(name); - 通过修改字段的方式添加唯一性约束:
alter table user5 modify name varchar(20) unique; - 插入内容
insert into user5 values(1,‘zhangsan’);
insert into user5 values(1,‘lisi’); - 再插入以下内容
insert into user5 values(2,‘zhangsan’);
报错:因为这个名字已经有了,不可以重复。 - 如何删除唯一性约束?
alter table user5 drop index name;
5. 默认约束
- 当我们插入字段值的时候,如果没有设置,就会使用默认值
- 创建一张表
create table user6(id int,name varchar(20),age int default 10); - 插入数据
insert into user6(id,name) values(1,‘aa’); - 查看表
select * from user6;
会发现age有默认的值
6. 非空约束
- 修饰的字段不能为空
- 创建表
create table user7(id int not null,name varchar(20)); - id字段不能为空
四. MySQL查询
-
创建以下两张表
- 学生表:stuinfo
ssno:学号
sname:姓名
sage:年龄
create table stuinfo(ssno int primary key,sname varchar(20),sage int);
- 分数表:score
sno:学号
cno:课程编号
score:分数
create table score(sno int primary key,cno int,score int);
- 学生表:stuinfo
-
给学生表中插入数据
insert into stuinfo values(1001,‘aa’,12);
insert into stuinfo values(1002,‘bb’,15);
insert into stuinfo values(1003,‘cc’,13);
insert into stuinfo values(1004,‘dd’,14);
insert into stuinfo values(1005,‘ee’,16); -
给分数表中插入数据
insert into score values(1001,2003,59);
insert into score values(1002,2003,53);
insert into score values(1003,2004,78);
insert into score values(1004,2004,90);
insert into score values(1005,2003,87); -
查出选修了2003这门课(score),不及格的同学的名字(stuinfo)
sname------>ssno------>sno
A.查出选修了2003这门课不及格的学生的学号(score)
select sno from score where cno=‘2003’ and score<60;
B.查出学生姓名
select sname from stuinfo where ssno=‘sno’;
C.查出选修了2003这门课,不及格的同学的名字
select sname from stuinfo where ssno in(select sno from score where cno=‘2003’ and score<60);