基本语法

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 后⾯只能有两种类型的列
  1. 出现在 group by 后的列
  2. 使⽤聚合函数的列
聚合函数

聚合函数对一组值执行计算并返回单一的值

  • 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 查询操作的更多相关文章

  1. MySQL查询操作——2

    -----------查询操作--------------------------- 查询表中的所有字段SELECT * FROM employees; 查询常量值SELECT 100;SELECT ...

  2. MYSQL查询操作 详细

    学习目标 1 掌握select查询所有字段.指定字段的数据 2 掌握消除重复行命令distinct 3 掌握as给字段.表起别名 4 掌握条件查询where后跟比较运算符.逻辑运算符的用法 5 掌握条 ...

  3. mysql查询操作之单表查询、多表查询、子查询

    一.单表查询 单表查询的完整语法: .完整语法(语法级别关键字的排列顺序如下) select distinct 字段1,字段2,字段3,... from 库名.表名 where 约束条件 group ...

  4. MySQL查询操作

    查询执行路径中的组件:查询缓存.解析器.预处理器.优化器.查询执行引擎.存储引擎SELECT语句的执行流程: FROM Clause --> WHERE Clause --> GROUP ...

  5. mysql查询操作1

    ##1.在已有的表中插入一行记录 insert into tb_name values("",""...); ##2.查询语句的框架和用法 select 字段名 ...

  6. MySQL查询操作select

    查找记录 SELECT select_expr [,select_expr ...] [ FROM table_references(表的参照) [WHERE where_condition](条件) ...

  7. C#参数化执行SQL语句,防止漏洞攻击本文以MySql为例【20151108非查询操作】

    为什么要参数化执行SQL语句呢? 一个作用就是可以防止用户注入漏洞. 简单举个列子吧. 比如账号密码登入,如果不用参数, 写的简单点吧,就写从数据库查找到id和pw与用户输入一样的数据吧 sql:se ...

  8. MySQL(三) 数据库表的查询操作【重要】

    序言 1.MySQL表操作(创建表,查询表结构,更改表字段等), 2.MySQL的数据类型(CHAR.VARCHAR.BLOB,等), 本节比较重要,对数据表数据进行查询操作,其中可能大家不熟悉的就对 ...

  9. MySQL数据库学习笔记(九)----JDBC的ResultSet接口(查询操作)、PreparedStatement接口重构增删改查(含SQL注入的解释)

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

随机推荐

  1. 跨域库herryPostMessage.js的一些优化,多iframe跨域

    旧库见文章:https://www.cnblogs.com/wuhairui/p/14595893.html 新版库主要做了下多个iframe和父页面交互的优化.主要使用构造函数的方式将多个ifram ...

  2. Molar mass UVA - 1586

    ​ An organic compound is any member of a large class of chemical compounds whose molecules contain c ...

  3. Python基础语法和数据类型最全总结

    摘要:总结了Python最全基础语法和数据类型总结,一文带你学会Python. 本文分享自华为云社区<Python最全基础语法和数据类型总结>,原文作者:北山啦 . 人生苦短,我用Pyth ...

  4. Spring Cloud Alibaba(3)---Nacos概述

    Spring Cloud Alibaba(3)---nacos概述 上一篇博客讲了有关 SpringCloudAlibaba的概述,这篇开始讲SpringCloudAlibaba组件之一---Naco ...

  5. 详解Linux指令与文件的搜寻

    我们在管理Linux服务器时通常会进行搜索文件及目录操作,下面我们就开始了解一下linux目录结构的相关知识. 博主再奉上一套零基础入门Linux视频,带你从入门到精通 https://www.bil ...

  6. Django模板引擎

    Django作为Web框架,需要一种很便利的方法动态地生成 HTML 网页,因此有了模板这个概念.模板包含所需 HTML 的部分代码以及一些特殊语法,特殊语法用于描述如何将视图传递的数据动态插入HTM ...

  7. 概A第二章测试

    以下判断题全是(√) 问题 1 得 10 分,满分 10 分                     问题 2 得 10 分,满分 10 分       0-1分布相当于一个特殊的二项分布b(1,p) ...

  8. 模拟退火算法(1)Python 实现

    1.模拟退火算法 模拟退火算法借鉴了统计物理学的思想,是一种简单.通用的启发式优化算法,并在理论上具有概率性全局优化性能,因而在科研和工程中得到了广泛的应用. 退火是金属从熔融状态缓慢冷却.最终达到能 ...

  9. 也谈如何写一个Webserver(-)

    关于如何写一个Webserver,很多大咖都发表过类似的文章.趁着这个五一假期,我也来凑个份子. 我写Webserver的原因,还得从如何将http协议传送的消息解析说起.当时,我只是想了解一下htt ...

  10. 01- APP移动端测试怎么测试?APP测试方法大全。

    由于智能手机时代来临,很多产品都有了APP,作为一个测试人员掌握APP测试是必要的. 在展开APP测试之前,首先了解一下几个点: 1.基于软件测试框架之上.复习下软件测试框架. 2.框架的内容贯穿于A ...