摸到 SQL 的门把手【上篇】
首先为什么要学 SQL ?主要原因是因为公司的 SQL 权限需要考试通过才能拿到权限,我这种 SQL 小渣渣只能考个四五十分作用,永远都过不了,只能自己回炉重造了。那这篇文章就简单整理下关于 SQL 的一些笔记,课程是网易微专业的数据分析师(SQL 和 Excel)
什么是数据库?
有了数据库,才会有表,才会有字段。其实就和有了 Excel 表,才会有 Sheet 表,才会有数据的关系。
这个叫数据库的玩意怎么玩呢?
创建数据库
create database 数据库名称;
-- 例:创建名字是 test 的测试数据库
create database test;
查看创建好的数据库
show create database 数据库名称;
-- 例:查看创建好的 test 数据库
show create database test;
查看所有数据库列表
show databases;
使用数据库
use 数据库名称;
-- 例:使用创建好的 test 数据库
use test;
删除数据库
drop database 数据库名称;
-- 例:删除创建好的 test 数据库
drop database test;
这里我们使用的是 MySQL Workbench 。
点击下 SQL 和 + 的那个图标就可以创建一个数据库。
那上面五条指令在这里打一下看看
大概就是这个样子,比较简单,就和电脑开关机一样的操作。
那我会创建数据库了,那我操作数据表呢?
创建数据表
create table 表名(...);
-- 例:用 SQL 语句创建上图员工信息表
use test; -- 重要,一定要用了数据库才能创建数据表
create table emp(
depid char(3), -- 3 个字节的文本型字段
depname varchar(20), -- 可变长的文本型字段,可存储字节是 20 个字节
peoplecount int -- 整数字段
);
show tables; -- 查看所有数据表
drop table emp; -- 删除 emp 数据表
什么是数据类型?
数据类型就相当于数据的一把锁,比如说这个数据只能是日期,介个数据只能是文本,那个数据只能是小数的意思
这里的 M 是宽度, D 是小数位数
举个例子,如果要存储 5 位长度的字符串,那就要在长度基础上加 1 ,也就是 6 。
什么是约束条件?
就是一个规则,用来统一数据检验的规则,并且保证创建的表叔数据完整和正确。
常用的约束条件有
接下来举个例子
学号:有重复值和空值,不符合主键,非空及唯一三项约束条件
学生成绩:有重复值不符合主键、唯一两项约束条件
成绩:有空值,不符合主键、非空两项约束条件
序号:非空,唯一,自增,符合所有约束条件要求
主键约束
-- 保证表中每行记录都不重复
-- 单字段主键:
create table emp(
depid char(3) primary key,
depname varchar(20),
peoplecount int
);
create table emp(
depid char(3),
depname varchar(20),
peoplecount int
primary key(depname,depid)
);
非空约束
-- 指的是字段的值不能为空
create table emp(
depid char(3) primary key,
depname varchar(20) not null,
peoplecount int
);
唯一性约束
-- 值必须是唯一
-- 允许为空,但只能出现一个空值
-- 一个表中可以由多个字段声明为唯一的
-- 唯一约束确保数据表的一列或几列不出现重复值
create table emp(
depid cher(3) primary key,
depname varchar(20) not null,
peoplecount int unique
);
默认约束
-- 指定某个字段的默认值
-- 当插入记录时如果没有明确字段赋值是,那么系统就会自动为这个字段赋值为默认约束设定的值
create table emp(
depid char(3) primary key,
depname varchar(20) default '-', -- 指定了小线做默认值,如果没有被赋值就会自动填充
peoplecount int unique
);
自增字段
-- 一个表只能有一个自增字段,自增字段必须为主键的一部分。默认情况下从1开始自增
create table example(
id int primary key auto_increment, -- 创建整数型自增主键
name varchar(4) not null, -- 创建非空字符串字段
math int default 0, -- 创建默认值为0的整数型字段
minmax float unique -- 创建唯一约束小数型字段
);
在 MySQL 实践下
use test;
create table emp(
depid char(3) primary key, -- 创建主键
depname varchar(20) not null, -- 创建非空约束
peoplecount int unique default 0 -- 创建整数唯一默认值为 0 的约束
);
desc emp;
create table example(
id int primary key auto_increment, -- 创建整数型自增主键
name varchar(4) not null, -- 创建非空字符串字段
math int default 0, -- 创建默认值为0的整数型字段
minmax float unique -- 创建唯一约束小数型字段
);
desc example;
如何填充数据
用 insert into
语句来插入数据(极少用到,因为很少情况说是直接在 SQL 插入数据的)
insert into 表名(字段) values(...)
-- 插入数据
insert into fruits(f_id,s_id,f_name,f_price) -- 前提需要已经创建好 fruits 这个表
values('a1',101,'apple',5.2),
('b1',101,'blackberry',10.2),
('bs1',102,'orange',11.2),
('bs2',105,'melon',8.2),
('t1',102,'banana',10.3),
('t2',102,'grape',5.3),
('o2',103,'coconut',9.2),
('c0',101,'cherry',3.2),
('a2',103,'apricot',25.2),
('l2',104,'lemon',6.4),
('b2',104,'berry',7.6),
('m1',106,'mango',15.6),
('m2',105,'xbabay',2.6),
('t4',107,'xbababa',3.6),
('b5',107,'xxxx',3.6);
-- 使用数据库
use test;
-- 创建fruits数据表
create table fruits(
f_id char(10) not null,
s_id int not null,
f_name varchar(255) not null,
f_price decimal(8,2) not null,
primary key(f_id)
);
-- 插入数据
insert into fruits(f_id,s_id,f_name,f_price)
values('a1',101,'apple',5.2),
('b1',101,'blackberry',10.2),
('bs1',102,'orange',11.2),
('bs2',105,'melon',8.2),
('t1',102,'banana',10.3),
('t2',102,'grape',5.3),
('o2',103,'coconut',9.2),
('c0',101,'cherry',3.2),
('a2',103,'apricot',25.2),
('l2',104,'lemon',6.4),
('b2',104,'berry',7.6),
('m1',106,'mango',15.6),
('m2',105,'xbabay',2.6),
('t4',107,'xbababa',3.6),
('b5',107,'xxxx',3.6);
select * from fruits;
导入外部数据是怎么导入的呢?
load data local infile '文件路径.txt' -- 导入本地文件数据
into table Monthly_lndicator -- 加到 Monthly_lndicator 的表名里
fields terminated by '\t' -- 导入的数据使用的分隔符,这里指的是 TXT 文件
ignore 1 line; -- 忽略第一行的数据,从第二行开始找数据
那这种需要以下的导入方法
-- 创建大气质量表
create table Monthly_Indicator(
city_name varchar(20) not null,
month_key date not null,
aqi int(4) not null default 0,
aqi_range varchar(20) not null default '-',
air_quality varchar(20) not null default '-',
pm25 float(6,2) not null default 0,
pm10 float(6,2) not null default 0,
so2 float(6,2) not null default 0,
co float(6,2) not null default 0,
no2 float(6,2) not null default 0,
o3 float(6,2) not null default 0,
ranking int(4) not null default 0,
primary key(city_name,month_key) -- 因为城市每天的数据都是不一致的,所以可以用城市名 + 日期来做主键
);
-- 为 Monthly_Indicator 表导入外部 txt 文件
load data local infile 'C:/Users/35055/Desktop/all.txt'
into table Monthly_Indicator
fields terminated by '\t'
ignore 1 lines;
-- 检查倒入内容Monthly_Indicator
select * from Monthly_Indicator;
-- 检查导入数据总行数Monthly_Indicator
select count(*) from Monthly_Indicator;
-- 检查表结构
desc Monthly_Indicator;
这个地方有一个坑,我这里留一个资料
【MySQL实践经验】LOAD DATA INFILE 报错 ERROR 1148 (42000) 或 ERROR 1045 (28000)的解决办法
表数据检查
通常来说把数据导入后还要继续对数据进行三方面的检查。
-- 检查导入内容 Monthly_Indicator
select * from Monthly_Indicator;
-- 检查导入数据总行数 Monthly_Indicator
select count(*) from Monthly_Indicator;
-- 检查表结构
desc Monthly_Indicator;
填充完数据后,怎么修改?
这里的修改是指修改数据表的结构,包括修改表名,修改字段数据类型或者字段名,增加和删除字典,修改字典的排序位置等
-- 例:讲数据表 emp 改成 empdep
alter table emp rename empdep;
-- 例:讲数据表 empdep 中 depname 字段的数据类型由 varchar(20) 修改成 varchar(30)
alter table empdep modify depname varchar(30);
-- 例:将数据表 empdep 中 depname 字段名改为 dep
alter table empdep change depname dep varchar(30);
-- 例:将数据表 empdep 中 dep 字段的字段名改回为 depname,并将该字段数据类型改为 varchar(20)
alter table empdep change dep depname varchar(20);
-- 例:为数据表 empdep 添加新字段 maname ,新字段数据类型为 varchar(10),约束条件为空
alter table empdep add maname varchar(20) not null;
-- 例:将数据表 empdep 中 maname 字段的排序顺序改为第一位
alter table empdep modify maname varchar(10) first;
-- 例:将数据表 emp 中 maname 字段的排序顺序改到 depid 字段之后
alter table empdep modify maname varchar(10) after depid;
-- 例:删除 maname 字段
alter table empdep drop maname;
这个地方没有什么干货,就是照着打就可以了。