Mysql常用的查询SQL

1.基础select 查询 (练习:参考最下面测试表和数据)

  • 1)去重
-- 查询表中所有学生的姓名和对应的英语成绩。(对name字段进行去重)
SELECT DISTINCT `name`, english FROM student;
  • 2)起别名
语法:
select column1 aliasName from table;
-- 或者
select column1 as aliasName from table;
  • 3)在where中常用的运算符,如下图所示:
    常用where后的运算符
    1. 排序字段,如下图所示:
      语法:
Select column1,column2,column3...
From table
order by column asc|desc...
  • 1.Order by 指定排序的列,排序的列既可以是表中的列名,也可以是select语句后指定的列名
  • 2.ASC 升序【mysql默认的排序方式】,Desc 降序
  • 3.Order by 子句应位于select语句的结尾

2.合计/统计函数

2.1 count 函数

语法

Select count(*) | count(列名) from Table [Shere where_definition];

演示 mysql 的统计函数count的使用

-- 统计一个班级共有多少学生? 
SELECT COUNT(*) FROM student;
-- 统计数学成绩大于 90 的学生有多少个
SELECT COUNT(*) FROM student WHERE math > 90; 
-- 统计总分大于 250 的人数有多少
SELECT COUNT(*) FROM student WHERE (math + english + chinese) > 250;

count(*)和count(列名)的区别?

解释 :

count(*) 返回满足条件的记录的行数
count(列): 统计满足条件的某列有多少个,但是会排除 为 null 的情况

举例说明
-- 建表
CREATE TABLE t15 ( `name` VARCHAR(20)); 
-- 插入数据
INSERT INTO t15 VALUES('tom'); 
INSERT INTO t15 VALUES('jack'); 
INSERT INTO t15 VALUES('mary'); 
INSERT INTO t15 VALUES(NULL); 
-- select语句说明
SELECT * FROM t15; SELECT COUNT(*) FROM t15;  -- 结果:4
SELECT COUNT(`name`) FROM t15; -- 结果:3

2.2 sum 函数

说明:

返回满足where条件的行的和,一般使用在数值列;

语法:

Select sum(列名){,sum(列名)...} from Table [Where where_definition];

注意:

1.sum仅对数值字段起作用,字符串字段没有意义
2.对多列求和,","英文逗号不能少。

演示函数的使用:

-- 统计一个班级数学总成绩
SELECT SUM(math) FROM student; 
-- 统计一个班级语文、英语、数学各科的总成绩 
SELECT SUM(math) AS math_total_score,SUM(english),SUM(chinese) FROM student; 
-- 统计一个班级语文、英语、数学的成绩总和 
SELECT SUM(math + english + chinese) FROM student; 
-- 统计一个班级语文成绩平均分 
SELECT SUM(chinese)/ COUNT(*) FROM student; SELECT SUM(`name`) FROM student;

2.3 avg函数

说明:

满足where 条件一列的平均值;

语法:

Select avg(列名){,sum(列名)...} from Table [Where where_definition];

演示 avg 函数的使用

-- 求一个班级数学平均分 
SELECT AVG(math) FROM student; 
-- 求一个班级总分平均分 
SELECT AVG(math + english + chinese) FROM student;

2.4 max/min函数

说明:

返回满足where条件的一列的最大/最小值;

语法:

Select max(列名) from Table [Where where_definition];

演示函数的max/min函数的使用:

-- 求班级最高分和最低分(数值范围在统计中特别有用) 
SELECT MAX(math + english + chinese), MIN(math + english + chinese) from student;
-- 求出班级数学最高分和最低分
SELECT MAX(math) AS math_high_socre, MIN(math) AS math_low_socre FROM student;

2.5 group by和having 函数

说明:

group by: 对列进行分组
having: 对分组后的结果进行过滤

语法:

-- group by 语法:
Select column1,column2,column3 
from Table 
[Where where_definition]
group by column;
-- having 语法:
Select column1,column2,column3 
from Table 
[Where where_definition]
group by column having column4=??;

演示函数的group by和having函数的使用:

