基本语法

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. MySQL-一条sql语句的执行顺序

    手写: SELECT DISTINCT <select_list> FROM <left_table> <join_type> JOIN <right_tab ...

  2. Spring(七)SpringMVC的文件上传

    1-SpringMVC的请求-文件上传-客户端表单实现(应用) 表单项type="file" 表单的提交方式是post 表单的enctype属性是多部分表单形式,及enctype= ...

  3. Java(100-113)【类与对象、封装、构造方法】

    1.对象的创建以及使用 Student stu =new Student(); 根据一个类创建一个对象 导包.创建.使用 2.手机练习 有main才能run Phone.java package cn ...

  4. 一台window服务器部署多个tomcat(超简单配置)!!!

    1.首先准备好已经安装好的jdk环境,点击查看JDK安装. 2.准备好一个全新的tomcat,我这里使用的是tomcat-7.0.109.rar绿色版. 3.解压文件,并复制成三份.我这里是放在F:\ ...

  5. 基于FOC伺服电机驱动的Parallel Scara Robot的设计及实现

    上个学期做了一个BLDC的FOC驱动后,我便开始了基于此类电机驱动的机器人项目尝试.之前想做的是串联机械臂,奈何找不到合适的电机并且串联机械臂十分需要减速机,使得项目对于我来说(经济方面)很艰难,恰巧 ...

  6. SMTP、POP3和IMAP邮件协议

    目录 SMTP POP IMAP 总结 DNS记录中的MX记录 今天入职第一天,公司让配置个人的内网.外网邮箱,这可把我给搞晕了,本来以前就对邮箱这块不是很了解,平时也不怎么用邮箱,顶多有个QQ邮箱而 ...

  7. 百度地图api逆地址解析 PHP

    一.说明:逆地址查询就是根据经纬度信息获取地址位置信息 二.参数:$lat:纬度值 ,$lng:经度值 ,$ak = 自己的AK:(百度地图开放平台对应ak链接:http://lbsyun.baidu ...

  8. Spring Cloud Alibaba(8)---Feign服务调用

    Feign服务调用 有关Spring Cloud Alibaba之前写过五篇文章,这篇也是在上面项目的基础上进行开发. Spring Cloud Alibaba(1)---入门篇 Spring Clo ...

  9. 玩转直播系列之RTMP协议和源码解析(2)

    一.背景 实时消息传输协议(Real-Time Messaging Protocol)是目前直播的主要协议,是Adobe公司为Flash播放器和服务器之间提供音视频数据传输服务而设计的应用层私有协议. ...

  10. MySQL库表设计小技巧

    前言: 在我们项目开发中,数据库及表的设计可以说是非常重要,我遇到过很多库表设计比较杂乱的项目,像表名.字段名命名混乱.字段类型设计混乱等等,此类数据库后续极难维护与拓展.我一直相信只有优秀的库表设计 ...