摸到 SQL 的门把手【上篇】

摸到 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;

这个地方没有什么干货,就是照着打就可以了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260