MySQL Select查询
1. 基本语法:
SELECT
{* | <字段列名>}
[
FROM <表 1>, <表 2>…
[WHERE <表达式>
[GROUP BY <group by definition>
[HAVING <expression> [{<operator> <expression>}…]]
[ORDER BY <order by definition>]
[LIMIT[<offset>,] <row count>]
]
1.1 全部查询
SELECT * FROM < 表名 >;
1.2 选择指定字段
SELECT <字段名1>,<字段名2>,…,<字段名n> FROM <表名>;
1.3 过滤字段中的重复值: DISTINCT
SELECT DISTINCT <字段名> FROM <表名>;
1.4 别名 :AS
给很长的表或者字段可以起个别名,用别名进行查询
mysql> select a.id,a.name from user as a;
+----+------+
| id | name |
+----+------+
| 1 | Wang |
+----+------+
mysql> select id as userID from user;
+--------+
| userID |
+--------+
| 1 |
+--------+
1.5 限制查询结果的记录数量:LIMIT
<LIMIT> [<位置偏移量>,] <行数>
“位置偏移量”指从哪一行开始显示,是一个可选参数,如果不指定“位置偏移量”,将会从表中的第一条记录开始(第一条记录的位置偏移量是 0,第二条记录的位置偏移量是 1,以此类推);
第二个参数“行数”指示返回的记录条数。
# 查询从第3+1条记录开始的4条数据。
mysql> SELECT * FROM <表名> LIMIT 3,4;
1.6 排序查询:ORDER BY
ORDER BY {<列名> | <表达式> | <位置>} [ASC|DESC] ASC 升序
DESC 降序
e.g.
从user中查询所有字段,先按照 balance 字段进行降序排列,再按照 debt 字段升序排序
mysql> select * from user order by balance desc,debt asc;
+----+------+----------+---------+------+
| id | name | password | balance | debt |
+----+------+----------+---------+------+
| 1 | Wang | 1234 | 15000 | 0 |
| 2 | song | 1234 | 3000 | 100 |
| 3 | li | 1234 | 2000 | 0 |
| 4 | zhao | NULL | NULL | NULL |
| 5 | qian | NULL | NULL | NULL |
| 6 | sun | NULL | NULL | NULL |
| 9 | NULL | NULL | NULL | 70 |
| 8 | NULL | NULL | NULL | 80 |
| 7 | Zhou | NULL | NULL | 90 |
+----+------+----------+---------+------+
1.7 条件查询: WHERE
WHERE <查询条件> {<判定运算1>,<判定运算2>,…} 判断条件:
1. >,<,<=,>=,=,<>,!=,<=> # 注:<=> 判断两个数据是否相等,只是可以和 NULL 进行比较,其他方面和 = 没啥差别。
2. [NOT]LIKE
3. IS [NOT] NULL
4. [NOT] BETWEEN ... AND ...
5. [NOT][REGEXP|RLIKE]
单一查询:
mysql> select balance from user where name = 'Wang';
+---------+
| balance |
+---------+
| 15000 |
+---------+
多条件查询:
mysql> select name,balance from user where balance>=3000 and balance<16000;
+------+---------+
| name | balance |
+------+---------+
| Wang | 15000 |
| song | 3000 |
+------+---------+
1.8 LIKE 模糊查询
<表达式1> [NOT] LIKE <表达式2>
通配符:
1. 百分号:% : 可以匹配 0 个或多个字符,不匹配 空值。
2. 下划线:_ : 只匹配一个字符。
mysql> select * from user;
+----+------+----------+---------+------+
| id | name | password | balance | debt |
+----+------+----------+---------+------+
| 1 | Wang | 1234 | 15000 | 0 |
| 2 | song | 1234 | 3000 | 100 |
| 3 | li | 1234 | 2000 | 0 |
| 4 | zhao | NULL | NULL | NULL |
| 5 | qian | NULL | NULL | NULL |
| 6 | sun | NULL | NULL | NULL |
| 7 | Zhou | NULL | NULL | 90 |
| 8 | NULL | NULL | NULL | 80 |
| 9 | NULL | NULL | NULL | 70 |
+----+------+----------+---------+------+ mysql> select name,debt from user where name like '%ng';
+------+------+
| name | debt |
+------+------+
| Wang | 0 |
| song | 100 |
+------+------+
1.9 查询日期
select * from <table> where date<'2019-01-20'; select * from <table> where date between '2019-01-20' and '2019-10-01';
2.0 内连接查询
mysql> select * from grade;
+------+--------+
| gid | record |
+------+--------+
| 1 | 100 |
| 2 | 200 |
| 3 | 400 |
+------+--------+ mysql> select * from user;
+----+------+----------+---------+------+
| id | name | password | balance | debt |
+----+------+----------+---------+------+
| 1 | Wang | 1234 | 15000 | 0 |
| 2 | song | 1234 | 3000 | 100 |
| 3 | li | 1234 | 2000 | 0 |
| 4 | zhao | NULL | NULL | NULL |
| 5 | qian | NULL | NULL | NULL |
| 6 | sun | NULL | NULL | NULL |
| 7 | Zhou | NULL | NULL | 90 |
| 8 | NULL | NULL | NULL | 80 |
| 9 | NULL | NULL | NULL | 70 |
+----+------+----------+---------+------+ # 内连接查询
mysql> select * from user inner join grade where user.id=grade.gid;
+----+------+----------+---------+------+------+--------+
| id | name | password | balance | debt | gid | record |
+----+------+----------+---------+------+------+--------+
| 1 | Wang | 1234 | 15000 | 0 | 1 | 100 |
| 2 | song | 1234 | 3000 | 100 | 2 | 200 |
| 3 | li | 1234 | 2000 | 0 | 3 | 400 |
+----+------+----------+---------+------+------+--------+ # 不写inner join,默认也是内连接
mysql> select * from user, grade where user.id=grade.gid;
+----+------+----------+---------+------+------+--------+
| id | name | password | balance | debt | gid | record |
+----+------+----------+---------+------+------+--------+
| 1 | Wang | 1234 | 15000 | 0 | 1 | 100 |
| 2 | song | 1234 | 3000 | 100 | 2 | 200 |
| 3 | li | 1234 | 2000 | 0 | 3 | 400 |
+----+------+----------+---------+------+------+--------+ # 指定查询哪些字段
mysql> select user.id,user.name,user.balance,grade.gid from user, grade where user.id=grade.gid;
+----+------+---------+------+
| id | name | balance | gid |
+----+------+---------+------+
| 1 | Wang | 15000 | 1 |
| 2 | song | 3000 | 2 |
| 3 | li | 2000 | 3 |
+----+------+---------+------+
2.1 外连接
左外连接:
基于左边的表,将右边表中的字段合并过来
mysql> select id,name,record from user left join grade on user.id = grade.gid;
+----+------+--------+
| id | name | record |
+----+------+--------+
| 1 | Wang | 100 |
| 2 | song | 200 |
| 3 | li | 400 |
| 4 | zhao | NULL |
| 5 | qian | NULL |
| 6 | sun | NULL |
| 7 | Zhou | NULL |
| 8 | NULL | NULL |
| 9 | NULL | NULL |
+----+------+--------+
右外连接:
mysql> select id,name,record from user right join grade on user.id = grade.gid;
+------+------+--------+
| id | name | record |
+------+------+--------+
| 1 | Wang | 100 |
| 2 | song | 200 |
| 3 | li | 400 |
+------+------+--------+
2.2 子查询
1. IN
<表达式> [NOT] IN <子查询> 此处的子查询只能返回一行数据
2. 比较运算符
<表达式> {= | < | > | >= | <= | <=> | < > | != }
{ ALL | SOME | ANY} <子查询>
3. EXISTS
判断子查询是否存在,如果存在,True,否则False;
IN:
mysql> select * from grade;
+------+--------+
| gid | record |
+------+--------+
| 1 | 100 |
| 2 | 200 |
| 3 | 400 |
+------+--------+ mysql> select * from user;
+----+------+----------+---------+------+
| id | name | password | balance | debt |
+----+------+----------+---------+------+
| 1 | Wang | 1234 | 15000 | 0 |
| 2 | song | 1234 | 3000 | 100 |
| 3 | li | 1234 | 2000 | 0 |
| 4 | zhao | NULL | NULL | NULL |
| 5 | qian | NULL | NULL | NULL |
| 6 | sun | NULL | NULL | NULL |
| 7 | Zhou | NULL | NULL | 90 |
| 8 | NULL | NULL | NULL | 80 |
| 9 | NULL | NULL | NULL | 70 |
+----+------+----------+---------+------+ mysql> select * from user where id in (select gid from grade where gid=2);
+----+------+----------+---------+------+
| id | name | password | balance | debt |
+----+------+----------+---------+------+
| 2 | song | 1234 | 3000 | 100 |
+----+------+----------+---------+------+
EXISTS:
mysql> select * from user where exists (select * from grade where gid=1000);
Empty set (0.00 sec) mysql> select * from user where exists (select * from grade where gid=1);
+----+------+----------+---------+------+
| id | name | password | balance | debt |
+----+------+----------+---------+------+
| 1 | Wang | 1234 | 15000 | 0 |
| 2 | song | 1234 | 3000 | 100 |
| 3 | li | 1234 | 2000 | 0 |
| 4 | zhao | NULL | NULL | NULL |
| 5 | qian | NULL | NULL | NULL |
| 6 | sun | NULL | NULL | NULL |
| 7 | Zhou | NULL | NULL | 90 |
| 8 | NULL | NULL | NULL | 80 |
| 9 | NULL | NULL | NULL | 70 |
+----+------+----------+---------+------+
2.3 分组查询
分组查询查到是每个组,相同的数据会合并到一个组里,是看不到的。可以使用聚合函数对每个组的数据进行求和、统计数量等。
mysql> select * from user;
+----+------+----------+---------+------+
| id | name | password | balance | debt |
+----+------+----------+---------+------+
| 1 | Wang | 1234 | 15000 | 0 |
| 2 | song | 1234 | 3000 | 100 |
| 3 | li | 1234 | 2000 | 0 |
| 4 | zhao | NULL | NULL | NULL |
| 5 | qian | NULL | NULL | NULL |
| 6 | sun | NULL | NULL | NULL |
| 7 | Zhou | NULL | NULL | 90 |
| 10 | Wang | NULL | 15000 | NULL |
+----+------+----------+---------+------+ # 按照名字分组,查询每个分组的id,name,balance的总和。sum,聚合函数之一。
mysql> select id,name,sum(balance) from user group by name;
+----+------+--------------+
| id | name | sum(balance) |
+----+------+--------------+
| 1 | Wang | 30000 |
| 2 | song | 3000 |
| 3 | li | 2000 |
| 4 | zhao | NULL |
| 5 | qian | NULL |
| 6 | sun | NULL |
| 7 | Zhou | NULL |
+----+------+--------------+
HAVING
having,给分组添加过滤,筛选符合条件的分组
mysql> select count(name) ,name from user group by name having count(name)>1;
+-------------+------+
| count(name) | name |
+-------------+------+
| 2 | Wang |
+-------------+------+
2.4 正则表达式查询:REGEXP
匹配模式
^ 匹配开始字符 '^b'匹配以b开头的字符串
$ 匹配结束字符 'b$'匹配以b结束的字符串
. 匹配任意单个字符
* 匹配前面的字符0次或多次 a*b 匹配 b、ab、aaaaaaaab
+ 匹配前面的字符1次或多次 a+b 匹配 ab、aaaaaab
<字符> 匹配包含的字符 <fa> 匹配 afa,fa,bbbfaccc
[] 匹配内部的任意一个字符 [xyz] 匹配 x 或 y 或 z
[^] 匹配不在括号内的字符 [^1-9] 不匹配 1-9
{n,} 匹配前一个字符最少n次
{n,m} 匹配前一个字符最少n次,最多m次。
e.g.
mysql> select * from user where name regexp '^W';
+----+------+----------+---------+------+
| id | name | password | balance | debt |
+----+------+----------+---------+------+
| 1 | Wang | 1234 | 15000 | 0 |
| 10 | Wang | NULL | 15000 | NULL |
+----+------+----------+---------+------+
2 rows in set (0.02 sec)
MySQL Select查询的更多相关文章
- MYSQL select查询练习题
10. 查询Score表中的最高分的学生学号和课程号.(子查询或者排序) select sno,cno from score where degree=(select max(degree) from ...
- day41:MYSQL:select查询练习题
目录 1.表结构 2.创建表和插入数据 3.习题 1.表结构 2.建表和插入数据 # 创建班级表 create table class( cid int primary key auto_increm ...
- MySQL select 查询之分组和过滤
SELECT 语法 SELECT [ALL | DISTINCT] {* | table.* | [table.field1[as alias1][,table.field2[as alias2]][ ...
- MySQL select 查询的分页和排序
SELECT 语法 SELECT [ALL | DISTINCT] {* | table.* | [table.field1[as alias1][,table.field2[as alias2]][ ...
- mysql select语句查询流程是怎么样的
select查询流程是怎么样的 mysql select查询的数据是查询内存里面,如果没有查询的数据没有在内存,就需要mysql的innodb引擎读取磁盘,将数据加载的内存后在读取.这就体现了,mys ...
- MYSQL—— 基础入门,select 查询涉及到的关键字组合详解(进阶篇)
SELECT查询组合使用的关键字很多,首先将最简单常用的关键字进行区分及使用,后续再继续补充............ 以下所有的关键字组合使用,主要以两个表students与students_scor ...
- MySQL使用select查询时,在查询结果中增加一个字段并指定固定值
假设需求是这样的: mysql> desc user; +-------+----------+------+-----+---------+----------------+ | Field ...
- mysql的select查询语句
1.简单查询 mysql> select * from students; +------------+----------+------+------+ | id | sname | sex ...
- 转载《mysql 一》:mysql的select查询语句内在逻辑执行顺序
原文:http://www.jellythink.com/archives/924 我的抱怨 我一个搞应用开发的,非要会数据库,这不是专门的数据库开发人员干的事么?话说,小公司也没有数 据库开发人员这 ...
随机推荐
- iOS charts CombinedChartView First and last bars are shown half only
charts 使用CombinedChartView 绘图时,发现第一个和最后一个bar只能显示一半的问题,解决方法: ChartXAxis *xAxis = chartView.xAxis; xAx ...
- MySQL orzdba、dodba、top、iostat、vmstat、perf等
1 mysq自带的mysqladmin命令 mysqladmin -usystem -p*** -h127.0.0.1 -P3306 -r -i 1 extended-status \ |grep & ...
- Java SE 8 docs——Static Methods、Instance Methods、Abstract Methods、Concrete Methods和field
一.Static Methods.Instance Methods.Abstract Methods.Concrete Methods ——Static Methods:静态方法 ——Instance ...
- epoll 性能分析(解决占用CPU 过高问题)
针对自己写的一个服务器网络引擎Engine 文章后面附上源码 使用epoll 刚刚开始时候发现占用CPU 特别高,但是网络引擎里面基本没干什么事,不应该有这么高的CPU,一直不解, 于是自己慢慢的分 ...
- Scratch少儿编程系列:(十)系列总结及后续计划
一.系列文章的来由 本篇为该系列文章的一个简单总结, 从初次接触Scratch开始,在写本系列文章过程中,一边读书,一边通过例子做练习. 技术实现,对于我跟人来说,没有什么难度. 我相信,对于一个初次 ...
- KVM虚拟机管理(2)
一.virt-manager创建虚机 命令行需要下载下面的组件: CentOS7: 命令行界面升级为图形化界面 yum groupinstall "X Window System" ...
- python 并发编程 进程池与线程池
一 进程池与线程池 1.为什么需要进程池和线程池 基于多进程或多线程实现并发的套接字通信,然而这种实现方式的致命缺陷是: 服务端的程序运行在一台机器身上,一台机器性能是有极限的,不能无限开线程 服务的 ...
- windows jenkins 发布 springboot项目脚本
windows jenkins 发布 springboot项目脚本 1.关闭现有程序 (按端口关闭) [与按应用关闭 二选一] @echo off for /f "tokens=1-5&q ...
- css精灵图使用
1. 精灵技术的使用 CSS 精灵其实是将网页中的一些背景图像整合到一张大图中(精灵图),然而,各个网页元素通常只需要精灵图中不同位置的某个小图,要想精确定位到精灵图中的某个小图,就需要使用CSS的b ...
- 3.学习Dispatcher
3.学习Dispatcher 不管是WinForm应用程序还是WPF应用程序,实际上都是一个进程,一个进程可以包含多个线程,其中有一个是主线程,其余的是子线程. 在WPF或WinForm应用程序中,主 ...