快乐中秋,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!收工