2021-01-17~2021-01-18数据库学习

概要:
1.约束条件
2.表与表之间建立关系
3.修改表的完整语法
4.复制表
5.建立表关系的xmind

约束条件

default默认值
#补充知识点 插入数据时可以指定字段

create table t1(
id int,
name char(16)
);
insert into t1(name,id) values("mzy",1);
create table t2(
id int,
name char(16) not null,
#这里表示非空字段
gender enum("male","female","others") default "male"
#默认字段是“male”
);
insert into t2(id,name) values(1,"jason");
insert into t2 values(2,"egon","female");

t1表段
在这里插入图片描述
t2表段
在这里插入图片描述
t2表插入数据后的结果:
2021-01-17~2021-01-18数据库学习_第1张图片

unique唯一

1.单列唯一

create table t3(
id int unique,
name char(16)
);
insert into t3 values(1,"jason"),(1,"egon");

t3表的描述:
2021-01-17~2021-01-18数据库学习_第2张图片
#插入后报错:
在这里插入图片描述

2.联合唯一
类似于ip和port
补充:
ip:IP地址是指互联网协议地址(英语:Internet Protocol Address,又译为网际协议地址),是IP Address的缩写。IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。目前还有些ip代理软件,但大部分都收费。
port:是一种接口,数据通过它在计算机和其它设备(如打印机、鼠标、键盘或监视器)之间、网络之间或和其它直接连接的计算机之间传递。端口对CPU来说,是作为它用来发送或接收数据的一个或多个内存地址的。专用硬件,比如在附加电路板中,将来源于设备的数据放置于内存地址中,并将来源于内存地址的数据发送到该设备。端口可以专门只用于输入和输出。端口通常接收用于特定目的的特定类型的插头。例如,串行数据接口、键盘和高速网络端口都使用不同的连接器,因此将电缆插错端口是不可能的。

create table t4(
id int,
ip char(16),
port int,
unique(ip,port)
);
insert into t4 values(1,'127.0.0.1',8080);
insert into t4 values(1,'127.0.0.2',8082);
insert into t4 values(1,'127.0.0.2',8080);
insert into t4 values(1,'127.0.0.1',8080);

输出结果:
2021-01-17~2021-01-18数据库学习_第3张图片

primary key 主键

单单从约束效果上看primary key等价与not null +unquie(非空且唯一)

create table t5(id int primary key);
insert into t5 values(null);
insert into t5 values(1),(1);

desc t5
2021-01-17~2021-01-18数据库学习_第4张图片
代码结果:2021-01-17~2021-01-18数据库学习_第5张图片

#它除了有约束条件效果之外,它还是innodb引擎,组织数据的依据innodb存储引擎在创建表的时候必须有primary key,因为它类似于书的目录 能够帮助提示查询效率并且也是创建表的依据。
##1一张表中有且只有一个主键 如果你没有设置主键 那么会从上往下搜索直到遇到一个非空且唯一的字段将它自动升级成主键1##

create table t6(
id int,
name char(16),
age int not null unique,
addr char(32) not null unique
);

测试代码结果:
2021-01-17~2021-01-18数据库学习_第6张图片

##2如果表中没有主键也没有其他任何非空且唯一字段 那么innodb会采用自己内部提供的一个隐藏字段为主键 隐藏意味着你无法使用它 就无法提升查询速度。2##
##3一张表中都应该有一个主键字段 并且将id字段作为主键3##
单个字段主键:

create table t5(
id int primary key,
name char(16)
);
create table t4(
id int,
ip char(16),
port int,
primary key(ip,port)
);

auto_increment自增

当编号特别多的时候 人为的去维护太麻烦 这时用到了自增

create table t8(
id int primary key auto_increment,
name char(16)
);
insert into t8(name) values("mzy"),("lfl"),("lwj");

代码测试结果:
2021-01-17~2021-01-18数据库学习_第7张图片
##1auto_increment只能加在key建上 不能给普通字段加(报错)1##
补充
删除数据后,用auto_incremnet 主键的自增不会停止
##truncate t1 清除表数据并且重置(使用方法等于delete)
2021-01-17~2021-01-18数据库学习_第8张图片

外键介绍

外键就是用来帮助我们建立表与表之间的关系的
表关系:
1·一对多
2·多对多
3·一对一关系
4·没有关系
sql语句建立表关系

#foreign key(dep_id) references dep(id);
#意思是dep_id 是个外键与dep表中的id字段有关系
create table dep(
id int primary key auto_increment,
dep_name char(16),
dep_desc char(32)
);
create table deps(
id int primary key auto_increment,
name char(16),
gender enum("male","female","others") default "male",
dep_id int,
foreign key(dep_id) references dep(id)
);
insert into dep(dep_name,dep_desc) values("教学部","教学"),("设计部","设计东西"),("技术部","代码实现");
insert into deps(name,dep_id) values("jason",2),("egon",1),("tank",1),("mzy",2);

##1一对多表关系 外键字段建在多的一方1##
##2在创建表关系的时候 一定要先建被关联表2##
运行结果:
2021-01-17~2021-01-18数据库学习_第9张图片
2021-01-17~2021-01-18数据库学习_第10张图片
?修改dep里面的dep_id字段,或者deps表里面的id字段(约束条件)
法1:先删除被关联表中的数据,在删除关联表中的数据
法2:

create table dep(
id int primary key auto_increment,
dep_name char(16),
dep_desc char(32)
);
create table deps(
id int primary key auto_increment,
name char(16),
gender enum("male","female","others") default "male",
dep_id int,
foreign key(dep_id) references dep(id)
##加入字段
on update cascade      #同步更新
on delete cascade      #同步删除
);

