sqlserver增加字段长度(sqlserver修改表字段长度)


创建表

最基本的创建

在mysql中,数据的家就叫做表,张三住在张家,李四住在李家,他们属于一个家庭单元,mysql的表也是一样的逻辑。
我们可以给mysql的表起一个名字,然后规定表里面的成员有哪些,例如整个宇宙都在用的student的例子:

create table student (
    s_name varchar(120) comment '学生的名字',
    s_age integer comment '学生的年龄',
    s_class varchar(120) comment '学生的班级'
)

像这样执行一下我们就能给我们的学生创建一个大家庭啦。
这样我们就得到了一个类似excel表里的东西:

s_names_ages_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_names_ages_classs_height
张三丰17三年二班200

很简单吧,以此类推,如果我们只想知道张三丰所在的班级,应该这么查:

select s_class from student where s_name='张三丰'
s_class
三年二班

这样就查出来张三丰属于三年二班啦.

条件语句

哈哈哈,九阳神功已经练成,让我们来多尝试几次

使用age的大小比较,查看大于16岁的学生:

select * from student where s_age > 16
s_names_ages_classs_height
张三丰17三年二班200

使用多个条件并联,大于15岁且身高小于190的学生

select * from student where s_age > 15 and s_height < 190
s_names_ages_classs_height
张四丰16一年二班160

like语句

like语句的作用是做模糊匹配,例如我们隐隐约约记得一个叫张x的人,我们可以通过like来模糊查找:

select * from student where s_name like '%张%'
s_names_ages_classs_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_names_ages_classs_heightsch_namesch_addresstea_nametea_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_names_ages_classs_heightsch_namesch_addresstea_nametea_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_names_ages_classs_heightsch_namesch_addresstea_nametea_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_names_ages_classs_heighttea_nametea_subjecttea_class
张三丰17三年二班200马爸爸社会学三年二班

这样我们就查出来老师马爸爸所在的三年二班的所有学生列表了。
amazing!

可以再插入一个学生再查询一次试试:

insert into student (
    s_name,
    s_age,
    s_class,
    s_height
) values 
(
    '王八',
    22,
    '三年二班',
    177
)
s_names_ages_classs_heighttea_nametea_subjecttea_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_names_ages_classs_heighttea_nametea_subjecttea_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_names_ages_classs_heighttea_nametea_subjecttea_class
王八22三年二班200马爸爸社会学三年二班
张三丰17三年二班177马爸爸社会学三年二班
王爸爸资本论
特靠谱嘴炮学

amazing!

group by

终于讲到了这里!你也看到了这里!
group by,顾名思义,就是分组
直接上一个简单的例子看一下:

select s_name,s_class from student group by s_class
s_names_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_names_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_names_classs_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_namenum
王八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_namenum
王八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!收工

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发表评论

登录后才能评论