sql语句2

目录

 表的字段操作:

1.添加列

 2.修改字段和属性

 修改表的名称:

只修改字段的属性

对表中数据的操作:

where后面可以跟上的语句: 

聚合函数:

limit分页  ​

去重

concat拼接

 as

日期函数


 表的字段操作:

1.添加列

命令:alter 表名 add (属性) (是否为空)

 写了添加字段的语句怎么会报错?

这个报错结果是mysql5.7版本的默认设置,我i们需要进行修改

运行这个命令:

set @@global.sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

 我们再次打开查询表

 表中确实新添加了  新的字段 

 2.修改字段和属性

修改字段名称和属性,也可以 单独修改字段或者修改属性

 alter table 表名 change 原字段名称  新字段名称  新的属性; 

下面这个就是实例:

  

可见我们将原来是test 属性为varchar(50)的字段更改为了t 属性varchar(255)的新字段

修改表的名称:

rename table tablename1 to tablename2

只修改字段的属性

alter table 表名  modify  (字段属性) (是否为空);

我将字段t的属性更改为int

成功了,但是我刚才新建的字段t下面都什么数据都没有,我们来看看同样是varchar类型的sex字段是否可以转换成int类型。

 可见sex字段下都插入过数据的, 

尝试修改属性

 这是什么原理?举个栗子:有一个数字99,我如果两边加上“ ”,他就是一个字符串了,但是字符串不可以轻易变成数值。

 3.特殊的属性enum

我们点击设计表后,再点到希望更改字段的一行,我们将类型设置为enum

 

我们在值的这一栏添加我们指定的内容,后面插入数据只可以从这几个选项里面挑

我们通过可视化界面建成了表,但是enmu属性怎么通过建表语句写出来?

 我们可以查询一下建表语句 show create table su;

 create table tablename(enmu (...限定的内容))...

4.删除字段

alter table 表名 drop 字段名

刷新一下表的信息,果然删除了字段t的所在列

 5.修改表的字符集:alter table 表名 character set 需要设置的格式;

还可以修改客户端字符集,修改完记得改回来,修改字符集后一些操作可能会出错

SET character_set_client = utf8;

SET character_set_results = utf8;

SET character_set_connection = utf8; 

对表中数据的操作:

1.插入 一行新的数据:

INSERT INTO     table [(column [, column...])] VALUES        (value [, value...]);

 我们点击表下面的刷新,发现确实新增加了一行数据

写在括号里的字段需要和后面的数据保持一一对应

如果设置字段时让其可以为null,我们就可以在字段的列表不写这个字,插入的数据就默认为null 

2.查询表信息

select * from 表名; 就会显示这个表里的所有内容

如果在*加上再里面的一个字段会如何?

得到的结果是name字段加上了后缀再次显示一列,可见sql中是不允许字段重复的

删除表

delect from 表名 整个表都被删除了

那么我只想要删除部分的数据呢?这里就要引入新知识:通过where筛选

where后面可以跟上的语句: 

>   <   <=   >=   =    <>    大于、小于、大于(小于)等于、不等于

between  ...and...    显示在某一区间的值(含头含尾)
in(set)    显示在in列表中的值,例:in(100,200)只能匹配100或200
like '张_'    模糊查询  使用% 和 _(%表示匹配所有以张开头的 _表示匹配以张开头的一共是两个字符)
Is null    判断是否为空

and    多个条件同时成立
or    多个条件任一成立
not    不成立,例:where not(expection>10000);

聚合函数: 

count()

sum()

max()

min()

stu2表 

count(字段):求多少行数据


sum(字段):求和 

我们先对int属性的值进行相加

对vachar求和会是怎样?

varchar类型的值默认是0相加


avg(字段):平均数


max(字段):最大值
min(字段):最小值

 注意:
        varchar能比较大小,不能获取avg(没有任何意义)
        如果值为Null不参与计算
        sum和avg字段的数据不是数值,结果都是0


limit分页
  

SELECT * FROM `stu2` LIMIT 0, 1000

这是我们在数据表左下角粘贴的命令,很明显数据库默认了将1000行划为一页

 格式:
        语句 limit 开始下标,长度;
    注意:
        如果数据量不够, 有多少显示多少
    例如:从下标为0开始显示10条
        select * from stduents limit 0,10;

