MySQL 查询操作
基本语法
select 查询的列 from 表名;
注意:
select 语句中不区分⼤⼩写,查询的结果放在⼀个表格中,表格的第1⾏称为列头,第2⾏开始是数据,类属于⼀个⼆维数组。
查询常量
select 常量值1,常量值2,常量值3;
mysql> select 1,'a';
+---+---+
| 1 | a |
+---+---+
| 1 | a |
+---+---+
1 row in set (0.00 sec)
查看表达式
select 表达式;
mysql> select 1+2,3*10,10/3;
+-----+------+--------+
| 1+2 | 3*10 | 10/3   |
+-----+------+--------+
|   3 |   30 | 3.3333 |
+-----+------+--------+
1 row in set (0.00 sec)
查询函数
select 函数;
mysql> select sum(1+2);
+----------+
| sum(1+2) |
+----------+
|        3 |
+----------+
1 row in set (0.00 sec)
查询指定字段
select 字段1,字段2,字段3 from 表名;
查询所有列
select * from 表名;
列别名
select 列 [as] 别名 from 表;
表别名
select 别名.字段,别名.* from 表名 [as] 别名;
注意
- 建议别名前⾯跟上 as 关键字
- 查询数据的时候,避免使⽤ select *,建议需要什么字段写什么字段
条件查询
select 列名 from 表名 where 列 运算符 值
条件查询运算符
- 等于(=)
- 不等于(<>、!=) # 两者意义相同,在可移植性上前者优于后者
- 大于(>) # 字符按照 ASCII 码对应的值进⾏⽐较,⽐较时按照字符对应的位置⼀个字符⼀个字符的⽐较。
- 小于(<)
- 小于等于(<=)
- 大于等于(>=)
逻辑查询运算符
- AND(并且) 
- OR(或者) 
- like(模糊查询) - %:表⽰匹配任意⼀个或多个字符
- _:表⽰匹配任意⼀个字符
 
- BETWEEN ... AND(区间查询)# 可以提⾼语句的简洁度 
- IN 查询 - in 后⾯括号中可以包含多个值,对应记录的字段满⾜ in 中任意⼀个都会被返回
- in 列表的值类型必须⼀致或兼容
- in 列表中不⽀持通配符
 
- NOT IN 查询:与 IN 查询相反 
- NULL 值专用查询 - 查询运算符、like 、between ... and 、in 、not in 对 NULL 值查询不起效 - IS NULL (返回值为空的记录):select 列名 from 表名 where 列 is null;
- IS NOT NULL(返回值不为空的记录):select 列名 from 表名 where 列 is not null;
 
- <=> (安全等于):既可以判断NULL值,又可以判断普通的数值,可读性较低,⽤得较少 
排序与分页
排序查询(order by)
select 字段名 from 表名 order by 字段1 [asc|desc], 字段2 [asc|desc];
- 需要排序的字段跟在 order by 之后;
- asc|desc 表⽰排序的规则(asc:升序,desc :降序,默认为 asc)
- ⽀持多个字段进⾏排序,多字段排序之间⽤逗号隔开
排序方式
- 单字段排序
- 多字段排序
- 按别名排序
- 按函数排序
limit
limit ⽤来限制 select 查询返回的⾏数,常⽤于分页等操作
select 列 from 表 limit [offset,] count;
limit 中 offset 和 count 的值不能⽤表达式,只能够跟明确的数字(不能为负数)
分页查询:select 列 from 表名 limit (page - 1) * pageSize, pageSize;
分组查询
SELECT column, group_function,... FROM table
[WHERE condition]
GROUP BY group_by_expression
[HAVING group_condition];
- group_function:聚合函数
- group by expression :分组表达式,多个之间⽤逗号隔开。
- group_condition :分组之后对数据进⾏过滤
分组中 select 后⾯只能有两种类型的列
- 出现在 group by 后的列
- 使⽤聚合函数的列
聚合函数
聚合函数对一组值执行计算并返回单一的值
- max:求最大值
- min:求最小值
- sum:求累加和
- avg:求平均值
- count:统计行的数量
单字段分组
GROUP BY X # 意思是将所有具有相同X字段值的记录放到一个分组里
多字段分组
GROUP BY X, Y # 意思是将所有具有相同X字段值和Y字段值的记录放到一个分组里
分组前筛选数据
分组前对数据进⾏筛选,使⽤ where 关键字
分组后筛选数据
分组后对数据筛选,使⽤having 关键字
where 和 having 的区别
- where 是在分组(聚合)前对记录进⾏筛选,⽽ having 是在分组结束后的结果⾥筛选,最
后返回整个 sql 的查询结果。- 可以把 having 理解为两级查询,即含having 的查询操作先获得不含 having ⼦句时的sql查询
结果表,然后在这个结果表上使⽤having 条件筛选出符合的记录,最后返回这些记录,因
此,having 后是可以跟聚合函数的,并且这个聚集函数不必与 select 后⾯的聚集函数相
同。
where & group by & having & order by & limit ⼀起协作
where、group by 、having 、order by 、limit 这些关键字⼀起使⽤时,先后顺序有明确的限
制,语法如下:
select 列 from
表名
where [查询条件]
group by [分组表达式]
having [ 分组过滤条件]
order by [排序条件]
limit [offset,] count;
注意:必须按照上⾯的顺序写 SQL 语句,否则报错
MySQL 常用函数汇总
MySQL 数值型函数
- abs:求绝对值
- sqrt:求二次方根
- mod:求余数
- ceil 和 ceiling:向上取整
- floor:向下取整
- rand:生成随机数
- round:四舍五入
- sign:返回参数的符号(正数:1 负数:-1 零:0)
- pow 和 power:次方
- sin:正弦
MySQL 字符串函数
- length:返回字符串字节长度
- concat:合并字符串
- insert:替换字符串
- lower:将字符串转换为小写
- upper:将字符串转换为大写
- left:从左侧截取字符串
- right:从右侧截取字符串
- trim:删除字符串两侧空格
- replace:字符串替换
- substr 和 substring:截取字符串
- reverse:反转字符串
MySQL 日期和时间函数
- curdate 和 current_date:返回当前系统日期 - mysql> select curdate();
 +------------+
 | curdate() |
 +------------+
 | 2021-02-28 |
 +------------+
 1 row in set (0.01 sec)
 
