资料库:储存资料的地方,一本书,一个电脑,人的脑袋
存储大量的资料,搜索速度要快
SQL Structured Query Language 是一种跟关联式资料库管理系统RDBMS(Relational Database Management System)进行沟通的语言
关联式资料库是如何储存资料的? 将资料储存成一个一个表格tables
设置成主键primary key的那个属性可以唯一的表示区分该资料,可以根据主键进行查询资料
在一个表格中primary key可以不是唯一存在的,有些表格数据需要通过多个primary key来唯一表示
使表格与表格产生关联----------->设置外键foreign key 可以使本表格对应其他表格的primary key(也可以使本表格内部产生关联)
可以同时把primary key 和foreign key 设置为一样的
创建表格
mysql的关键字是蓝色的,我们一般使用大写字母进行区分
表格的名称我们使用反引号引起来(避免与关键字冲突) 反引号在数字1的右边,esc的下面,使用shift进行切换
mysql的数值类型
INT ------整数
decimal(m,n) -------有小数点的数,m是总共有几位数,n表示小数点后面有几位
varchar(n) ---------字串 最多可以存放n个字节以内
blob ---------(Binary Large Object)图片、影片、档案-----------存放二进制资料
date ---------YYYY-MM-DD日期
timestamp --------YYYY-MM-DD HH:MM:SS 记录时间
# 创建资料库
CREATE DATABASE `sql_tutorial`;
SHOW DATABASES;
use `sql_tutorial`;
# 创建表格
create table `student`(
`student_id` int primary key,
`name` varchar(20),
`major`varchar(20)
);
# 删除表格
drop table `student`;
# 改动表格----添加属性
alter table `student` add `gpa` decimal(3,2);
# 改动表格----删除属性
alter table `student` drop `gpa`;
describe `student`;
# 提取数据,*表示全部数据
select * from `student`;
# 插入数据在表格中,按照创建表格中属性的顺序
insert into `student` values(3,'小红','物理');
# 插入数据在表格中,自定义属性的顺序,没有某个属性,则该属性表现为空NULL
insert into `student` (`major`,`student_id`) values('数学',4);
/*constraints 限制约束 可以在创建表格属性时,对其进行约束
约束的分类
在 MySQL 中,主要有下面几种约束:
1、NOT NULL:非空约束,用于约束该字段的值不能为空。比如姓名、学号等。
2、DEFAULT:默认值约束,用于约束该字段有默认值,约束当数据表中某个字段不输入值时,自动为其添加一个已经设置好的值。比如性别。
3、PRIMARY KEY:主键约束,用于约束该字段的值具有唯一性,至多有一个,可以没有,并且非空。比如学号、员工编号等。
4、UNIQUE:唯一约束,用于约束该字段的值具有唯一性,可以有多个,可以没有,可以为空。比如座位号。
5、CHECK:检查约束,用来检查数据表中,字段值是否有效。比如年龄、性别。
6、FOREIGN KEY:外键约束,外键约束经常和主键约束一起使用,用来确保数据的一致性,用于限制两个表的关系,用于保证该字段的值必须来自于主表的关联列的值。在从表添加外键约束,用于引用主表中某列的值。比如学生表的专业编号,员工表的部门编号,员工表的工种编号。
7、auto_increment:自动更正,一般常用于整数
原文链接:https://blog.csdn.net/z_johnny/article/details/113820405*/
# 创建一个带约束的表格
create table `experiment`(
`experiment_id` int auto_increment primary key,
`experiment_time` date unique,
`experiment_operator` varchar(20) default"小冯",
`experiment_result` varchar(20)
);
drop table `experiment`;
insert into `experiment`values(1,'2024-3-11',"小王","成功");
insert into `experiment`(`experiment_time`,`experiment_result`)values('2023-3-12',"失败");
insert into `experiment`(`experiment_time`,`experiment_result`)values('2023-3-13',"失败");
select * from `experiment`;
创建公司资料表格
-- 创建公司资料表格
# 员工
create table `employee`(
`emp_id` int primary key,
`name` varchar(20),
`birth_date` date,
`sex`varchar(1),
`salary`int,
`branch_id`int,
`sup_id`int
);
# 部门
create table `branch`(
`branch_id` int primary key,
`branch_name` varchar(20),
`manager_id`int ,
foreign key(`manager_id`) references `employee`(`emp_id`) on delete set null
# 这里的 on delete set null 表示 如果 某员工离职即员工Id被删除 后 将manager_id置为null
);
# 客户
create table `client`(
`client_id` int primary key,
`client_name` varchar(20) ,
`phone` varchar(20)
);
# 员工-客户对应表
create table `works_with`(
`emp_id` int primary key,
`client_id` int ,
`total_sales` int,
foreign key(`emp_id`) references `employee`(emp_id) on delete cascade,
# 这里的on delete cascade 表示员工的 emp_id 被删掉后,对应工作表格中emp_id也一起删掉
foreign key(`client_id`) references `client`(client_id) on delete cascade
);
# branch_id与sup_id均为foreign key 但是在创建表格时无法直接设置,所以需要改动表格进行设置
-- 改动表格
alter table `employee`
add foreign key(`branch_id`)
references `branch`(`branch_id`)
on delete set null;
alter table `employee`
add foreign key(`sup_id`)
references `employee`(`emp_id`)
on delete set null;
新增公司资料
-- 新增公司资料
-- 注意新增资料的关联关系,最好先新增没有关联关系的资料
insert into `branch`values(1,'研发',null);
insert into `branch`values(2,'行政',null);
insert into `branch`values(3,'资讯',null);
insert into `employee`values(206,'小黄','1998-10-08','F',50000,1,null);
insert into `employee`values(207,'小绿','1985-09-16','M',29000,2,null);
insert into `employee`values(208,'小黑','2000-12-19','M',35000,3,null);
insert into `employee`values(209,'小白','1997-01-22','F',39000,3,null);
insert into `employee`values(210,'小兰','1925-11-10','F',84000,1,null);
# 修改branch里manager_id
update `branch`
set `manager_id` = 208
where `branch_id` = 3;
update `employee`
set `sup_id` = 207
where `name` in ('小白','小兰');
-- 新增客户资料
insert into `client` values(404,'艾瑞克','678012456778');
-- 新增员工与客户资料
insert into `works_with`values(209,402,24040);
select * from `employee`;
select * from `client`;
select * from `branch`;
select * from `works_with`;
取得客户资料
-- 取得客户资料
-- 1.取得所有员工资料
select * from `employee`;
-- 2.取得所有客户资料
select * from `client`;
-- 3.按薪水的高低取得员工资料
select * from `employee` order by `salary`;
-- 4.取得薪水前三高的员工
select *
from `employee`
order by `salary` desc
limit 3;
-- 5.取得所有员工的名字
select `name` from `employee`;
-- 6.取得所有所愿的性别,避免重复
select distinct `sex` from `employee`;
使用聚合函数
-- 使用聚合函数
-- 1.取得员工个数
select count(*) from `employee`;
-- 2.取得所有出生与1970-01-01之后的女性员工人数
select count(*)
from `employee`
where `sex` = 'F' and `birth_date`>'1970-01-01';
-- 3.取得所有员工的平均薪水
select avg(`salary`) from `employee`;
-- 4.取得所有员工薪水的总和
select sum(`salary`) from `employee`;
-- 5. 取得员工的最高薪水
select max(`salary`) from `employee`;
-- 6.取得 员工的最低薪水
select min(`salary`) from `employee`;
使用万用字节
-- %代表多个字节,_代表一个字节
-- 1.取得电话号码尾数是335的客户
select *
from `client`
where `phone` like '%335';
-- 2.取得姓艾的客户
select *
from `client`
where `client_name`like '艾%';
-- 3.取得生日在12月的员工
select *
from `employee`
where `birth_date` like '%-09-%';
使用union
-- union 联集 将搜寻到的结果合并在一起 竖着合并的 合并的属性个数应该相同,且类型也要相同
-- 1. 员工名字和客户名字 或者id和名字
select `name`,`emp_id` from `employee`
union
select `client_name`,`client_id`from `client`;
-- 在这里可以更改合并后的属性名称
select `name` as `total_name`,`emp_id` as `total_id`
from `employee`
union
select `client_name`,`client_id`from `client`;
-- 2.员工薪水和销售的金额
select `salary` as `total_money` from `employee`
union
select `total_sales` from `works_with`;-- union 联集 将搜寻到的结果合并在一起 竖着合并的 合并的属性个数应该相同,且类型也要相同
-- 1. 员工名字和客户名字 或者id和名字
select `name`,`emp_id` from `employee`
union
select `client_name`,`client_id`from `client`;
-- 在这里可以更改合并后的属性名称
select `name` as `total_name`,`emp_id` as `total_id`
from `employee`
union
select `client_name`,`client_id`from `client`;
-- 2.员工薪水和销售的金额
select `salary` as `total_money` from `employee`
union
select `total_sales` from `works_with`;
使用join
-- join 可以把两个表格的资料连在一起
-- 在branch中新增一个资料,是为了便于下面join的演示
insert into `branch` values(4,'偷懒',null);
-- 取得所有部门经理的名字
select *
from `employee`
join `branch`
on `emp_id` = `manager_id`;
select `emp_id`,`name`,`branch_name`
from `employee`
join `branch`
on `employee`.`emp_id` = `branch`.`manager_id`;
-- 不管条件是否成立,左边的表格都要回传
select `emp_id`,`name`,`branch_name`
from `employee`
left join `branch`
on `employee`.`emp_id` = `branch`.`manager_id`;
-- 不管条件是否成立,右边的表格都要回传
select `emp_id`,`name`,`branch_name`
from `employee`
right join `branch`
on `employee`.`emp_id` = `branch`.`manager_id`;
子查询 subquery
-- subquery 子查询 在一个搜寻语句中再写一个搜寻语句
-- 1.找出研发部门的经理名字
select `name`
from `employee`
where `emp_id` = (
select `manager_id`
from `branch`
where `branch_name` = '研发'
); # 这里括号中是另一个搜索语句,也就是子查询 subquery
-- 2.找出一位客户的销售金额超过50000的员工名字
select `name`
from `employee`
where `emp_id` in (
select `emp_id`
from `works_with`
where `total_sales`>50000
); # 请注意当你使用等号时,应该是一行数据,当是多行数据时,请使用in
删除
-- 删除 on delete
delete from `employee`
where `emp_id` = 207;
select * from `branch`;
select * from `works_with`;
用python连接 mysql 未学习