从下标0开始到下标9,一共显示10行

去重

 格式:
        DISTINCT 字段1,字段2...字段N

案例:我的表中有name重复的数据


    注意:
  字段不能在DISTINCT之前,只能在DISTINCT后面

显示结果:


 DISTINCT之后有多个字段,按照所有字段进行去重,只要有一个字段录入的信息不同,就不会被去重。

命令:

 

concat拼接

形式1:命令:

 select concat(列名1,列名2,...)+ "!" from tablename   [WHERE where_definition]

案例:将name与address拼接

 结果:

 

  看上去不太好分辨哪部分是name、age,我们可以在中间添加分隔符

格式:在中间加上字符串形式的"-"

查询结果: 

 形式2:拼接列内容并分隔符,只需要写一次分隔符

 

 

 as

as的作用是重命名表的名字,这有什么用处?每次我们查询表, 当查询结束后,这个虚拟的表就销毁了,那么可以使用这个表吗?可以,我们使用as重命名后就可以做到

 

给他起个名字就可以使用虚拟表了

· 

日期函数

获取当前日期:
         CURRENT_TIMESTAMP;--所有
         CURRENT_DATE();-- 年月日
         CURRENT_TIME();-- 时分秒
     

我们使用的时候前面加上个select就完事了

select CURRENT_TIMESTAMP();

可以看到年月日默认是横杠隔开的 

将时间转成字符串:%Y(年) %m(月) %d(日) 中间的分隔符是我们自己选择的, 最好用 ”-“...

select DATE_FORMAT(CURRENT_DATE(),"%Y-%m-%d");

将字符串转成时间:

select STR_TO_DATE("2021-11-10","%Y-%m-%d") ;

 

日期相加减函数:

结果就是前面的日期减去后面的日期

select DATEDIFF("2021-11-30","2021-11-10");

 那么可以前面的比后面小吗?事实证明的是可以的

select DATEDIFF("2021-11-01","2021-11-10");

 添加时间间隔

 后面的day可以换成year,month

时间转换范围练习:

1.我们先创建一个test1表,里面是两个字段,后面一个int类型的

CREATE TABLE test1 (
  time date NOT NULL,
  sum int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC

向其中插入date类型的数据, 和int类型的值

 

 现在我们需要以每七天时间为间隔,创建一个分组,并且把他们后面的数据分组求和

比如前三行的最终显示结果应该是:2021-11-01~2021-11-07  |   6 

为了呈现这样的效果,那么接下来我们一步一步处理这个问题

首先是分组问题,一个星期划分一次倒是不难理解,具体实现:

用这个表中的时间减去2021-11-01 得到的结果

select DATEDIFF(time,"2021-11-01") from test1

 得到的结果如下:

 7天分为一组就有思路了,我们将上面的时间除以7后舍弃小数点后尾数,这样结果不就是0,1,2,3,4了。

select floor(DATEDIFF(time, "2021-11-01")/7) from test1

 接下来我们的任务就是将范围表示出来,具体怎么做呢?利用增加时间的函数,我们初始时间设置为”2021-11-01“时间天数就是上面0,1,2,3,4再乘以7,

select date_add("2021-11-01",interval floor(DATEDIFF(time, "2021-11-01")/7)*7 day) from test1;

非常nice ,接下来就是写对应结束的日期,是不是只要在此基础上加上6就可以了

select date_add("2021-11-01",interval floor(DATEDIFF(time, "2021-11-01")/7)*7+6 day) from test1;

然后利用concat连接他们,将上面的时间内容替换下面的,看看最终语句

select concat(starttime,"~",endtime) from test;
select CONCAT(date_add("2021-11-01",interval floor(DATEDIFF(time, "2021-11-01")/7)*7 day) 
,"~"
,date_add("2021-11-01",interval floor(DATEDIFF(time, "2021-11-01")/7)*7+6 day))  ,sum(num)  ;
 

 接下来根据我们写出的这个时间段来分组,并且加上值的求和,记得先用as重命名

select CONCAT(date_add("2021-11-01",interval floor(DATEDIFF(time, "2021-11-01")/7)*7 day) 
,"~"
,date_add("2021-11-01",interval floor(DATEDIFF(time, "2021-11-01")/7)*7+6 day)) 
as timegroup ,sum(num) from test1 group by timegroup;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值