- curtime 和 current_time:返回当前系统时间 - mysql> select curtime();
 +-----------+
 | curtime() |
 +-----------+
 | 20:02:42 |
 +-----------+
 1 row in set (0.00 sec)
 
- now 和 sysdate:返回当前系统日期和时间 - mysql> select now();
 +---------------------+
 | now() |
 +---------------------+
 | 2021-02-28 20:03:22 |
 +---------------------+
 1 row in set (0.00 sec)
 
- unix_timestamp:获取 UNIX 时间戳 - mysql> select unix_timestamp();
 +------------------+
 | unix_timestamp() |
 +------------------+
 | 1614513856 |
 +------------------+
 1 row in set (0.00 sec)
 # UNIX_TIMESTAMP(date) 若⽆参数调⽤,返回⼀个⽆符号整数类型的 UNIX 时间戳('1970-01-01 00:00:00'GMT 之后的秒数)
 
- from_unixtime:时间戳转日期 - mysql> select from_unixtime(1614513856);
 +---------------------------+
 | from_unixtime(1614513856) |
 +---------------------------+
 | 2021-02-28 20:04:16 |
 +---------------------------+
 1 row in set (0.00 sec)
 
- month:获取指定日期月份 
- monthname:获取指定日期月份的英文名称 
- dayname:获取指定日期的星期名称 
- dayofweek:获取日期对应的周索引(1 表⽰周⽇,7 表⽰周六) 
- week:获取指定日期是一年的第几周 
- dayofyear:获取指定日期在一年中的位置 
- dayofmonth:获取指定日期在一个月中的位置 
- year:获取年份 
- time_to_sec:将时间转换为秒值 
- sec_to_time:将秒值转换为时间格式 
- date_add 和 adddate:日期加法运算 
- date_sub 和 subdate:日期减法运算 
- addtime:时间加法运算 
- subtime:时间减法运算 
- datediff:获取两个日期的时间间隔 
- date_format:格式化指定日期 - mysql> select date_format(now(),'%Y-%m-%d %H:%i:%s') as time;
 +---------------------+
 | time |
 +---------------------+
 | 2021-02-28 20:16:11 |
 +---------------------+
 1 row in set (0.00 sec)
 
- weekday:获取指定日期在一周内的索引(0:星期⼀ 6:星期日) 
MySQL 流程控制函数
- if:判断 
- ifnull:判断是否为空 
- case:搜索语句,类似于java 中的if..else if..else - # ⽅式1:
 CASE <表达式>
 WHEN <值1> THEN <操作>
 WHEN <值2> THEN <操作>
 ...
 ELSE <操作>
 END CASE; # ⽅式2:
 CASE
 WHEN <条件1> THEN <命令>
 WHEN <条件2> THEN <命令>
 ...
 ELSE commands
 END CASE;
 - 子查询- 嵌套在 select 语句中的 select 语句,称为⼦查询或内查询。外部的 select 查询语句,称为主查询或外查询。 - 子查询分类- 按结果集的⾏列数不同分类 - 标量子查询(结果集中只有一行一列) - SELECT * FROM employees a
 WHERE a. salary > (SELECT salary
 FROM employees
 WHERE last_name = 'Abel');
 