-- 1.建测试表
-- /*部门表*/
CREATE TABLE dept(  
deptno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0, 
dname VARCHAR(20) NOT NULL DEFAULT "", 
loc VARCHAR(13) NOT NULL DEFAULT "" 
);
-- 员工表
CREATE TABLE emp (
empno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0, /*编号*/ 
ename VARCHAR(20) NOT NULL DEFAULT "", /*名字*/ 
job VARCHAR(9) NOT NULL DEFAULT "",/*工作*/ 
mgr MEDIUMINT UNSIGNED ,/*上级编号*/ 
hiredate DATE NOT NULL,/*入职时间*/ 
sal DECIMAL(7,2) NOT NULL,/*薪水*/ 
comm DECIMAL(7,2) ,/*红利 奖金*/ 
deptno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0 /*部门编号*/ 
);

-- 工资级别表 
CREATE TABLE salgrade (
grade MEDIUMINT UNSIGNED NOT NULL DEFAULT 0, /*工资级别*/ 
losal DECIMAL(17,2) NOT NULL, /* 该级别的最低工资 */ 
hisal DECIMAL(17,2) NOT NULL /* 该级别的最高工资*/ 
);
-- 2.插入数据
INSERT INTO dept VALUES
(10, 'ACCOUNTING', 'NEW YORK'), 
(20, 'RESEARCH', 'DALLAS'), 
(30, 'SALES', 'CHICAGO'), 
(40, 'OPERATIONS', 'BOSTON');

INSERT INTO emp VALUES
(7369, 'SMITH', 'CLERK', 7902, '1990-12-17', 800.00,NULL , 20), 
(7499, 'ALLEN', 'SALESMAN', 7698, '1991-2-20', 1600.00, 300.00, 30), (7521, 'WARD', 'SALESMAN', 7698, '1991-2-22', 1250.00, 500.00, 30), 
(7566, 'JONES', 'MANAGER', 7839, '1991-4-2', 2975.00,NULL,20), 
(7654, 'MARTIN', 'SALESMAN', 7698, '1991-9-28',1250.00,1400.00,30),
(7698, 'BLAKE','MANAGER', 7839,'1991-5-1', 2850.00,NULL,30), 
(7782, 'CLARK','MANAGER', 7839, '1991-6-9',2450.00,NULL,10), 
(7788, 'SCOTT','ANALYST',7566, '1997-4-19',3000.00,NULL,20), 
(7839, 'KING','PRESIDENT',NULL,'1991-11-17',5000.00,NULL,10), 
(7844, 'TURNER', 'SALESMAN',7698, '1991-9-8', 1500.00, NULL,30), 
(7900, 'JAMES','CLERK',7698, '1991-12-3',950.00,NULL,30), 
(7902, 'FORD', 'ANALYST',7566,'1991-12-3',3000.00, NULL,20), (7934,'MILLER','CLERK',7782,'1992-1-23', 1300.00, NULL,10);

INSERT INTO salgrade VALUES (1,700,1200); 
INSERT INTO salgrade VALUES (2,1201,1400); 
INSERT INTO salgrade VALUES (3,1401,2000); 
INSERT INTO salgrade VALUES (4,2001,3000); 
INSERT INTO salgrade VALUES (5,3001,9999);
-- 3. 演示group by 和 having 的使用
# 演示 group by + having 函数
--group by子句 用于对查询的结果分组统计,having 子句用于限制分组显示结果. 
-- 如何显示每个部门的平均工资和最高工资 
-- 分析: avg(sal) max(sal) 
-- 按照部分来分组查询 
SELECT AVG(sal), MAX(sal) , deptno FROM emp GROUP BY deptno; 
-- 使用数学方法,对小数点进行处理 
SELECT FORMAT(AVG(sal),2), MAX(sal) , deptno FROM emp GROUP BY deptno;

-- 显示每个部门的每种岗位的平均工资和最低工资 
-- 分析 
-- 1. 显示每个部门的平均工资和最低工资 
-- 2. 显示每个部门的每种岗位的平均工资和最低工资 
SELECT AVG(sal), MIN(sal), deptno, job FROM emp GROUP BY deptno, job;