多对多表关系:
#针对多字段表的关系 不能在两张原有表中创建外键 需要单独在开设一张表专门存储两种表的关系

create table book(
id int primary key auto_increment,
title varchar(32),
ptice int
);
create table author(
id int primary key auto_increment,
name varchar(32),
age int
);
create table book2author(
id int primary key auto_increment,
author_id int,
book_id int,
foreign key(author_id) references author(id)on update cascade on delete cascade,
foreign key(book_id) references book(id)on update cascade on delete cascade
);

#sql语句应该横着写不应该出现换行
因为sql语句识别时,会自动取消换行,于是输入sql语句时,很有可能使语句连在一起,造成语法错误,报错如下:
在这里插入图片描述
一对一的表关系
一对一外界字段建立都可以,推荐建在查询频率较高的表中

create table authordetail(
id int primary key auto_increment,
phone int,
addr varchar(64)
);
create table authors(
id int primary key auto_increment,
name varchar(32),
age int,
authordetail_id int unique,
foreign key(authordetail_id) references authordeatils(id)on update cascade on delete cascade
);

修改表:
##1mysql对大小写不敏感1##
修改表名:
alter table 表名 rename 新表名;
alter table 表名 add 字段名 字段类型(宽度) 约束条件(frist(将字段加到表的前面) after 字段名(将字段加到表的后面));
删除字段:
alter table 表名 drop 字段名;
修改字段:
alter table 表名 modify 字段名 字段类型(宽度) 约束条件;
alter table 表名 change 旧字段名 新字段名 字段类型(宽度) 约束条件;
复制表:
##我们每次sql语句结果其实也是一张虚拟表##
create table 新表名 select * from 旧表 (约束条件);
注意:不能复制主键 外键 索引·····

##如果数据过多 展示错乱 可以用\G分行展示
单独数据展示:

select * from 表名\G;

##如果电脑在插入中文时侯还是会出现乱码,或者空白的现象 你可以将字符编码统一设置成GBK

查询语句

##1几个关键字的执行顺序1##

#书写顺序
select id name from where id >3;
#执行顺序
from > where > select >

where 约束条件
作用:是对整体数据的一个筛选操作

#1查询id>3 id<6 的数据1#
select * from 表名 where id> 3 and id <6;
select * from 表名 where id between 3 and 6;
##两者等价
#2查询 id = 20000 或者 id=1800的数据2#
select * from 表名 where id =20000 or id = 17000;
等于
select * from 表名 where id in (20000,17000);
#3查询name中包含字母o的字符数据3#
#模糊查询详细见下#
select * from 表名 where name like "%o%";
#4查询name有四个字符的4#
select *from 表名 where name like"____";
#char_length()方法
select * from 表名 where char_length(name)=4;
#5查询id小于3或者id大于6的数据5#
select * from 表名 where id not between 3 and 6;
##或者用and 和 or 联合也可以##
#6查询空的数据6#
select * from 表名 where * is NULL;
###这个用is不用等号###

模糊查询
group by 分组

select * from 表名 group by post; 

#分组之后 最小可操作单位应该是组 还不再是组内的单个数据
上述命令在没有设置严格模式的时候可正常执行 返回的是分组之后 每个组的第一条数据 但是这不符合分组规范:分组之后不应该考虑单个数据 而应该以组为单位(分组之后 没有办法直接获取组内单个数据)
###严格模式下直接报错###
设置分组时的严格模式:

`set global sql_mode='strict_trans_tables,only_full_group_by';
#设置严格模式后 分组 默认只能拿到分组的依据
select post from 表名 group by post;
#获取每个部门的最高薪资
select post,max(salary) from emp group by post;
#更换表头名(as) 
select post as '部门',max(salary) as "最高薪资" from emp group by post;
##as可以省略不写但不推荐因为省略后语义不明##
##同理有
最低 min
平均 avg
总和 sum
个数 count
#查询分组后部门名称和每个部门下所有的员工姓名
#group_concat 
select post group_concat(name) from emp group by post;
#不单单支持你获取分组后其他字段值 还支持拼接操作
select post group_concat(name,":") from emp group by post;
#在每个name字段后加上冒号
#还可以加多个字段
select post group_concat(name,":",salary) from emp group by post;
#concat不分组时候用表示筛选拼接
select concat('NAME:',name) from emp;
#查询每个人的年薪
select name,salary*12 from emp;

##as语法也可以给表临时起别名(没啥实际作用)

select t1.id,t1.name from emp as t1;

##1group by 和 where 同时出现时 group by 必须在where的后面1##
##2聚合函数不能在where使用2##
##获取表中最高数据##

select max(salary) from emp;

having分组之后的筛选

having的语法和where一致,但是having是在聚合函数后使用。

distinct去重

##1完全一样的数据才能去重1##

#如:
select distinct id,age from emp;
#不能去重,但
select distinct age from emp;


orm 对象关系映射 让不懂sql语句的人使用mysql      

order by语句

select * from emp order by salary;
select * from emp order by salary asc;
select * from emp order by salary desc;
 #order by默认是升序 asc表示升序(可以不写) desc表示倒序
 #order by 也可以加多个参数
 select * from emp order by age desc,salary asc;
 #先按照年龄倒序,在按照薪资正序

limit语句

limit限制展示条数

select * from emp limit 3;
#从emp数据里面选择三条
select * from emp limit 0,5;
#从emp数据里面选择从零到五的数据
#第一个位置是起始位置
#第二个是展示条数

正则

##mysql可以用正则##

select * from emp where name regexp "正则表达式";

总结的有点晚,感觉需要学的还有很多 ,咸鱼看来永远只是一条咸鱼了>…<

你可能感兴趣的:(python,mysql)