SELECT 语法

单表查询

查询所有的字段(或列) SELECT * FROM employees;

查询个别列

​ SELECT employee_id,last_name,salary FROM employees; (不带别名)

​ SELECT employee_id emp_id,last_name AS lname, department_id “部门Id” FROM employees;

​ SELECT employee_id emp_id,last_name AS lname, department_id “部门id” salary*12 “annual sal” FROM employees;

列的别名使用“”引起来,不要使用’ ’

​ SELECT DISTINCT department_id, salary FROM employees; DISTINCT 表示唯一,去重,这里对department_id去重

空值参与运算

​ 空值为Null,null 不等同于0,’’,‘null’

​ SELECT employee_id, salary “月工资”, salary * (1+commission_pct)*12 “年工资”, commission_pct FROM employees;

如果commission_pct为NULL,则SQL会报错

​ SELECT employee_id, salary “月工资”, salary * (1 + IFNULL(commission_pct,0))*12 “年工资”, commission_pct FROM employees;

着重号 ` xx `, xx 可以为关键字,当字段名/表名与保留字重名,必加着重号

查询常数 SELECT ‘xxx’, 123, employee_id, last_name FROM employees;

显示表结构 DESCRIBE employees; DESC employees;

WHERE

过滤数据 WHERE

查询90号部门的员工信息

​ SELECT * FROM employees WHERE department_id = 90;

查询last_name为King的员工信息

​ WHERE last_name=‘King’

运算符

运算符

  1. 算术运算符 + - * / div % mod

  2. SELECT 100+‘1’ FROM dual;

    => 101 (SQL)

    => 1001 (JAVA)

    在SQL中,+没有连接的作用,就表示加法运算。此时,会将字符串转换为数值(隐式转换)

由运算结果可以得出以下结论:

  1. 一个整数类型的值对整数进行加法和减法操作,结果还是一个整数
  2. 一个整数类型的值对浮点数进行加减,结果还是一个浮点数
  3. 加减法的优先级相同,进行先加后减操作与进行先减后加操作的结果是一样的
  4. 在Java中,+的左右两边如果有字符串,那么表示字符串的拼接。但是在MySQL中+只表示数值加,如果遇到非数值类型,先转化为数值不行再转换为0
  5. MySQL中字符串的拼接CONCAT
  6. 分母为0,则结果为NULL
  7. 取模运算% mod

比较运算符

​ 1. 结果为真=>1,结果为假=>0,其他情况=>NULL