-- 显示平均工资低于 2000 的部门号和它的平均工资 // 别名 
-- 分析 [写 sql 语句的思路是化繁为简,各个击破] 
-- 1. 显示各个部门的平均工资和部门号
-- 2. 在 1 的结果基础上,进行过滤,保留 AVG(sal) < 2000 
-- 3. 使用别名进行过滤
SELECT AVG(sal), deptno FROM emp GROUP BY deptno HAVING AVG(sal) < 2000; 
-- 使用别名 
SELECT AVG(sal) AS avg_sal, deptno 
FROM emp 
GROUP BY deptno 
HAVING avg_sal < 2000;

3.字符串相关函数,如下图所示

在这里插入图片描述

演示字符串相关函数的使用

3.1 CHARSET(str) 返回字符串的字符集

SELECT CHARSET(ename) FROM emp;

3.2 CONCAT(string2[,…])连接字串,将多个列拼接成一列

SELECT CONCAT(ename,'工作是',job) FROM emp;

3.3 INSTR(string,substring)返回substring在string中出现的位置,没有返回0

--dual亚元表,系统表可以作为测试表使用
SELECT INSTR('hanshunping','ping') FROM DUAL;

3.4 UCASE(string2)转换成大写

SELECT UCASE(ename) FROM emp;

3.5 LCASE(string2)转换成小写

SELECT LCASE(ename) FROM emp;

3.6 LEFT(string2,length)从string2中的左边起取length个字符

3.7 RIGHT(string2,length)从string2中的右边起取length个字符

SELECT LEFT(ename,2) FROM emp;

3.8 LENGTH(string), 查询列值string长度[按照字节]

SELECT LENGTH(ename) FROM emp;

3.9 REPLACE(str,search_str,replace_str),在str中用replace_str替换search_str

--如果是manager就替换成经理
SELECT ename,REPLACE(job,'MANAGER','经理') FROM emp;

3.10 STRCMP(str1,str2),逐字符比较两字串大小

SELECT STRCMP('hsp','hsp') FROM DUAL;
-- 相等,返回0
-- str1>str2 返回正数,如:1,说明str1比str2多一个字符
-- str1<str2 返回负数,如:-1,说明str1比str2少一个字符

3.11 SUBSTRING(str,position[,length]), 从str的position开始【从1开始计算】,取length个字符

--从ename列的第一个位置开始取出2个字符
SELECT SUBSTRING(ename,1,2) FROM emp;

3.12 LTRIM(string2)RTRIM(string2)TRIM(string),去除前端空格或后端空格

SELECT LTRIM(' Leo教育 ') FROM DUAL;

3.13字符串函数练习:

-- 以首字母小写的方式显示所有员工emp表的姓名
-- 思路先取出ename的第一个字符,转成小写的
-- 把他和后面的字符串进行拼接输出即可
-- 方法1:
SELECT CONCAT(LCASE(SUBSTRING(ename,1,1)),SUBSTRING(ename,2)) AS new_name
FROM emp;
-- 方法2:
SELECT CONCAT(LCASE(LEFT(ename,1)),SUBSTRING(ename,2)) AS new_name 
from emp;

3.数学相关函数

数学相关函数图示

ABS(num) 绝对值

SELECT ABS(-10) FROM DUAL; --10

BIN(decimal_number)十进制转二进制

SELECT BIN(10) FROM DUAL; --1010

CONV(number2 ,from_base,to_base) 进制转换

-- 下面的含义:十进制的8,转换成二进制输出
SELECT CONV(8,10,2) FROM DUAL;  -- 1000
--下面的含义是8是16进制的8,转成2进制输出
SELECT CONV(8,16,2)FROM DUAL; -- 1000

CEILING(number2)向上取整,得到比num2大的最小整数

SELECT CEILING(-1.1) FROM DUAL; -- -1

FLOOR(number2) 向下取整,得到比num2小的最大整数

SELECT FLOOR(-1.1) FROM DUAL; -- -2

HEX(DecimalNumber)转十六进制

LEAST(number,number2[,…])求最小值

SELECT LEAST(0,1,-10,4) FROM DUAL; -- -10

MOD(numerator,denominator) 求余

SELECT MOD(10,3)FROM DUAL;  -- 1

RAND([seed]) 返回随机数,范围0≤v≤1.0,

说明:如果seed不变,该随机数也不变了

