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

posted @ 2021-09-22 18:46  张泰峰  阅读(485)  评论(2编辑  收藏  举报