SQL语句
一、timestampdiff()函数
delete from
exam_record
where
timestampdiff (minute, start_time, submit_time) < 5
and score < 60;
M I C R O S E C O N D 微秒 S E C O N D 秒 M I N U T E 分钟 H O U R 小时 D A Y 天 W E E K 周 M O N T H 月份 Q U A R T E R Y E A R 年份 MICROSECOND 微秒 SECOND 秒 MINUTE 分钟 HOUR 小时 DAY 天 WEEK 周 MONTH 月份 QUARTER YEAR 年份 MICROSECOND微秒SECOND秒MINUTE分钟HOUR小时DAY天WEEK周MONTH月份QUARTERYEAR年份
二、 创建表
直接创建
create table
user_info_vip (
id int (11) primary key auto_increment comment '自增ID',
uid int (11) unique not null comment '用户ID',
nick_name varchar(64) comment '昵称',
achievement int (11) default 0 comment '成就值',
level int (11) null comment '用户等级',
job varchar(32) null comment '职业方向',
register_time datetime default CURRENT_TIMESTAMP comment '注册时间'
) character
set
utf8 collate utf8_general_ci;
C R E A T E T A B L E [ I F N O T E X I S T S ] t b n a m e − − 不存在才创建,存在就跳过 ( c o l u m n n a m e 1 d a t a t y p e 1 − − 列名和类型必选 [ P R I M A R Y K E Y − − 可选的约束,主键 ∣ F O R E I G N K E Y − − 外键,引用其他表的键值 ∣ A U T O I N C R E M E N T − − 自增 I D ∣ C O M M E N T c o m m e n t − − 列注释(评论) ∣ D E F A U L T d e f a u l t v a l u e − − 默认值 ∣ U N I Q U E − − 唯一性约束,不允许两条记录该列值相同 ∣ N O T N U L L − − 该列非空 ] , . . . ) [ C H A R A C T E R S E T c h a r s e t ] − − 字符集编码 [ C O L L A T E c o l l a t e v a l u e ] − − 列排序和比较时的规则(是否区分大小写等) CREATE TABLE [IF NOT EXISTS] tb_name -- 不存在才创建,存在就跳过 (column_name1 data_type1 -- 列名和类型必选 [ PRIMARY KEY -- 可选的约束,主键 | FOREIGN KEY -- 外键,引用其他表的键值 | AUTO_INCREMENT -- 自增ID | COMMENT comment -- 列注释(评论) | DEFAULT default_value -- 默认值 | UNIQUE -- 唯一性约束,不允许两条记录该列值相同 | NOT NULL -- 该列非空 ], ... ) [CHARACTER SET charset] -- 字符集编码 [COLLATE collate_value] -- 列排序和比较时的规则(是否区分大小写等) CREATETABLE[IFNOTEXISTS]tbname−−不存在才创建,存在就跳过(columnname1datatype1−−列名和类型必选[PRIMARYKEY−−可选的约束,主键∣FOREIGNKEY−−外键,引用其他表的键值∣AUTOINCREMENT−−自增ID∣COMMENTcomment−−列注释(评论)∣DEFAULTdefaultvalue−−默认值∣UNIQUE−−唯一性约束,不允许两条记录该列值相同∣NOTNULL−−该列非空],...)[CHARACTERSETcharset]−−字符集编码[COLLATEcollatevalue]−−列排序和比较时的规则(是否区分大小写等)
从另一张表复制表结构创建表:
`CREATE TABLE tb_name LIKE tb_name_old`
从另一张表的查询结果创建表:
`CREATE TABLE tb_name AS SELECT * FROM tb_name_old WHERE options`
修改表:ALTER TABLE 表名 修改选项
。选项集合:
A D D C O L U M N < 列名 > < 类型 > − − 增加列 ∣ C H A N G E C O L U M N < 旧列名 > < 新列名 > < 新列类型 > − − 修改列名或类型 ∣ A L T E R C O L U M N < 列名 > S E T D E F A U L T < 默认值 > ∣ D R O P D E F A U L T − − 修改 / 删除列的默认值 ∣ M O D I F Y C O L U M N < 列名 > < 类型 > − − 修改列类型 ∣ D R O P C O L U M N < 列名 > − − 删除列 ∣ R E N A M E T O < 新表名 > − − 修改表名 ∣ C H A R A C T E R S E T < 字符集名 > − − 修改字符集 ∣ C O L L A T E < 校对规则名 > − − 修改校对规则(比较和排序时用到) { ADD COLUMN <列名> <类型> -- 增加列 | CHANGE COLUMN <旧列名> <新列名> <新列类型> -- 修改列名或类型 | ALTER COLUMN <列名> { SET DEFAULT <默认值> | DROP DEFAULT } -- 修改/删除 列的默认值 | MODIFY COLUMN <列名> <类型> -- 修改列类型 | DROP COLUMN <列名> -- 删除列 | RENAME TO <新表名> -- 修改表名 | CHARACTER SET <字符集名> -- 修改字符集 | COLLATE <校对规则名> } -- 修改校对规则(比较和排序时用到) ADDCOLUMN<列名><类型>−−增加列∣CHANGECOLUMN<旧列名><新列名><新列类型>−−修改列名或类型∣ALTERCOLUMN<列名>SETDEFAULT<默认值>∣DROPDEFAULT−−修改/删除列的默认值∣MODIFYCOLUMN<列名><类型>−−修改列类型∣DROPCOLUMN<列名>−−删除列∣RENAMETO<新表名>−−修改表名∣CHARACTERSET<字符集名>−−修改字符集∣COLLATE<校对规则名>−−修改校对规则(比较和排序时用到)
alter table
user_info
add column
school varchar(15) after level;
alter table
user_info
change column
job profession varchar(10);
alter table
user_info
modify column
achievement int (11) default 0;
删除表:
`DROP TABLE [IF EXISTS] 表名1 [ ,表名2]`。
drop table
if exists exam_record_2011,
exam_record_2012,
exam_record_2013,
exam_record_2014;
1.查询
1、按照时间排序
select * from tab_advertise as a group by recommend_date desc;
as a group by : 通过哪一个栏目排序 默认从低到高(desc:从高到低)
select cust_id, order_num from Orders order by cust_id desc, order_date desc;
order by 对多个字段进行排序,字段直接用逗号分隔;默认不写或asc为升序,desc为倒序;
2、order by 和 group by 的区别
1,order by 从英文里理解就是行的排序方式,默认的为升序。 order by 后面必须列出排序的字段名,可以是多个字段名。
2,group by 从英文里理解就是分组。必须有“聚合函数”来配合才能使用,使用时至少需要一个分组标志字段。
3、聚合函数
聚合函数的特点
(1).每个组函数接收一个参数(字段名或者表达式) 统计结果中默认忽略字段为NULL的记录
(2).要想列值为NULL的行也参与组函数的计算,必须使用IFNULL函数对NULL值做转换。
(3).不允许出现嵌套 比如sum(max(xx))
1、聚合函数 count(),求数据表的行数
select count(*/字段名) from 数据表
2、.聚合函数 max(),求某列的最大数值
select max(字段名)from 数据表
3、聚合函数min(),求某列的最小值
select main(字段名) from 数据表
4、聚合函数sum(),对数据表的某列进行求和操作
select sum(字段名) from 数据表
5、聚合函数avg(),对数据表的某列进行求平均值操作
select avg(字段名) from 数据表
6、 聚合函数和分组一起使用
select count(*),group_concat(age) from students group by age;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SQpbn0Gr-1686795081874)(C:\Users\23697\AppData\Roaming\Typora\typora-user-images\image-20230402101255535.png)]
4、group by(having)
错误示范:
select product,sum(price) from orders where sum(price) GROUP BY product(报错)
正确的写法:
select product,sum(price) from orders GROUP BY product HAVING sum(price)>100
需要注意having和where的用法区别:
1.having只能用在group by之后,对分组后的结果进行筛选(即使用having的前提条件是分组)。
2.where肯定在group by 之前。
3.where后的条件表达式里不允许使用聚合函数,而having可以。
select
order_num
from
OrderItems
group by
order_num
having
sum(quantity) >= 100
;
5. sql去重
5.1 distinct
select distinct prod_id from OrderItems;
5.2 group by
select * from OrderItems group by prod_id;
6. between and 用法
select
prod_name, prod_price
from
Products
where
prod_price between 3 and 6
order by
prod_price
asc;
7. IN的用法
SELECT
order_num, prod_id, quantity
from
OrderItems
where quantity >= 100
and
prod_id IN ("BR01","BR02", "BR03");
2. 添加
1. insert into () 不跟value的情况
insert into
exam_record_before_2021 (id, uid, exam_id, start_time, submit_time, score)
select
null,
uid,
exam_id,
start_time,
submit_time,
score
from
exam_record
where
year (submit_time) < "2021";
2 .replace into 跟 insert into功能类似,不同点在于:replace into 首先尝试插入数据到表中,
2.1 如果发现表中已经有此行数据(根据主键或者唯一索引判断)则先删除此行数据,然后插入新的数据;
2.2 否则,直接插入新数据。
3. 删除
year (submit_time) < “2021”;
##### 2 .replace into 跟 insert into功能类似,不同点在于:replace into 首先尝试插入数据到表中,
2.1 如果发现表中已经有此行数据(根据主键或者唯一索引判断)则先删除此行数据,然后插入新的数据;
2.2 否则,直接插入新数据。
### 3. 删除
1. ##### 删除表内所有数据行外 还要实现对表结构中自增列的重置 truncate(截断、删节)
truncate table(exam_record);