SELECT RAND() FROM DUAL;
-- 下面的输出结果会一直是:0.6555866465490187
SELECT RAND(2) FROM DUAL;

4.时间日期相关函数

时间日期相关函数图示

演示部分函数

上图中,用的较多的是now() 函数
select now() from dual; -- 2023-04-02 18:28:19
其他函数演示:select 语句中 去掉 from dual 也可运行
-- 相差多长时间:04:01:01
SELECT TIMEDIFF('10:11:11','06:10:10') FROM DUAL;
-- YEAR|Month|DAY|DATE(datetime)函数
SELECT YEAR(NOW()) FROM DUAL; -- 2023
SELECT Month(NOW()) FROM DUAL; -- 4
SELECT DAY(NOW()) FROM DUAL; -- 2
SELECT MONTH('2013-11-10') FROM DUAL; -- 11

select timediff(now()+10,now()) from dual;  --00:00:10
select year(now()) from dual; --2023
-- unix_timestamp():返回1970-1-1到现在的秒数
select unix_timestamp() from dual; --1680431452
-- 在实际开发中,我们也经常使用int来保存一个unix时间戳,然后使用from unixtime() 进行转换,还是非常有实用价值的.(%Y-%m-%d格式是规定好的,表示年月日)
-- 举例说明:
SELECT FROM_UNIXTIME(1618483484,'%Y-%m-%d') FROM DUAL; -- 2021-04-15
SELECT FROM_UNIXTIME(1618483100,'%Y-%m-%d %H:%i:%s')FROM DUAL; -- 2021-04-15 18:38:20

-- 输出结果:2023-03-03 18:36:48, 减去24h后的值
select from_unixtime(unix_timestamp()-3600*24*30,'%Y-%m-%d %H:%i:%s')
from dual;
-- 输出结果:2023-04-02 18:36:48
select from_unixtime(unix_timestamp(),'%Y-%m-%d %H:%i:%s')
from dual;

在这里插入图片描述

  • 上面4个函数的细节说明:
    – 1. DATE ADD()中的interval 后面可以是year minute second day等
    – 2. DATE SUB()中的interval 后面可以是year minute second hour day等
    – 3. DATEDIFF(date1,date2) 得到的是天数,而且是date1-date2的天数,因此可以取负数
    – 4.这四个函数的 日期类型可以是date, datetime或者timestamp

常用的当前时间函数

--当前时间戳 2023-04-02 18:05:30,年月日,时分秒
SELECT CURRENT_TIMESTAMP() FROM DUAL;
--当前日期: 2023-04-02,年月日
SELECT CURRENT_date() FROM DUAL;
-- 当前时间:18:09:19,时分秒
SELECT CURRENT_time() FROM DUAL;

时间日期函数强化练习

-- 练习日期函数的基本使用,
-- 1.建表
create table message(
	id int,
	content varchar(30),
	sendtime datetime
);
-- 2.插入数据
insert into message values(2,'北京新闻',now());
insert into message values(3,'杭州新闻',now());
-- 3.练习
--1)显示所有留言信息,发布日期只显示日期,不用显示时间
SELECT id,content,DATE(sendtime) from message;
-- 输出:2 | 杭州新闻 | 2023-04-02
-- 2)请查询在10分钟内发布的帖子
-- 方法1:
select * FROM message
WHERE DATE_ADD(sendtime,INTERVAL 10 MINUTE) >=NOW();
-- 方法2:
select * FROM message
WHERE sendtime>=DATE_SUB(NOW(),INTERVAL 10 MINUTE);

-- 3)请在mysql的sq|语句中求出2011-11-11和1990-1-1相差多少天
SELECT DATEDIFF('2011-11-11','1990-01-01') FROM DUAL; -- 7984

-- 4)请用mysql的sq|语句求出你活了多少天
--分析:先求出活80岁时,是什么日期x,
-- 然后在使用datediff(x,now());1986-11-11->datetime
-- INTERVAL 80 YEAR:YEAR可以是年月日,时分秒
-- '1986-11-11'可以date,datetime, timestamp
select datediff(now(),'1990-01-20') from dual;
-- 5)如果你能活80岁,求出你还能活多少天
select datediff(date_add('1990-01-20',interval 80 year),now()) from dual;

5.加密和系统函数

