创建表
最基本的创建
在mysql中,数据的家就叫做表,张三住在张家,李四住在李家,他们属于一个家庭单元,mysql的表也是一样的逻辑。
我们可以给mysql的表起一个名字,然后规定表里面的成员有哪些,例如整个宇宙都在用的student的例子:
像这样执行一下我们就能给我们的学生创建一个大家庭啦。
这样我们就得到了一个类似excel表里的东西:
当然,这个语句里面还有几个值得注意的地方
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中的表:
上面的是我们在这个表里面,add column , 新增了一个字段,后面的信息跟创建表的时候一毛一样.
运行这个就能给student加一个身高字段啦!
那么问题来了,如果班主任发现学生的名字比120个字符还要大怎么办?
s_name varchar(120) 我们知道上面给学生的名称设置了120个字符,万一有一个学生叫尼古拉斯安琪拉大鱼宝贝…,得,名字比120个字符还要多咋办?
哈哈哈,不慌,我们还可以用alter来更改字段的长度!
这样就可以啦!
还是一样,初学者知道怎么加字段和改字段信息就行了。注意,改字段要考虑已经有了的数据哦,万一你把一个本来120个字符的名字,改成了20个字符,岂不是大家的长度都不够啦
插入数据
现在我们已经有了一个完美的student表啦,但是,它里面还没有学生入住,辣怎么行!我们必须得给里面插入一些数据才行吧,否则班主任就太孤独了。
我们用下面的语句在mysql中插入一条数据:
让我来翻译一下这个语句吧:
insert into student ( 这里写每个成员的信息列表) values ( 这里写每个信息的值)怎么样,插入语句是最简单的了吧,注意被一个信息对应了每一个数据的顺序,并且你输入的值,需要跟自己规定的一样哦,各回各家,各找各妈
嫌弃一次只能插入一条数据太慢?辣怎么行!mysql支持用逗号把很多values隔开,这样就能一次性插入多条啦
修改和删除数据
修改
哎呀,突然发现刚刚插入的数据,张三丰的身高弄错了怎么办!他明明是2米的!辣怎么行!
不慌,mysql可以改,使用update语句就可以改了
这里我们还接触到了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的简单结构
怎么样,很简单吧,例如我现在要看一下student里面的张三丰
select * from student where s_name='张三丰'显示的结果会是:
很简单吧,以此类推,如果我们只想知道张三丰所在的班级,应该这么查:
select s_class from student where s_name='张三丰'这样就查出来张三丰属于三年二班啦.
条件语句
哈哈哈,九阳神功已经练成,让我们来多尝试几次
使用age的大小比较,查看大于16岁的学生:
select * from student where s_age > 16使用多个条件并联,大于15岁且身高小于190的学生
select * from student where s_age > 15 and s_height < 190like语句
like语句的作用是做模糊匹配,例如我们隐隐约约记得一个叫张x的人,我们可以通过like来模糊查找:
select * from student where s_name like '%张%'这里有一个知识点:
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 Cas语句是给这张表起一个好记的名字,因为student school teacher在这一串查询条件里面太长了,所以给他们叫A、B、C好了
这里我们可以看看最终得到了什么样的数据?
——一共可以得到8个字段共18条数据,实在是太多啦,我简单列举出张三丰的数据:
可以看到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='特靠谱'这样我们就只拿了一条数据:
所以JOIN的作用是什么?就是把几张表强行揉在一起.
我们可以在join的表名后加on语句,它跟where是一样的,但是它是join表的条件语句
这样join的表就过滤掉了其他的数据,跟where条件的作用是一样的.
INNER JOIN
inner join 又叫做内连接,emm,其实它就是取交集,
我们前面知道了join是强行把几张表揉在一起,而inner join,是把几张表的交集部分揉在一起。(交集,就是几个表中共有的一摸一样的那部分)
inner join 是一定要写on的,如果不写on的话,就跟join差不多啦。在on中写出a和b交集的部分.
为了演示,我得再给老师表加一个班级字段,然后改掉马爸爸的班级
好啦接下来我们试一下inner join
select * from student as A inner join teacher C on C.tea_class=A.s_class这样我们就查出来老师马爸爸所在的三年二班的所有学生列表了。
amazing!
可以再插入一个学生再查询一次试试:
insert into student ( s_name, s_age, s_class, s_height) values ( '王八', 22, '三年二班', 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_classamazing,这样看是不是很明显了?
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_classamazing!
group by
终于讲到了这里!你也看到了这里!
group by,顾名思义,就是分组
直接上一个简单的例子看一下:
顾名思义,就是按照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='张三丰'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 descorder by跟group by一起用的时候,写在group by后面哦
简单函数
count
在group by那里我们看到了group by的用法,一般我们用的最多的还是使用group by来count一个数据出现的次数
例如
它们仨都只出现了一次,如果我们再插入一条数据:
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三年二班就有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、找到年龄最大的同学
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!收工