- 列子查询(结果集中只有一列多行) - SELECT a.last_name FROM employees a
 WHERE a. department_id IN (SELECT DISTINCT department_id
 FROM departments
 WHERE location_id IN (1400, 1700));
 
- 行子查询(结果集中只有一行多列) - SELECT * FROM employees a
 WHERE a. employee_id = (SELECT min (employee_id) FROM employees)
 AND salary = (SELECT max (salary) FROM employees);
 
- 表子查询(结果集中有多行多列) 
 - 按⼦查询出现在主查询中的不同位置分类 - select 后⾯:仅仅⽀持标量⼦查询 - SELECT
 a.*,
 (SELECT count(*)
 FROM employees b
 WHERE b. department_id = a.department_id ) AS employee_num
 FROM departments a;
 
- from 后⾯:⽀持表⼦查询 - 将⼦查询的结果集充当⼀张表,要求必须起别名,否者这个表找不到。然后将真实的表和⼦查询结果表进⾏连接查询。 - SELECT
 t1.department_id,sa AS '平均⼯资',t2.grade_level
 FROM (SELECT department_id, avg (a. salary ) sa FROM employees a
 GROUP BY a.department_id ) t1, job_grades t2
 WHERE
 t1.sa BETWEEN t2.lowest_sal AND t2. highest_sal ;
 
- where 或 having 后⾯:⽀持标量⼦查询(单列单⾏)、列⼦查询(单列多⾏)、⾏⼦查询(多列多⾏) - in ,any ,some,all分别是⼦查询关键词之⼀ - in :in 常⽤于 where 表达式中,其作⽤是查询某个范围内的数据
- any 和 some⼀样:可以与 =、>、>=、<、<=、<> 结合起来使⽤,分别表⽰等于、⼤于、⼤于等于、⼩于、⼩于等于、不等于其中的任何⼀个数据
- all:可以与=、>、>=、<、<=、<>结合是来使⽤,分别表⽰等于、⼤于、⼤于等于、⼩于、⼩于等于、不等于其中的其中的所有数据
 
- exists 后⾯(即相关⼦查询):表⼦查询(多⾏、多列) - exists查询结果:1 或 0,exists 查询的结果⽤来判断⼦查询的结果集中是否有值;⼀般来说,能⽤exists的⼦查询,绝对都能⽤ in 代替,所以 exists ⽤的少
- 和前⾯的查询不同,这先执⾏主查询,然后主查询查询的结果,在根据⼦查询进⾏过滤,⼦查询中涉及到主查询中⽤到的字段,所以叫相关⼦查询
 - SELECT exists (SELECT employee_id FROM employees WHERE salary = 300000 ) AS 'exists返回1或者0';
 
 - 注意⼦查询中列的值为 NULL 的时候,外查询的结果为空(大坑) - 连接查询- 笛卡尔积(交叉连接)- 有两个集合 A 和 B,笛卡尔积表⽰ A 集合中的元素和 B 集合中的元素,任意相互关联产⽣的所有可能的结果。 - select 字段 from 表1,表2[, 表N]; # 隐式交叉连接
 或者
 select 字段 from 表1 join 表2 [join 表N]; # 显示交叉连接
 - 内连接- 内连接相当于在笛卡尔积的基础上加上了连接的条件。当没有连接条件的时候,内连接上升为笛卡尔积。  - select 字段 from 表1 inner join 表2 on 连接条件;
 或
 select 字段 from 表1 join 表2 on 连接条件;
 或
 select 字段 from 表1, 表2 [where 关联条件];
 - 内连接也称为等值连接,结果为返回两张表都满足条件的部分 - 外连接- 外连接涉及到 2 个表,分为:主表和从表,要查询的信息主要来⾃于哪个表,谁就是主表。外连接查询结果为主表中所有记录。如果从表中有和它匹配的,则显⽰匹配的值,这部分相当于内连接查询出来的结果;如果从表中没有和它匹配的,则显⽰ null 。 - 外连接查询结果 = 内连接的结果 + 主表中有的⽽内连接结果中没有的记录 - 左外连接- 取左边的表的全部,右边的表按条件,符合的显示,不符合则显示 null  - select 列 from 主表 left join 从表 on 连接条件;
 - 右外连接- 取右边的表的全部,左边的表按条件,符合的显示,不符合则显示 null  - select 列 from 从表 right join 主表 on 连接条件;
 - 全连接- 使用 full join 关键字,全连接返回左外连接和右外连接的结果  - select 列 from 从表 full join 主表 on 连接条件;
 - 自连接- 自连接是指使用表的别名实现表与其自身连接的查询方法。 
MySQL 查询操作的更多相关文章
- MySQL查询操作——2
		-----------查询操作--------------------------- 查询表中的所有字段SELECT * FROM employees; 查询常量值SELECT 100;SELECT ... 
