MySQL常用语句总结

这篇博客详细总结了MySQL中的常见查询语句和函数应用,包括选择特定列、聚合函数、排序、分组、联查等操作,以及字符串处理、日期时间函数等。还介绍了如何复制表结构和数据,提供了丰富的示例来帮助理解。

MySQL常用语句总结

建表语句在最下方
students表
courses表
scores表
teachers表

1. 常用查询语句

  1. 查询students表的所有记录
    select * from students;
    
  2. 查询students表中所有记录的sname、ssex和class列
    select sname,ssex,class from students;
    
  3. 查询teachers表中的系(去重)
    # 方法一:disinct去重
    select DISTINCT depart from teachers;
    # 方法二:group by分组
    select depart from teachers group by depart;
    
  4. 查询scores表中成绩在60到80之间的所有记录
    # 方法一:between...and
    select * from scores where degree between 60 and 80;
    # 方法二:and条件连接
    select * from scores where degree>=60 and degree<=80;
    
  5. 查询scores表中成绩为85,86或88的记录
    # in 的多值查询
    select * from scores where degree in (85,86,88);
    
  6. 查询students表中“95031”班或性别为“女”的同学记录
    # or 的使用
    select * from students where class='95031' or ssex='女';
    
  7. 以cno升序、degree降序查询scores表的所有记录
    # order by用于排序,desc降序,asc升序,rand()随机排序
    select * from scores order by cno asc,degree desc;
    
  8. 查询“95031”班的学生人数
    # 聚合函数的 count()--记录总条数
    select COUNT(*) from students where class='95031';
    
  9. 查询至少有2名男生的班号
    # as为给该字段起名,当条件为聚合函数时,不能用where而用having
    select class,COUNT(*) as num from students
    where ssex='男'
    GROUP BY class
    HAVING COUNT(*)>=2;
    
  10. 查询最高分
    # 聚合函数 MAX()--最大值
    select MAX(degree) from scores;
    
  11. 查询最低分
    # 聚合函数 MIN()--最小值
    select MIN(degree) from scores;
    
  12. 查询scores表中的最高分的学生学号和课程号
    select sno,cno from scores
    where degree=(
       select MAX(degree) from scores
    );
    
  13. 查询‘3-105’号课程的平均分
    # 聚合函数 AVG()--平均值
    select AVG(degree) from scores where cno='3-105';
    
  14. 查询各科的平均分除不尽的保留两位小数
    select cno,ROUND(AVG(degree),2) from scores group by cno;
    
  15. 查询最低分大于70,最高分小于90的sno列
    select sno from scores
    group by sno
    having MIN(degree)>70 and MAX(degree)<90;
    
  16. 查询每个学生的总成绩
    # 聚合函数 SUM()--求和
    select sno,SUM(degree) from scores GROUP BY sno;
    
  17. 查询所有教师和同学的name、sex和birthday
    # UNION 操作符用于合并两个或多个 SELECT 语句的结果集
    # 注意:UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。
    # UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。
    select tname as name,tsex as sex,tbirthday as birthday
    from teachers
    UNION
    select sname,ssex,sbirthday from students;
    
    在这里插入图片描述
  18. 查询所有未任课教师的tname和depart
    # 多表联查
    select tname,depart from teachers
    where tno not in (
       select DISTINCT tno from courses
    );
    
  19. 查询姓“王”的同学记录
    select * from students where sname like '王%';
    
  20. 查询“王某”的同学记录
    select * from students where sname like '王_';
    
  21. 查询同名的同学记录
    # 同名则说明count计数大于1
    select * from students where sname=(
       select sname from students
       group by sname
       having COUNT(sname)>1
    );
    
  22. 查询学生的姓名和年龄
    # YEAR(date)函数返回的年份值范围为 1000 到 9999,如果日期为零,YEAR() 函数返回 0
    # NOW()函数为此时的时间
    select sname,YEAR(NOW())-YEAR(sbirthday) as age from students;
    
  23. 查询男教师及其所上的课程
    # 左连接 left join,on之后写条件
    select t.tname,c.cname
    from
    (select * from teachers where tsex='男')t
    left join
    (select * from courses)c
    on t.tno=c.tno;
    
  24. 查询各门课程的最高分同学的信息
    #多表查询,一个字段用in,多个字段用left join
    SELECT
    * 
    FROM
    students 
    WHERE
    sno IN (
    SELECT
    a.sno 
    FROM
    ( SELECT max( degree ) degree, cno FROM scores GROUP BY cno ) b
    LEFT JOIN ( SELECT * FROM scores ) a ON a.cno = b.cno 
    AND a.degree = b.degree 
    )
    
  25. 查询学生表中的前两个男同学信息
    # limit 分页查询,第一个参数0指的是从第一条数据开始,第二个参数2表示查询两条数据
    select * from students where ssex='男' limit 0,2;
    