​ 2. = 等于运算符,<=> 安全等于(安全地判断两个值,字符串或表达式是否相等,适用NULL

​ <>(!=) 不等于运算符, < 小于, <= 小于等于 , > 大于 >= 大于等于

举例 SELECT 1=2, 1!=3, 1=‘1’,1=‘a’, 0=‘a’ FROM dual;

运行结果:1=2 => 0; 1!=3 => 1; 1=‘1’ => 1; 1=‘a’ => 0; 0=‘a’ =>1

字符串存在隐式转换。如果转换不成功,则看作0;

两边都是字符串,则安装ANSI的比较规则进行比较,字符串存在隐式转换。如果数值转换不成功,则看作0,只要有null参与判断,结果就为null

  1. null参与计算,结果为null

举例 SELECT 1 = NULL, NULL = NULL FROM dual;

​ SELECT XX WHERE yy = NULL (NULL);

  1. <=> 安全等于,记忆技巧:为NULL而生

    举例 SELECT xx,yy,zz FROM tb WHERE zz <=> NULL;能查找出所有zz为NULL的信息

  2. 其他运算符

    IS NULL \ IS NOT NULL \ ISNULL

    举例

    zz 不是NULL

    SELECT xx,yy,zz FROM tb WHERE zz IS NOT NULL;

    SELECT xx,yy,zz FROM tb WHERE NOT zz <=> NULL;

    zz 是NULL

    SELECT xx,yy,zz FROM tb WHERE zz IS NULL;

    SELECT xx,yy,zz FROM tb WHERE ISNULL(zz);

    SELECT xx,yy,zz FROM tb WHERE zz <=> NULL;

  3. LEASE() GREATEST()

    SELECT LEAST(‘g’,‘m’,‘t’) , GREATEST(‘g’,‘m’,‘t’) FROM dual;

  4. BETWEEN … AND …

    举例

    SELECT xx,yy,zz FROM tb WHERE zz BETWEEN 0 AND 20;

    SELECT xx,yy,zz FROM tb WHERE zz NOT BETWEEN 0 AND 20;

  5. IN

    SELECT xx, yy ,zz FROM tb WHERE zz IN(10,20,30);

    SELECT xx,yy,zz FROM tb WHERE zz NOT IN (60,70,80);

  6. LIKE(模糊查询)

    %代表不确定个数的字符_代表一个字符,\_代表_下划线$_ ESCAPE $

    SELECT last_name FROM tb WHERE last_name LIKE ‘%a%’;

  7. REGEXP RLIKE 正则表达式

    SELECT ‘atguigu’ REGEXP ‘gu.gu’, ‘atguigu’ REGEXP ‘[ab]’ FROM dual;

  8. 逻辑运算符

    运算符 作用 示例
    NOT 或 ! 逻辑非 SELECT NOT A
    AND 或 && 逻辑与 SELECT A AND B
    OR 或 || 逻辑或 SELECT A OR B ;SELECT A || B
    XOR 逻辑异或 SELECT A XOR B

    AND 优先级高于OR

  9. 位运算符

    位运算符是在二进制数上进行计算的运算符。位运算符会先将操作数变成二进制,然后进行位运算,最后转化为十进制。

  10. ORDER BY … ASC / DESC

    如果在ORDER BY 后没有显示指明排序的方式的话,则默认按照升序排序

    列的别名只能在ORDER BY 中使用,不能在WHERE 中使用

  11. 多列排序

    SELECT xx,yy,zz FROM tb ORDER BY yy,zz DESC;

  12. LIMIT

    SELECT xx,yy FROM tb LIMIT start, count;

  13. WHERE … ORDER BY … LIMIT

    SELECT xx,yy,zz FROM tb WHERE xx > 6000 ORDER BY xx DESC LIMIT 0,10 # 取前10条数据

多表查询

笛卡尔积

举例 SELECT xx , yy FROM tb1 ,tb2;

结果:tb1的xx的排列 * tb2的yy的排列 (笛卡尔乘积)

多表查询中出现的问题:笛卡尔积的错误

错误原因:缺少了多表的连接条件 ,如果用CROSS JOIN 等同于这个错误

多表查询的正确条件需要有连接条件

举例 SELECT xx,yy FROM tb1, tb2 WHERE tb1.key = tb2.key;

笛卡尔乘积的错误会在以下条件中产生

  • 省略多个表的连接条件
  • 连接条件(或关联条件)无效
  • 所有表中的所有行互相连接

为了避免笛卡尔乘积可以在WHERE中加入有效的连接条件

查询列表中如果加入两表都有的字段会报错

column 'xx' in field list is ambiguous

如果查询语句中出现多个表中都有的字段,则必须指明此字段所在的表

建议:字段前加上表名(可优化SQL);可以给表起别名(缩短SQL,提高可读性)

如果有n个表实现多表的查询,则需要至少有n-1个连接条件

多表查询的分类

角度1 :等值连接 VS 非等值连接

举例 SELECT * FROM job_grades;

SELECT e.last_name,e.salary, j.grade_level FROM employees e, job_grades j WHERE e.`salary` <= j.`highest_sal` AND e.`salary` >= j.`lowest_sal`;

角度2:自连接 VS 非自连接

举例 SELECT emp.id, emp.name, mgr.id, mgr.name FROM employees emp, employees mgr WHERE emp.manager_id = mgr.id;

角度3:内连接 VS 外连接

内连接 合并具有同一列的两个以上的表的行,结果集中不包含一个表与另一个表不匹配的行

举例 SELECT employee_id, department_name FROM employees e ,department d WHERE e.`department_id` = d.`department_id`;

外连接 合并具有同一列的两个以上的表的行,结果集中除了包含一个表与另一个表匹配的行,也包含两表中不匹配的行

外连接的分类:左外连接 右外连接 满外连接

左外连接 两个表在连接过程中除了返回满足连接条件的行以外,还返回左表中不满足条件的行

右外连接 两个表在连接过程中除了返回满足连接条件的行以外,还返回右表中不满足条件的行

举例 查询所有的xx , yy … => 外连接

SQL92与SQL99语法

MySQL不支持SQL92的语法

SQL99语法中使用 JOIN … ON 的方式实现多表的查询。这种方式也能解决外连接的问题。MySQL是支持这种方式的

7种外连接示意图

UNION操作符和UNION ALL 操作符

UNION 操作符返回两个查询的结果集的并集,去除重复记录

UNION ALL 操作符返回两个查询结果集的并集,对于两个结果集的重复部分,不去重

注意:

执行UNION ALL 语句时所需要的资源比UNION 。如果不需去重,尽量使用UNION ALL,以提高SQL执行速度。

SQL99新特性:NATURAL JOIN 和 USING

  • NATURAL JOIN SELECT xx FROM tb NATURAL JOIN tA A:它会帮你自动查询两张表中所有相同的字段,然后进行等值连接。

  • USING 替换ON的连接条件 ON A.key = B.key <=> USING(key)

注意:

  • 控制连接表的数量。多表连接就相当于嵌套for循环一样,非常消耗资源
  • 超过三个表禁止JOIN,需要JOIN的字段,数据类型保持绝对一致,多表关联查询时,保证被关联的字段需要有索引
  • 说明:即使双表JOIN也要注意索引,SQL的性能

MySQL专题二——SELECT语法相关推荐

  1. MySQL入门 (二) : SELECT 基础查询

    1 查询资料前的基本概念 1.1 表格.纪录与栏位 表格是资料库储存资料的基本元件,它是由一些栏位组合而成的,储存在表格中的每一笔纪录就拥有这些栏位的资料. 以储存城市资料的表格「city」来说,设计 ...

  2. mysql(二)--select语法

    文章目录 select语法 一.逻辑运算 二. 比较运算符 三.联表查询 四.子查询 五.分组和过滤 select语法 select distinct * from '表名' where '限制条件' ...

  3. mysql select high_priority_MySQL进阶SELECT语法篇

    MySQL进阶SELECT语法篇 2019-09-29 编程之家收集整理的这篇文章主要介绍了MySQL进阶SELECT语法篇,编程之家小编觉得挺不错的,现在分享给大家,也给大家做个参考. MysqL中 ...

  4. 【MySQL专题】MySQL中一条SQL是如何被执行的?---来自于令狐的独孤九剑

    [MySQL专题]MySQL中一条SQL是如何被执行的? 前言 ​ 大家好,我是令狐,欢迎来到令狐的独孤九剑**[MySQL专题]**这节课跟大家聊一聊MySQL中一条SQL是如何被执行的. MySQ ...

  5. MySQL专题(学会就毕业)

    MySQL专题 0.准备sql 设计一张员工信息表,要求如下: 编号(纯数字) 员工工号 (字符串类型,长度不超过10位) 员工姓名(字符串类型,长度不超过10位) 性别(男/女,存储一个汉字) 年龄 ...

  6. MySQL 存储过程 经常使用语法

    MySQL 存储过程是从 MySQL 5.0 開始添加的新功能.存储过程的长处有一箩筐.只是最基本的还是运行效率和SQL 代码封装.特别是 SQL 代码封装功能,假设没有存储过程,在外部程序訪问数据库 ...

  7. 用MySql的查询分析语法explain来优化查询和索引

    http://hi.baidu.com/wtnzone/item/beb83840a4971af4dd0f6c77 数据库最常见的操作就是查询了,我们经常要用"SELECT"语法对 ...

  8. mysql 语句块语法_MySQL ------ MySQL常用语句的语法 (三十四)

    MySQL常用的语句语法 注意:1. | 符号用来指出几个选中中的一个,因此NULL | NOT NULL 表示给出null 或 not null 2.包含在方括号中的关键字或子句是可选的(如 [li ...

  9. MySQL SHOW INDEX 的语法解析

    本文主要讲解一下mysql show index 的语法,以 show index from bbs_posts 为例,先看下执行效果如图 1.Table   表名 2.Non_unique  如果索 ...

  10. Mysql数据库存储过程基本语法讲解

    Mysql数据库存储过程基本语法讲解 一般情况下MYSQL以:结尾表示确认输入并执行语句,但在存储过程中:不是表示结束,因此可以用该命令将:号改为//表示确认输入并执行.存储过程如同一门程序设计语言, ...

最新文章

  1. 曾因出演《西游记》爆红,现在转行写代码身价过亿!不一样的CTO!
  2. mysql max_allowed_packet 参数 限制接受的数据包大小
  3. ERC721关于NFT的学习和理解
  4. java 文件随机读取_Java 实现文件随机读写-RandomAccessFile
  5. java backbone_[Java教程]移动前端开发中的Backbone之一:Backbone中的模型和集合
  6. 域控 正在应用计算机设置,域控制器下发的用户组策略在ou内的用户上没有应用...
  7. Asp Net Core 5 REST API 使用 RefreshToken 刷新 JWT - Step by Step(三)
  8. PhotoShop基础知识
  9. [置顶] 如何把你的笔记本电脑变成一个Wi-Fi路由器在Windows 7 8?
  10. micropython 驱动oled0.91_[MicroPython]STM32F407开发板驱动OLED液晶屏
  11. 系统学习NLP(二十)--SWEM
  12. 使用计数器、译码器,在数码管上显示1~4
  13. android在副屏中运行一个应用_android一个app打开另一个app的指定页面
  14. java打开文件对话框
  15. Win10更改系统背景颜色(设置护眼模式)
  16. 计算机的使用编码,计算机中使用的编码
  17. Java面向对象编程 实验报告
  18. 浏览器打开标签页的几种方式
  19. 百度竞价推广之关键词的选择策略
  20. win10如何删除输入法_顽固输入法exe文件无法删除,一招教你如何删除,原来这么简单...

热门文章

  1. TPYBoard中编译MicroPython并利用DfuSe经行固件烧录
  2. i yfiygol hul hl
  3. SEUS 转换XML到JAVA
  4. JavaScript工具类:util.js用法实例
  5. mysql latch和缓存关系_latch:cachebufferschains等待事件导致的latch争用的原理原因与...
  6. 平板做笔记本电脑的副屏教程
  7. VML 魅力初现--美少女图(vml可以这样强大?)
  8. 什么是双活数据中心 ?双活数据中心有哪些优点​?
  9. 三维地理信息系统空间的可视分析
  10. 获取手机mac地址和串号IMEI