快乐中秋,SQL小白入门指南
创建表
最基本的创建
在mysql中,数据的家就叫做表,张三住在张家,李四住在李家,他们属于一个家庭单元,mysql的表也是一样的逻辑。
我们可以给mysql的表起一个名字,然后规定表里面的成员有哪些,例如整个宇宙都在用的student的例子:
create table student (
s_name varchar(120) comment '学生的名字',
s_age integer comment '学生的年龄',
s_class varchar(120) comment '学生的班级'
)
像这样执行一下我们就能给我们的学生创建一个大家庭啦。
这样我们就得到了一个类似excel表里的东西:
| s_name | s_age | s_class |
|---|---|---|
| 学生的名字 | 学生的年龄 | 学生的班级 |
当然,这个语句里面还有几个值得注意的地方
1、comment语句,是用来给这个字段加一个中文的注释的.
2、varchar(数字) 是用来规定字段的类型的
我们可以简单理解mysql的类型,无非就是数字和字符还有时间,数字就是integer,字符就是varchar,大部分情况下int和varchar已经够用了,对于我们初学者来说,只需要分辨它的数据类型是字符串还是数字还是时间就好啦。
怎么查看一个已经建好的表的信息呢
desc student;
用Desc关键字加表名就可以查到啦,大概就是像下面的结果:
s_name varchar(120)
s_age int(11)
s_class varchar(120)
基本上跟我们输入的一毛一样对不对。
对于初学者来说,创建表理论上只需要懂这么多就可以了。总结下来就是各回各家各找各妈每个数据都有自己的家,它们在mysql里面的名字叫“表”。
如果你到了后期想要知道更多的关于创建表的知识,欢迎提问。
修改字段
修改字段使用alter语句,那为啥我们要修改字段嘞?因为有些时候我们建了一个表,起初就像是我们在上面兼得student表,它只有三个字段,姓名年龄班级,但是恰好某一天班主任因为一件特殊的事情,他想要知道学生们的身高。
那我们就需要去改一下我们建好的表啦。
使用这个语句来更改mysql中的表:
alter table student add column s_height integer comment '学生的身高'
上面的是我们在这个表里面,add column , 新增了一个字段,后面的信息跟创建表的时候一毛一样.
运行这个就能给student加一个身高字段啦!
那么问题来了,如果班主任发现学生的名字比120个字符还要大怎么办?
s_name varchar(120) 我们知道上面给学生的名称设置了120个字符,万一有一个学生叫尼古拉斯安琪拉大鱼宝贝...,得,名字比120个字符还要多咋办?
哈哈哈,不慌,我们还可以用alter来更改字段的长度!
alter table student modify column s_name varchar(225) comment '学生的名字'
这样就可以啦!
还是一样,初学者知道怎么加字段和改字段信息就行了。注意,改字段要考虑已经有了的数据哦,万一你把一个本来120个字符的名字,改成了20个字符,岂不是大家的长度都不够啦
插入数据
现在我们已经有了一个完美的student表啦,但是,它里面还没有学生入住,辣怎么行!我们必须得给里面插入一些数据才行吧,否则班主任就太孤独了。
我们用下面的语句在mysql中插入一条数据:
insert into student (
s_name,
s_age,
s_class,
s_height
) values (
'张三丰',
17,
'三年二班',
188
)
让我来翻译一下这个语句吧:
insert into student (
这里写每个成员的信息列表
) values (
这里写每个信息的值
)
怎么样,插入语句是最简单的了吧,注意被一个信息对应了每一个数据的顺序,并且你输入的值,需要跟自己规定的一样哦,各回各家,各找各妈
嫌弃一次只能插入一条数据太慢?辣怎么行!mysql支持用逗号把很多values隔开,这样就能一次性插入多条啦
insert into student (
s_name,
s_age,
s_class,
s_height
) values (
'张四丰',
16,
'一年二班',
160
),
(
'李五六',
15,
'幼年大班',
177
)
修改和删除数据
修改
哎呀,突然发现刚刚插入的数据,张三丰的身高弄错了怎么办!他明明是2米的!辣怎么行!
不慌,mysql可以改,使用update语句就可以改了
update student set s_height=200 where s_name='张三丰'
这里我们还接触到了where这个条件语句,它的意思就是生效的范围,我们在修改数据的时候,一定不要忘记加where哦,如果你这么写:
update student set s_height=200;
那么你就完蛋啦, 你会把所有人的身高都改成200。
赶紧卷铺盖跑路了。
删除
我们决定开除李五六,没有别的理由,用下面的语句就好:
delete from student where s_name = '李五六'
记住一定不要忘记加where,在delete的时候还应该加上limit 100
delete from student where s_name = '李五六' limit 100
这样可以保住小命哦.
第一个查询
终于到了激动人心的时候了
让我们先来简单了解下select的简单结构
select 字段列表 from 表名 where 条件
怎么样,很简单吧,例如我现在要看一下student里面的张三丰
select * from student where s_name='张三丰'
显示的结果会是:
| s_name | s_age | s_class | s_height |
|---|---|---|---|
| 张三丰 | 17 | 三年二班 | 200 |
很简单吧,以此类推,如果我们只想知道张三丰所在的班级,应该这么查:
select s_class from student where s_name='张三丰'
| s_class |
|---|
| 三年二班 |
这样就查出来张三丰属于三年二班啦.
条件语句
哈哈哈,九阳神功已经练成,让我们来多尝试几次
使用age的大小比较,查看大于16岁的学生:
select * from student where s_age > 16
| s_name | s_age | s_class | s_height |
|---|---|---|---|
| 张三丰 | 17 | 三年二班 | 200 |
使用多个条件并联,大于15岁且身高小于190的学生
select * from student where s_age > 15 and s_height < 190
| s_name | s_age | s_class | s_height |
|---|---|---|---|
| 张四丰 | 16 | 一年二班 | 160 |
like语句
like语句的作用是做模糊匹配,例如我们隐隐约约记得一个叫张x的人,我们可以通过like来模糊查找:
select * from student where s_name like '%张%'
| s_name | s_age | s_class | s_height |
|---|---|---|---|
| 张三丰 | 17 | 三年二班 | 200 |
这里有一个知识点:
1、like '%张%' 字符前后都有%,表示匹配到“张”这个字就会命中
2、like '%张' 只有字符前有%,表示字符末尾匹配到“张”这个字才会命中
3、like '张%' 只有字符后有%,表示字符开头匹配到“张”这个字才会命中
你学废了吗?
join操作解释
在mysql中,最令人头疼的除了group by恐怕就是join语句了,left join ? right join ? 辣怎么行!完全看不懂!
JOIN的含义就如英文单词“join”一样,连接好多表,大致分为内连接,外连接,右连接,左连接,自然连接.
JOIN 就是将一张表的每一条记录,与另一张表的每一条记录强行拼在一起。
所以,如果A表有n条记录,B表有m条记录,结果就会产生n*m条记录。
强扭的瓜虽然不甜,但是join的瓜还是很甜的。
为了便于实验,我们现在新建一个表插入一些数据
1、学校表
create table school (
sch_name varchar(120) comment '学校的名称',
sch_address varchar(220) comment '学校的地址'
)
弄几个学校进去
insert into school (sch_name, sch_address) values (
'手大',
'北京东路32号'
),
(
'肚子大',
'朝阳南路1号'
),
(
'脸大',
'南京南路3号'
)
老师表
create table teacher (
tea_name varchar(120) comment '老师的名字',
tea_subject varchar(220) comment '老师教的科目'
)
insert into teacher (
tea_name,
tea_subject
) values (
'马爸爸',
'社会学'
),
(
'王爸爸',
'资本论'
),
(
'特靠谱',
'嘴炮学'
)
好的,万事大吉!现在我们就可以试试join长啥样了
JOIN
select * from student as A join school B join teacher C
as语句是给这张表起一个好记的名字,因为student school teacher在这一串查询条件里面太长了,所以给他们叫A、B、C好了
这里我们可以看看最终得到了什么样的数据?
——一共可以得到8个字段共18条数据,实在是太多啦,我简单列举出张三丰的数据:
| s_name | s_age | s_class | s_height | sch_name | sch_address | tea_name | tea_subject |
|---|---|---|---|---|---|---|---|
| 张三丰 | 17 | 三年二班 | 200 | 脸大 | 南京南路3号 | 马爸爸 | 社会学 |
| 张三丰 | 17 | 三年二班 | 200 | 脸大 | 朝阳南路1号 | 王爸爸 | 资本论 |
| 张三丰 | 17 | 三年二班 | 200 | 脸大 | 北京东路32号 | 特靠谱 | 嘴炮学 |
| 张三丰 | 17 | 三年二班 | 200 | 肚子大 | 朝阳南路1号 | 王爸爸 | 资本论 |
| 张三丰 | 17 | 三年二班 | 200 | 肚子大 | 南京南路3号 | 马爸爸 | 社会学 |
| 张三丰 | 17 | 三年二班 | 200 | 肚子大 | 北京东路32号 | 特靠谱 | 嘴炮学 |
| 张三丰 | 17 | 三年二班 | 200 | 手大 | 朝阳南路1号 | 马爸爸 | 社会学 |
| 张三丰 | 17 | 三年二班 | 200 | 手大 | 南京南路3号 | 王爸爸 | 资本论 |
| 张三丰 | 17 | 三年二班 | 200 | 手大 | 北京东路32号 | 特靠谱 | 嘴炮学 |
可以看到join操作就是把这几张表,强行拼凑在一起
我们也可以加上where条件,控制数据
select * from student as A join school B join teacher C where A.s_name='张三丰' and B.sch_name='手大' and C.tea_name='特靠谱'
这样我们就只拿了一条数据:
| s_name | s_age | s_class | s_height | sch_name | sch_address | tea_name | tea_subject |
|---|---|---|---|---|---|---|---|
| 张三丰 | 17 | 三年二班 | 200 | 手大 | 北京东路32号 | 特靠谱 | 嘴炮学 |
所以JOIN的作用是什么?就是把几张表强行揉在一起.
我们可以在join的表名后加on语句,它跟where是一样的,但是它是join表的条件语句
select * from student as A join school B on B.sch_name='脸大' join teacher C
| s_name | s_age | s_class | s_height | sch_name | sch_address | tea_name | tea_subject |
|---|---|---|---|---|---|---|---|
| 张三丰 | 17 | 三年二班 | 200 | 脸大 | 南京南路3号 | 马爸爸 | 社会学 |
| 张三丰 | 17 | 三年二班 | 200 | 脸大 | 朝阳南路1号 | 王爸爸 | 资本论 |
| 张三丰 | 17 | 三年二班 | 200 | 脸大 | 北京东路32号 | 特靠谱 | 嘴炮学 |
这样join的表就过滤掉了其他的数据,跟where条件的作用是一样的.
INNER JOIN
inner join 又叫做内连接,emm,其实它就是取交集,
我们前面知道了join是强行把几张表揉在一起,而inner join,是把几张表的交集部分揉在一起。(交集,就是几个表中共有的一摸一样的那部分)
inner join 是一定要写on的,如果不写on的话,就跟join差不多啦。在on中写出a和b交集的部分.
为了演示,我得再给老师表加一个班级字段,然后改掉马爸爸的班级
alter table teacher add column tea_class varchar(200) comment '老师的班级';
update teacher set tea_class='三年二班' where tea_name='马爸爸';
好啦接下来我们试一下inner join
select * from student as A inner join teacher C on C.tea_class=A.s_class
| s_name | s_age | s_class | s_height | tea_name | tea_subject | tea_class |
|---|---|---|---|---|---|---|
| 张三丰 | 17 | 三年二班 | 200 | 马爸爸 | 社会学 | 三年二班 |
这样我们就查出来老师马爸爸所在的三年二班的所有学生列表了。
amazing!
可以再插入一个学生再查询一次试试:
insert into student (
s_name,
s_age,
s_class,
s_height
) values
(
'王八',
22,
'三年二班',
177
)
| s_name | s_age | s_class | s_height | tea_name | tea_subject | tea_class |
|---|---|---|---|---|---|---|
| 王八 | 22 | 三年二班 | 200 | 马爸爸 | 社会学 | 三年二班 |
| 张三丰 | 17 | 三年二班 | 177 | 马爸爸 | 社会学 | 三年二班 |
amazing!
LEFT JOIN
left join 又叫做左连接,它对应的还有一个右连接,emm,其实它也是取交集,
left join含义就是求两个表的交集外加左变表剩下的数据。 跟innerjoin的区别就在于它会同时拿到左边表剩下的数据!
让我们来运行一个查询试试
select * from student as A left join teacher C on C.tea_class=A.s_class
| s_name | s_age | s_class | s_height | tea_name | tea_subject | tea_class |
|---|---|---|---|---|---|---|
| 王八 | 22 | 三年二班 | 200 | 马爸爸 | 社会学 | 三年二班 |
| 张三丰 | 17 | 三年二班 | 177 | 马爸爸 | 社会学 | 三年二班 |
| 张四丰 | 16 | 一年二班 | 160 | 空 | 空 | 空 |
amazing,这样看是不是很明显了?
left join就是left join语句左边的表,保留全部数据,同时连接上右边的表,不匹配的字段就是空的。
RIGHT JOIN
与left join极为相似,只是它取的是left join语句右边的表的全部数据,不匹配的字段是空的。
select * from student as A right join teacher C on C.tea_class=A.s_class
| s_name | s_age | s_class | s_height | tea_name | tea_subject | tea_class |
|---|---|---|---|---|---|---|
| 王八 | 22 | 三年二班 | 200 | 马爸爸 | 社会学 | 三年二班 |
| 张三丰 | 17 | 三年二班 | 177 | 马爸爸 | 社会学 | 三年二班 |
| 空 | 空 | 空 | 空 | 王爸爸 | 资本论 | 空 |
| 空 | 空 | 空 | 空 | 特靠谱 | 嘴炮学 | 空 |
amazing!
group by
终于讲到了这里!你也看到了这里!
group by,顾名思义,就是分组
直接上一个简单的例子看一下:
select s_name,s_class from student group by s_class
| s_name | s_class |
|---|---|
| 张三丰 | 三年二班 |
| 张四丰 | 一年二班 |
顾名思义,就是按照s_class字段来进行分组,把所有重复的剔除掉,只保留不一样的那一行,可以看到这次的结果里面没有“王八”那一条数据,因为它跟其他的数据重复了。因为王八跟张三丰都是同一个班级“三年二班”的,group by去掉了重复的行。
一般group by是搭配统计函数count来使用的,往下看就可以看到啦。
having
group by 还可以写分组过后的条件语句,其实它的写法跟where一样的,只是它是专门写在group by后面的。
select s_name,s_class from student group by s_class having s_name='张三丰'
| s_name | s_class |
|---|---|
| 张三丰 | 三年二班 |
order by
order by 就更简单了,就是根据后面的字段来排序,desc是倒序,asc是正序,字符比首字母,数字比大小,日期比先后
select s_name,s_class,s_age from student group by s_name,s_class,s_age order by s_age desc
| s_name | s_class | s_age |
|---|---|---|
| 王八 | 三年二班 | 22 |
| 张三丰 | 三年二班 | 17 |
| 张四丰 | 一年二班 | 16 |
order by跟group by一起用的时候,写在group by后面哦
简单函数
count
在group by那里我们看到了group by的用法,一般我们用的最多的还是使用group by来count一个数据出现的次数
例如
select s_name, count(1) as num from student group by s_name
| s_name | num |
|---|---|
| 王八 | 1 |
| 张三丰 | 1 |
| 张四丰 | 1 |
它们仨都只出现了一次,如果我们再插入一条数据:
insert into student (
s_name,
s_age,
s_class,
s_height
) values
(
'王八',
22,
'三年二班',
177
)
再来查询一遍
select s_name, count(1) as num from student group by s_name
| s_name | num |
|---|---|
| 王八 | 2 |
| 张三丰 | 1 |
| 张四丰 | 1 |
三年二班就有2只王八了。
max min avg
1、然后我们可以使用max获取最大的那一个数据
select max(s_age) as max_age from student
结果是22
2、使用min获取最小的哪一个数据:
select min(s_age) as min_age from student
结果是16
3、使用avg获取平均值
select avg(s_age) as avg_age from student
结果是19.25
它们的妙用在这里
1、找到年龄最大的同学
select s_name from student where s_age=(
select max(s_age) as max_age from student
)
2、找到年龄最小的同学
select s_name from student where s_age=(
select min(s_age) as max_age from student
)
3、找到年龄比平均年龄小的同学
select s_name from student where s_age<(
select avg(s_age) as max_age from student
)
str_to_date date_format
1、str_to_date把字符转换成时间
select str_to_date('2021-10-01', '%Y-%m-%d');
2、date_format把时间转成想要的字符串
select date_format(NOW(), '%Y哈哈哈%m哈哈哈%d');
ps 中间的哈哈哈可以换成任意的东西哦, NOW()是查询当前时间
其他函数
菜鸟教程有一堆关于其他函数的描述,可以看看
https://www.runoob.com/mysql/mysql-functions.html
结束
game over!收工
快乐中秋,SQL小白入门指南的更多相关文章
- Linux运维完全小白入门指南
前几天整理了一下自己入门时候搜集的资料,一边整理一边回忆. 那时候我还是个小白,用虚拟机装了个CentOS系统来玩,但是总也装不上,在论坛上求助也没人理.半天终于有个人说在某网站看过这个问题,我又找了 ...
- Event Hub小白入门指南
Event Hub事件中心 本文的目的在于用最白的大白话,让你从“完全不懂”开始,理解什么是分布式大数据流平台Event Hub,并且理解它的关键概念,并且初步理解其收发数据API. 定义,Event ...
- AngularJS快速入门指南09:SQL
我们可以将之前章节中的代码用来从数据库中读取数据. 通过PHP Server从MySQL数据库中获取数据 <div ng-app="myApp" ng-controller= ...
- CTF入门指南
转自http://www.cnblogs.com/christychang/p/6032532.html ctf入门指南 如何入门?如何组队? capture the flag 夺旗比赛 类型: We ...
- CTF入门指南(0基础)
ctf入门指南 如何入门?如何组队? capture the flag 夺旗比赛 类型: Web 密码学 pwn 程序的逻辑分析,漏洞利用windows.linux.小型机等 misc 杂项,隐写,数 ...
- sql 注入入门
=============安全性篇目录============== 毕业开始从事winfrm到今年转到 web ,在码农届已经足足混了快接近3年了,但是对安全方面的知识依旧薄弱,事实上是没机会接触相关 ...
- [CTF] CTF入门指南
CTF入门指南 何为CTF ? CTF(Capture The Flag)夺旗比赛,在网络安全领域中指的是网络安全技术人员之间进行技术竞技的一种比赛形式.CTF起源于1996年DEFCON全球黑客大会 ...
- Web API 入门指南 - 闲话安全
Web API入门指南有些朋友回复问了些安全方面的问题,安全方面可以写的东西实在太多了,这里尽量围绕着Web API的安全性来展开,介绍一些安全的基本概念,常见安全隐患.相关的防御技巧以及Web AP ...
- ASP.NET MVC 5 入门指南汇总
经过前一段时间的翻译和编辑,我们陆续发出12篇ASP.NET MVC 5的入门文章.其中大部分翻译自ASP.NET MVC 5 官方教程,由于本系列文章言简意赅,篇幅适中,从一个web网站示例开始讲解 ...
随机推荐
- 基于ivy的源代码调试方法
项目PORJ_TEST是项目PROJ的测试项目.在它的ivy中引用了PROJ的jar包.由于PROJ正处于开发阶段,源代码更改频繁, 在运行PROJ_TEST中的测试时,需要进入PROJ的jar包内部 ...
- Activity与Service生命周期
一. Activity 先展示一张Activity的生命周期图: 1.1 Activity状态 只有下面三个状态是静态的,可以存在较长的时间内保持状态不变.(其它状态只是过渡状态,系统快速执行并切换到 ...
- Mysql的分区表
概论: 分区表一般用作Mysql库表的水平切割(也就是常说的mysql性能优化的几种通用手法"读写分离.分库分表"中的一种),适用于单表的数据量可能很大的场景.因为分区表可以将一个 ...
- docker部署Redis6-0-6
下载redis.conf配置 下载地址: http://download.redis.io/redis-stable/redis.conf 拉取docker镜像 docker pull redis:6 ...
- MySQL临时表与内存表
在MySQL中有三种虚拟表:临时表.内存表.视图.下面简单介绍一下临时表和内存表的使用. 1.临时表 MySQL临时表在我们需要保存一些临时数据时是非常有用的.临时表在MySQL 3.23版本中添加. ...
- VMware中安装CentOS Linux release 7.4.1708 (Core)
本篇文章主要介绍了VMware安装Centos7超详细过程(图文),具有一定的参考价值,感兴趣的小伙伴们可以参考一下 1.软硬件准备 软件:推荐使用VMwear,我用的是VMwear 12 镜像:Ce ...
- Longhorn 云原生容器分布式存储 - Air Gap 安装
内容来源于官方 Longhorn 1.1.2 英文技术手册. 系列 Longhorn 是什么? Longhorn 云原生容器分布式存储 - 设计架构和概念 Longhorn 云原生容器分布式存储 - ...
- 记一次 .NET 某流媒体独角兽 API 句柄泄漏分析
一:背景 1. 讲故事 上上周有位朋友找到我,说他的程序CPU和句柄都在不断的增长,无回头趋势,查了好些天也没什么进展,特加wx寻求帮助,截图如下: 看的出来这位朋友也是非常郁闷,出问题还出两个,气人 ...
- React 性能调优记录(下篇),如何写高性能的代码
react性能非常重要,性能优化可以说是衡量一个react程序员水平的重要标准. 减少你的渲染 这个大家都明白,只要是父组件中用了子组件,子组件就算没用prop也会进行依次渲染, 可以用pureCom ...
- deepin-terminal改造风云再起
1. 创作背景 使用deepin-terminal的时候,我发现一些小的问题. 在论坛的帖子(https://bbs.deepin.org/zh/post/224502)也总结反馈了这些问题 终端标签 ...