SQL总结

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微秒SECONDMINUTE分钟HOUR小时DAYWEEKMONTH月份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自增IDCOMMENTcomment列注释(评论)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 从英文里理解就是分组。必须有“聚合函数”来配合才能使用,使用时至少需要一个分组标志字段。

注意:聚合函数是—sum()、count()、avg()等都是“聚合函数

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)]

image-20230603203304278

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. 添加

image-20230603205956468

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. 删除

  1. 删除表内所有数据行外 还要实现对表结构中自增列的重置 truncate(截断、删节)
    truncate table(exam_record);
    

year (submit_time) < “2021”;


##### 2 .replace into 跟 insert into功能类似,不同点在于:replace into 首先尝试插入数据到表中,

​	2.1 如果发现表中已经有此行数据(根据主键或者唯一索引判断)则先删除此行数据,然后插入新的数据;

​	2.2 否则,直接插入新数据。

### 3. 删除

1. ##### 删除表内所有数据行外 还要实现对表结构中自增列的重置 truncate(截断、删节)

truncate table(exam_record);



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值