- MYSQL查询操作 详细
		学习目标 1 掌握select查询所有字段.指定字段的数据 2 掌握消除重复行命令distinct 3 掌握as给字段.表起别名 4 掌握条件查询where后跟比较运算符.逻辑运算符的用法 5 掌握条 ... 
- mysql查询操作之单表查询、多表查询、子查询
		一.单表查询 单表查询的完整语法: .完整语法(语法级别关键字的排列顺序如下) select distinct 字段1,字段2,字段3,... from 库名.表名 where 约束条件 group ... 
- MySQL查询操作
		查询执行路径中的组件:查询缓存.解析器.预处理器.优化器.查询执行引擎.存储引擎SELECT语句的执行流程: FROM Clause --> WHERE Clause --> GROUP ... 
- mysql查询操作1
		##1.在已有的表中插入一行记录 insert into tb_name values("",""...); ##2.查询语句的框架和用法 select 字段名 ... 
- MySQL查询操作select
		查找记录 SELECT select_expr [,select_expr ...] [ FROM table_references(表的参照) [WHERE where_condition](条件) ... 
- C#参数化执行SQL语句,防止漏洞攻击本文以MySql为例【20151108非查询操作】
		为什么要参数化执行SQL语句呢? 一个作用就是可以防止用户注入漏洞. 简单举个列子吧. 比如账号密码登入,如果不用参数, 写的简单点吧,就写从数据库查找到id和pw与用户输入一样的数据吧 sql:se ... 
- MySQL(三) 数据库表的查询操作【重要】
		序言 1.MySQL表操作(创建表,查询表结构,更改表字段等), 2.MySQL的数据类型(CHAR.VARCHAR.BLOB,等), 本节比较重要,对数据表数据进行查询操作,其中可能大家不熟悉的就对 ... 
- MySQL数据库学习笔记(九)----JDBC的ResultSet接口(查询操作)、PreparedStatement接口重构增删改查(含SQL注入的解释)
		[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ... 
随机推荐
- [面试仓库]HTML面试题汇总
			HTML这一块呢,说简单也简单,说难也不是那么容易.但我们在各个面试要求中,大部分都把HTML这一条摆在了第一位,重要性可想而知.这个位置算是有关HTML的一个汇总点了,亦会在这里及时补充. 1, ... 
- OO 第一单元
			OO第一单元总结 前言 第一单元 OO 作业的主题是求导,从最简单的幂函数求导,到添加三角函数求导,再到最后添加嵌套规则.(对熬夜有了新体验,OO 作业比较适合晚上写,OO 博客也是一样 doge) ... 
- 采用QT技术,开发OFD电子文档阅读器
			前言 ofd作为板式文档规范,相当于国产化的pdf.由于pdf标准制定的较早,相关生态也比较完备,市面上的pdf阅读器种类繁多.国内ofd阅读器寥寥无几,作者此前采用wpf开发了一款阅读器,但该阅读器 ... 
- Java(56-64)【IDEA】
			1.IDEA的使用 集成开发软件 eclipse IDEA 第一步:创建新的项目 第二步:空白的project 第三步:modules->java 写在src中 src->package- ... 
- Kubernetes 查看node
			// 查看所有节点及labelskubectl get nodes --show-labels 删除节点的labels # 语法 kubectl label nodes <node-name&g ... 
- JAVA JNI 中解决在C/C++跨线程FindClass失败
			在JAVA与C/C++交互时使用JNI接口: 先是在JAVA调用的C++方法中直接测试FindClass,使用获取到的jclass操作没有任何问题: 但是在调用的C++方法中起线程后,在线程中Find ... 
- 图解高性能网络架构:Reactor 和 Proactor
			小林,来了. 这次就来图解 Reactor 和 Proactor 这两个高性能网络模式. 别小看这两个东西,特别是 Reactor 模式,市面上常见的开源软件很多都采用了这个方案,比如 Redis.N ... 
- Django模板引擎
			Django作为Web框架,需要一种很便利的方法动态地生成 HTML 网页,因此有了模板这个概念.模板包含所需 HTML 的部分代码以及一些特殊语法,特殊语法用于描述如何将视图传递的数据动态插入HTM ... 
- Selenium3自动化测试【17】元素定位之Link定位
			Link定位 find_element_by_link_text方法是通过文本链接来定位元素. 以Bing首页中顶部的[学术]链接为例,如图所示. 查看对应的html代码.从html中我们能看出这是一 ... 
- 1.4.19- HTML标签之注释标签
			有的时候我们输入的代码,让你别人看,别人不知道你的思路,可能就看不懂,或者或一段时间自己就看不懂了,这个时候我们需要对代码进行注释,解释我们的代码什么意思: <!DOCTYPE html> ... 
