mysql常用语句操作

1.通过表结构介绍、来操作mysql常用的语法&语句;

2.现在学习下几个基本的sql语句,万变不离其宗,把基础弄扎实了其它的就很容易了

 一、表结构&建表:

1.学生基础信息表student:

DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
`sid` int(11) NOT NULL COMMENT '学生id',
`sname` varchar(30) DEFAULT NULL COMMENT '学生姓名',
`sage` int(11) DEFAULT NULL COMMENT '学生年龄',
`ssex` varchar(8) DEFAULT NULL COMMENT '学生性别',
`creation_time` datetime NOT NULL COMMENT '创建时间',
PRIMARY KEY (`sid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

2.学生成绩表sc:

DROP TABLE IF EXISTS `sc`;
CREATE TABLE `sc` (
    `sid` INT (11) NOT NULL COMMENT '学生id',
    `cid` INT (11) NOT NULL COMMENT '成绩id',
    `score` INT (11) DEFAULT NULL COMMENT '成绩分数',
    `creation_time` datetime NOT NULL COMMENT '创建时间'
) ENGINE = INNODB DEFAULT CHARSET = utf8mb4;

备注:`sid`  、`cid`、`score`不是引号,而是~号下的  `

二、常用语法

查询

1.简单查询

#查询sage等于25
SELECT * from student where sage=25;

#查询sage不等于25
SELECT * from student where sage<>25;
SELECT * from student where sage!=25;


########逻辑查询 and、or
SELECT * from student where sage=25 and sage='女';
SELECT * from student where sage=25 or sage='女';

#in,not in 的用法
SELECT * FROM student WHERE sname in ('刘亦菲','王康','陈三');
SELECT * FROM student WHERE sname not in('刘亦菲','王康','陈三');


####is 和not is、null
#查询不为null
SELECT * from student where ssex  IS not NULL;
#查询为null
SELECT * from student where ssex  IS NULL;


#############限制返回记录:
#最后三条
select * from student order by  sage desc limit 3; 
#分页查询(范围)
select * from student limit 0,5
#显示前2行
select * from student limit 2

2.范围查询

#查询sage 25到30的数据
SELECT * from student where sage BETWEEN 25 and 30;

#查询 creation_time日期范围
SELECT * from student where creation_time BETWEEN '2021-10-03 00:00:00' and '2021-10-25 18:00:00'

#查询creation_time数据
SELECT * from student where creation_time like '2021-10-%'

3.分组查询

#查询后分组
SELECT * from student where ssex='女' GROUP BY sage;
#分组后倒序
SELECT * from student where ssex='女' GROUP BY sage ORDER BY creation_time desc;

#倒序-desc
SELECT * from student where ssex='女' ORDER BY creation_time desc;
#顺序-asc
SELECT * from student where ssex='女' ORDER BY creation_time asc;

 4.like匹配查询

#####查询匹配关键字(%表示所有,_表示任意一个字符)
#匹配包含'刘'记录
select * from student where sname like '%刘%';
#匹配以'伊朗'结尾的记录
select * from student where sname like '%伊朗';
#匹配任意一个字符
select * from student where sname like '刘_菲';

5.子查询


#子查询-包含查询
select  * from student  where  sage in(select  sage from  student  where ssex='女' and sage<30 and creation_time like '2021-10%' GROUP BY sage); 


#子查询-别名查询
SELECT * from(
(SELECT  date_format(creation_time,'%Y-%m-%d') as _time  FROM districtdervice_task_synchronization 
where DATE_SUB(CURDATE(),INTERVAL 7 DAY) <=date(creation_time))
) 别名 GROUP BY _time;

6.单表统计

#统计'2021年10月份'每天的sname字段的个数
SELECT date_format(creation_time,'%Y-%m-%d') as _time ,count(sname) FROM student where  creation_time  like '2021-10%' GROUP BY DAY(creation_time);
#DAY()按天统计 , WEEK()按周统计,MONTH()按月统计,QUARTER()按季度统计,YEAR()按年统计
# date_format日期格式化


#统计最近30天,每天的sname字段的个数
SELECT date_format(creation_time,'%Y-%m-%d') as _time ,count(sname) FROM student where  DATE_SUB(CURDATE(), INTERVAL 30 DAY) <=date(creation_time)   GROUP BY DAY(creation_time);


#统计某个月的记录数
SELECT count(*) from student where  creation_time like '%2021-10%';

7.聚合函数

#去重
SELECT distinct* from student;

#统计条数
SELECT count(*) from student;

#求和
SELECT sum(sage) from student where ssex='女';

#平均数
SELECT avg(sage) from student where ssex='女';

#ROUND(字段,n)保留小数n位
SELECT ROUND(avg(sage),1) as _avg from student where ssex='女';

#最大值
SELECT max(sage) from student where ssex='女';

#最小值
SELECT min(sage) from student where ssex='女';

 8.多表连接查询

#等值查询
select  *  from student st INNER JOIN sc scc on st.sid = scc.sid
where st.sage=25

select  st.sid,st.sname,st.sage,st.ssex,scc.sid,scc.score from student st INNER JOIN sc scc on st.sid = scc.sid
where st.ssex='女';

#左连接
select  st.sid,st.sname,st.sage,st.ssex,scc.sid,scc.score from student st left JOIN sc scc on st.sid = scc.sid
where st.ssex='女';

#右连接
select  st.sid,st.sname,st.sage,st.ssex,scc.sid,scc.score from student st right join sc scc on st.sid = scc.sid
where st.ssex='女';

#左连接:左表不管能不能匹配上条件,最终都会保留:能匹配正确的保留; 若不能匹配,右表的字段都置NULL

#右连接:右表不管能不能匹配上条件,最终都会保留:能匹配 正确的保留; 若不能匹配,左表的字段都置NULL。

9.REGEXP正则

#匹配包含某个字符的记录
SELECT * FROM student WHERE sname REGEXP  '刘';
#匹配字段包含数字的记录
SELECT * FROM student WHERE sname REGEXP  '\\d';
SELECT * FROM student WHERE sage REGEXP  '[0-9]';
#匹配包含数字5位以上的记录
SELECT * FROM student WHERE sname REGEXP  '\\d{5}';


#匹配'王'开头
SELECT * FROM student WHERE sname REGEXP  '^王';
#匹配'菲'结尾
SELECT * FROM student WHERE sname REGEXP  '菲$';


#匹配整型至少3位开始
SELECT * FROM student WHERE sage REGEXP  '^\\d{3,}$';
#匹配整型3到5位(字段为整形,筛选3到5位数)
SELECT * FROM student WHERE sage REGEXP  '^\\d{3,5}$';
#匹配字符串,显示2到6位的记录
SELECT * FROM dalan_test WHERE apk_link REGEXP  '^\\w{2,6}$';


#匹配包含"陈"或"菲"的记录
SELECT * FROM student WHERE sname REGEXP  '陈|菲';


#匹配任意一位字符串
SELECT * FROM student WHERE sname REGEXP  '刘.菲';
#匹配一次或多次
SELECT * FROM student WHERE sname REGEXP  '刘.+菲';
#匹配任意次数
SELECT * FROM student WHERE sname REGEXP  '刘*';

10.联合查询

 联合查询结果是将多个select语句的查询结果合并到一块,因为在某种情况下需要将几个select语句查询的结果合并起来显示。需要两个表结构一样

   其中union选项有两个选项可选

   all:表示无论重复都输出
   distinct: 去重(整个重复)(默认的)

select * from student
union all
select * from student111;

备注:不加all,就会过滤相同的记录

Union:
   作用:把2次或多次查询结果合并起来
   要求:两次查询的列数一致
   推荐:查询的每一列,相对应的列类型也一样

#合并两个查询结果
SELECT * from districtdervice_task_synchronization where job_flow_id=20007
UNION
SELECT * from districtdervice_task_synchronization where job_flow_id=22420

11.EXISTS的用法

EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False
EXISTS 指定一个子查询,检测 行 的存在。

select  * from student  
where  sid<10 and EXISTS(
select  sage from  student  
where ssex='女' and sage<30 and creation_time like '2021-10%' GROUP BY sage
); 

  备注:如果子查询结果为空,那么整体查询也为空

12高级查询case...when....then

   注意:使用case...when....then将表中的列数据转为行(表头)构建一个虚表,再使用case...when....then根据条件替换数据

    when表示条件,then表示替换的值(可以是字段)

    使用场景:等值转换、范围转换、行转列

##___________________________________student表查询_______________________________
#一行显示多个条件并统计
select * from(
(select '小于20',count(sage)as 'sage' from student where sage<20) chen20,
(select '20到40',count(sage)as 'sage' from student where sage between 20 and 40) wei,
(select '大于40',count(sage)as 'sage' from student where sage>40) cheb40
);


#多条件查询后,分组并统计
select count(sage),评分 from(
(SELECT sage,
(CASE  WHEN sage >=40 THEN '优秀' WHEN sage >=30 THEN '及格' ELSE '不及格' END) AS '评分'
FROM student) chen) GROUP BY 评分;


#使用case...when....then 把条件放到一列
SELECT sage,
(CASE  WHEN sage >=40 THEN '优秀' WHEN sage >=30 THEN '及格' ELSE '不及格' END) AS '评分'
FROM student;

#使用case...when....then一行查询
SELECT sage,(case  when sage >=40 then '优秀' when sage >=30 then '及格' else '不及格' end) FROM student;


#################################行列互转################################
####################行转列(7001,7002,7003表示表里的成绩id值)
#方式一:行转列(查询每个学生的成绩),7001,7002,7003表示表里的成绩id值
SELECT sid,
MAX(CASE cid WHEN '7001' THEN score ELSE 0 END) 语文,
MAX(CASE cid WHEN '7002' THEN score ELSE 0 END) 数学,
MAX(CASE cid WHEN '7003' THEN score ELSE 0 END) 物理
FROM sc GROUP BY  sid;

#方式二:行转列
SELECT sid,
     SUM(IF(`cid`='7001',score,0)) as '语文',
     SUM(IF(`cid`='7002',score,0)) as '数学',
     SUM(IF(`cid`='7003',score,0)) as '物理'
FROM sc GROUP BY sid;

#方式三:行转列
SELECT sid,GROUP_CONCAT(`cid`,":",score)AS 成绩 FROM sc
GROUP BY sid


###################列转行
SELECT sid,'分数' AS c_score,score AS aaa FROM sc
UNION ALL
SELECT  sid,'时间' AS c_score,creation_time AS aaa FROM sc
UNION ALL
SELECT  sid,'成绩id' AS c_score,cid AS aaa
FROM sc ORDER BY sid

搞定mysql的 行转列(7种方法) 和 列转行_mysql 行转列_社会小马的博客-CSDN博客

13.查询记录以'逗号'作为条件:

#以student.sname字段作为条件,使用逗号查询
select * from sc as sccc where find_in_set( sccc.sid,(select sname FROM  student  WHERE  sid=3))
#以逗号分割查询,并排序
select * from sc as sccc where find_in_set( sccc.sid,(select sname FROM  student  WHERE  sid=3)) ORDER BY  find_in_set( sccc.sid,(select sname FROM  student  WHERE  sid=3))

 14.日期查询:

#查看student表最近30天的记录
SELECT * FROM student where DATE_SUB(CURDATE(), INTERVAL 30 DAY) <=date(creation_time); 

#查看昨天记录
SELECT * FROM 表名 WHERE TO_DAYS(NOW( ) ) - TO_DAYS( 时间字段名) <= 1;
#查看过去7天
SELECT * FROM 表名 where DATE_SUB(CURDATE(), INTERVAL 7 DAY) <=date(时间字段名);
#查看本月
SELECT * FROM 表名 WHERE DATE_FORMAT( 时间字段名, '%Y%m' ) =DATE_FORMAT( CURDATE( ) , '%Y%m' );
#查看上月
SELECT * FROM 表名 WHERE PERIOD_DIFF( date_format( now( ) , '%Y%m' ) , date_format( 时间字段名, '%Y%m' ) ) =1        
#查看本年
select * from `ht_invoice_information` where YEAR(create_date)=YEAR(NOW());  
#查看上年
select * from `ht_invoice_information` where year(create_date)=year(date_sub(now(),interval 1 year));

插入

#指定全字段插入
INSERT INTO student(sid,sname,sage,ssex,creation_time) VALUES('19','招佳轩',32,'女','2021-10-07 16:48:31');
#指定部分字段插入
INSERT INTO student(sid,sname,sage,creation_time) VALUES('20','招佳轩',32,'2021-10-07 16:48:31');
#直接插入
INSERT INTO student
VALUES('21','招佳轩',32,'男','2021-10-07 16:48:31');
#通过set插入
INSERT INTO student
set sid=23,sname='招佳轩',sage=25,ssex='男',creation_time='2021-10-07 16:48:31';

#先查询将查询结果插入数据表:
  INSERT INTO 表名1(字段1) SELECT 字段2 FROM 表名2 WHERE 条件表达式;

更新


#普通更新
UPDATE student SET ssex = '男',sname = '100' WHERE sage=30;

#连表更新
update student,sc set student.sname='这是测试111',sc.score='59' where student.sid=sc.sid and student.sage=29;

#同表条件更新(条件和更新字段在同一个表)
update  student set sname='test123'
WHERE sid IN(
SELECT stu.sid from(
SELECT sid from student where sname='王丽') stu
)

#子更新(条件和更新字段不在同表)
UPDATE student SET sage=50 WHERE  sname IN(SELECT student_chen.sname from student_chen WHERE student_chen.sid=31)

删除

delete 和 truncate 仅仅删除表数据(这两种都不删除表的结构),drop 连表数据和表结构一起删除。

truncate和drop不能回滚(删除后不能找回数据),delete可以回滚数据

执行的速度上:drop>truncate>delete,打个比方,drop 是神舟火箭,truncate 是和谐号动车,delete 是自行车。

truncate不用写日志,delete要写日志,前者的删除效率要高于后者,前者是整体删除后者是逐句删除     

truncate是将这个表的所有数据都删除,而delete可以用where条件删除部分数据,也可以删除所有数据 

#####delete####
#指定条件删除记录(不加where条件是清空表、where条件后可加and或or)
DELETE FROM student where sage=30;
#删除条件为空的数据
delete from 表名  where 字段 is null;

###truncate###
#删除表的所有记录,保留表
TRUNCATE table 表名;

###drop###
#删除结构及表
drop table 表名;
#删除表字段
alter table 表名 drop column 字段;

 库、表的相关命令

###################表结构修改############
#修改字段类型 
alter table 表名 modify 字段 字段类型;
#添加新的字段 
alter table 表名 add 字段 字段类型;
#添加字段并指定位置  
alter table 表名 add 字段 字段类型   after 字段;
#删除表字段  
alter table 表名 drop 字段名;
#修改指定的字段  
alter table 表名 change 原字段名字  新的字段名字 字段类型;


#################数据库、表常用查询##############
#查看所有的数据库
show databases; 
#创建一个叫test的数据库
create database test; 
#删除一个叫test的数据库
drop database test;
#选中库 ,在建表之前必须要选择数据库
use test;
#在选中的数据库之中查看所有的表
show tables; 
#创建表
create table 表名 (字段1 类型, 字段2 类型);
#查看所在的表的字段
desc 表名;
#删除表
drop table 表名; 
#查看创建库的详细信息
show create database 库名;
#查看创建表的详细信息
show create table 表名; 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

会飞的猪303

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值