2.常用的一些函数整理

2.1 五大聚合函数
  • 统计记录条数:count()
  • 求和:sum()
  • 求平均值:avg()
  • 求最大值:max()
  • 求最小值:min()
2.2 保留小数位数的函数
  • round(x,d):用于数据的四舍五入(小数最后一位为0时不会强制保留小数),round(x)默认为round(x,0),参数d可以是负数。
# 举几个例子
select round(11.049,1);		#结果为 11.1
 select round(11.03,1);		#结果为 11,不会强制保留小数
select round(11.05,0);		#结果为 11
select round(14.95,-1);		#结果为 10
select round(15.05,-1);		#结果为 20
select round(44.95,-2);		#结果为 0
select round(54.95,-2);		#结果为 100
  • truncate(x,d):d为正数时,保留d位小数(小数最后一位为0时不会强制保留小数),之后的小数直接舍弃;
select truncate(11.155,2);		# 11.15
select truncate(11.15,-1);		# 10
select truncate(11.15,-2);		# 0
  • format(x,d):强制保留d位小数,四舍五入,d取负数时相当于0,返回结果为string类型,整数部分超过3位时以逗号分隔。
select format(11.155,2);		# 11.16
select format(12345.15,-1);		# 12,345
select format(12345,2);		# 12,345.00
2.3 用于处理数值的函数
  • 绝对值的函数:abs(x)
select abs(-1);		# 1
  • 向上取整的函数:ceil(x)
select ceil(1.1);		# 2
select ceil(-1.1);		# -1
  • 向下取整的函数:floor(x)
select floor(1.9);		# 1
select floor(-1.1);		# -2
  • 取模的函数:mod(x,y) 【mod(x,y)=x-y*INT(x/y)】
select mod(-3,2);		# -1
select mod(3,-2);		# 1
select mod(-12,23);		# -12
  • 随机数的函数:rand()
# 当rand()无参时,随机生成0-1的数
select rand();		# 0.6553694872701257	0.8951968177176982
# 当rand()有参时,生成重复的0-1的随机数
select rand(1);		# 0.40540353712197724	0.40540353712197724
# 使用 order by rand() 查询的结果随机排列
select * from students order by rand();
2.4 用于处理字符串的函数
  • 大小写转换的函数:转大写upper(str) 或者 ucase(str),转小写:lower(str) 或者 lcase(str)
select upper('aBc'),ucase('dEf');		# ABC  DEF
select lower('AbC'),lcase('DeF');		# abc  def
  • 合并字符串的函数:concat(str1,str2,str3…)
select concat('a','bc','d');		# abcd
  • 比较字符串大小的函数:strcmp(str1,str2)
# 参数1相对参数2靠字典序前返回-1.靠字典序后返回1,相同返回0
select strcmp('aa','cc');		# -1
select strcmp('aa','aa');		# 0
select strcmp('cc','aa');		# 1
  • 获取字符串字节数的函数:length(str)
select length('abcd9');		# 5
select length('我');		# 3
  • 获取字符串字符数的函数:char_length(str)
select char_length('abcd9');		# 5
select char_length('我');		# 1
2.5 用于处理时间日期的函数
  • 获取当前日期:curdate()current_date()
select curdate();		# 2021-01-20
select current_date();	# 2021-01-20
  • 获取当前时间:curtime()current_time()
select curtime();		# 01:21:51
select current_time();	# 01:21:51
  • 获取当前日期时间:now()
select now();		# 2021-01-20 01:22:55
  • 获取date日期中的月份:month(date)monthname(date)
select month(now());		# 1
select month(curdate());	# 1
  • 获取date日期中的今年的第几周:week(date,mode)
# mod为可选参数,用于确定周数计算的逻辑。它允许您指定本周是从星期一还是星期日开始,返回的周数应在0到52之间或0到53之间。
  • 获取date日期中的今天周几:weekday(date)dayname(date)
# weekday() 返回星期的索引值,及周一0,周二1...
select weekday(now());		# 2
select dayname(now());		# Wednesday
  • 获取date日期中的年份:year(date)
  • 获取time时间中的小时数:hour(time)
  • 获取time时间中的分钟数:minute(time)

3. 复制表结构和表数据

  • 仅复制表结构