加密和系统函数图示

演示加密函数和系统函数

--USER()查询用户
-- 可以查看登录到mysql的有哪些用户,以及登录的IP 
--返回数据格式:用户@IP地址,如:root@localhost
SELECT USER()FROM DUAL; 

-- DATABASE():查询当前使用数据库名称
SELECT DATABASE();  -- test_sql,当前使用的数据库名称
-- MD5(str)为字符串算出一个MD532的字符串,
-- 常用(用户密码)加密
--root密码是hsp->加密md5->在数据库中存放的是加密后的密码
SELECT MD5('leo') FROM DUAL; -- 0f759dd1ea6c4c76cedc299039ca4f23
SELECT LENGTH(MD5('leo'))FROM DUAL; -- 32 验证字符串的长度
-- PASSWORD(str)
--加密函数,MySQL数据库的用户密码就是PASSWORD函数加密
SELECT PASSWORD('leo');
-- 输出结果:*0E558D9FBD602CDA0C9F3F7A8BC5F4F53401CD7C

--mysql.user表示数据库.表
select * from mysql.user;
-- 输出:
-- HOST 	| User | ... 列名
-- localhost| root | ... 列值
-- localhost|lml_stu|... 列值

练习使用

-- 1.建表
create table users(
	id int,
	name varchar(32) not null default '',
	pwd char(32) not null default ''
);
-- 2.插入数据
insert into users values(1,'LEO',MD5('leo');

--3. 查询看结果
-- 输出结果: 1 | LEO | 0f759dd1ea6c4c76cedc299039ca4f23

6.流程控制函数

流程控制函数图示

演示流程控制语句

#IF(expr1,expr2,expr3) 如果expr1为True,则返回expr2否则返回expr3
SELECT IF(TRUE,'北京','上海')FROM DUAL; -- 北京

#IFNULL(expr1,expr2)如果expr1不为空NULL,则返回expr1,否则返回expr2
SELECT IFNULL(NULL,'Leo打怪兽')FROM DUAL; -- Leo打怪兽

SELECT 
CASE 
WHEN expr1 THEN expr2 
WHEN expr3 THEN expr4 
ELSE expr5 
END;
-- [类似多重分支.]
-- 说明:如果expr1为TRUE,则返回expr2,如果expr2为t,返回expr4,否则返回expr5
-- 输出:jack
SELECT CASE
WHEN TRUE THEN 'jack'
WHEN FALSE THEN'tom'
ELSE'mary'
END;  

7.mysql查询 --加强

分页查询

在这里插入图片描述

分页查询公式:

select * from table
order by id desc
limit pageSize * (pageNum -1 ), pageSize;

-- pageSize:每页显示的记录数,页数
-- pageNum:第几页,页码

数据分组总结:

如果select语句同时包含有group by ,having,limit,order by,
那么它们的执行顺序是:group by , having, order by ,limit
在这里插入图片描述

==================================================

备注:

建表语句

-- 建表语句
CREATE TABLE student( 
	id INT NOT NULL DEFAULT 1, 
	NAME VARCHAR(20) NOT NULL DEFAULT '', 
	chinese FLOAT NOT NULL DEFAULT 0.0, 
	english FLOAT NOT NULL DEFAULT 0.0,
	 math FLOAT NOT NULL DEFAULT 0.0 
 );
-- 插入数据
INSERT INTO student(id,NAME,chinese,english,math) VALUES(1,'韩非子',89,78,90); 
INSERT INTO student(id,NAME,chinese,english,math) VALUES(2,'张飞',67,98,56); 
INSERT INTO student(id,NAME,chinese,english,math) VALUES(3,'宋江',87,78,77); 
INSERT INTO student(id,NAME,chinese,english,math) VALUES(4,'关羽',88,98,90); 
INSERT INTO student(id,NAME,chinese,english,math) VALUES(5,'赵云',82,84,67); 
INSERT INTO student(id,NAME,chinese,english,math) VALUES(6,'欧阳锋',55,85,45); 
INSERT INTO student(id,NAME,chinese,english,math) VALUES(7,'黄蓉',75,65,30); 
INSERT INTO student(id,NAME,chinese,english,math) VALUES(8,'韩信',45,65,99); 
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值