目录
表的字段操作:
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分页
![](https://i-blog.csdnimg.cn/blog_migrate/dfd823720d81495dbd8c7f953caea5f0.png)
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;