# 新建表t_tb,复制teachers表的结构
create table t_tb like teachers;
  • 仅复制表数据
# 已有表t_tb,复制teachers表的数据
insert into t_tb select * from teachers;
  • 复制表结构和表数据
# 新建表t1_tb,复制teachers表的结构和表数据
create table t1_tb select * from teachers;

建表语句

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for courses
-- ----------------------------
DROP TABLE IF EXISTS `courses`;
CREATE TABLE `courses`  (
  `cno` varchar(5) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `cname` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `tno` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  PRIMARY KEY (`cno`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of courses
-- ----------------------------
INSERT INTO `courses` VALUES ('3-105', '计算机导论', '825');
INSERT INTO `courses` VALUES ('3-245', '操作系统', '804');
INSERT INTO `courses` VALUES ('6-106', '概率论', '831');
INSERT INTO `courses` VALUES ('6-166', '模拟电路', '856');
INSERT INTO `courses` VALUES ('9-888', '高等数学', '831');
INSERT INTO `courses` VALUES ('9-999', '语文', '000');

-- ----------------------------
-- Table structure for scores
-- ----------------------------
DROP TABLE IF EXISTS `scores`;
CREATE TABLE `scores`  (
  `sno` varchar(3) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `cno` varchar(5) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `degree` decimal(10, 1) NOT NULL,
  PRIMARY KEY (`sno`, `cno`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of scores
-- ----------------------------
INSERT INTO `scores` VALUES ('101', '3-105', 64.0);
INSERT INTO `scores` VALUES ('101', '6-166', 85.0);
INSERT INTO `scores` VALUES ('103', '3-105', 92.0);
INSERT INTO `scores` VALUES ('103', '3-245', 86.0);
INSERT INTO `scores` VALUES ('105', '3-105', 88.0);
INSERT INTO `scores` VALUES ('105', '3-245', 75.0);
INSERT INTO `scores` VALUES ('107', '3-105', 91.0);
INSERT INTO `scores` VALUES ('107', '6-106', 79.0);
INSERT INTO `scores` VALUES ('108', '3-105', 78.0);
INSERT INTO `scores` VALUES ('108', '6-166', 81.0);
INSERT INTO `scores` VALUES ('109', '3-105', 76.0);
INSERT INTO `scores` VALUES ('109', '3-245', 68.0);

-- ----------------------------
-- Table structure for students
-- ----------------------------
DROP TABLE IF EXISTS `students`;
CREATE TABLE `students`  (
  `sno` varchar(3) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `sname` varchar(4) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `ssex` varchar(2) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `sbirthday` datetime(0) NULL DEFAULT NULL,
  `class` varchar(5) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`sno`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of students
-- ----------------------------
INSERT INTO `students` VALUES ('101', '李军', '男', '1976-02-20 00:00:00', '95033');
INSERT INTO `students` VALUES ('103', '陆君', '男', '1974-06-03 00:00:00', '95031');
INSERT INTO `students` VALUES ('105', '匡明', '男', '1975-10-02 00:00:00', '95031');
INSERT INTO `students` VALUES ('107', '王丽', '女', '1976-01-23 00:00:00', '95033');
INSERT INTO `students` VALUES ('108', '曾华', '男', '1977-09-01 00:00:00', '95033');
INSERT INTO `students` VALUES ('109', '王芳', '女', '1975-02-10 00:00:00', '95031');
INSERT INTO `students` VALUES ('110', '王芳', '女', '1990-09-08 11:42:06', '95033');

-- ----------------------------
-- Table structure for teachers
-- ----------------------------
DROP TABLE IF EXISTS `teachers`;
CREATE TABLE `teachers`  (
  `tno` varchar(3) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `tname` varchar(4) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `tsex` varchar(2) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `tbirthday` datetime(0) NULL,
  `prof` varchar(6) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `depart` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`tno`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of teachers
-- ----------------------------
INSERT INTO `teachers` VALUES ('804', '易天', '男', '1958-12-02 00:00:00', '副教授', '计算机系');
INSERT INTO `teachers` VALUES ('825', '李萍', '女', '1972-05-05 00:00:00', '助教', '计算机系');
INSERT INTO `teachers` VALUES ('831', '陈冰', '女', '1977-08-14 00:00:00', '助教', '电子工程系');
INSERT INTO `teachers` VALUES ('856', '王旭', '男', '1969-03-12 00:00:00', '讲师', '电子工程系');

SET FOREIGN_KEY_CHECKS = 1;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小辰~

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

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

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

打赏作者

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

抵扣说明:

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

余额充值