仅一篇精通select

数据库概述

1. 为什么要使用数据库

2. 数据库与数据库管理系统

2.1 数据库的相关概念

  • 数据库
  • 数据库管理系统
  • 结构化管理语言

2.2 数据库与数据库管理系统的关系

2.3 数据库管理系统排名

2.4 常见数据库介绍

3. MySQL介绍

3.1 概述

3.2 发展历史

3.3 MySQL8.0

3.4 优点

3.5 MySQL vs Oracle

4. RDBMS 非RDBMS

4.1 RDBMS

4.1.1 实质
4.1.2 优势

4.2 非RDBMS

5. 关系型数据库设计规则

5.1 表、记录、字段

  • ORM(Object Relational Mapping)

    • 数据库中的一个表 <===> Java中的一个类

    • 表中的一行 <===> 类中的一个对象

    • 表中的一列 <===> 类中的一个属性

5.2 表的关联关系

  • 一对一、一对多、多对多、自我引用
5.2.1 一对一

设计理念:将一张表分成两张表分别为常用字段表和非常用字段表

再用键将两张拆分表关联

5.2.2 一对多

5.2.3 多对多

5.2.4 自我引用

MySQL环境搭建

SELECT

1. SQL概述

1.1 SQL背景知识

1.2 SQL语言排行榜

1.3 SQL分类

  • DDL数据定义语言
    • CREATE
    • ALTER
    • DROP
    • RENAME
    • TRUNCATE
  • DML数据操作语言
    • INSERT
    • DELETE
    • UPDATE
    • SELECT
  • DCL数据控制语言
    • COMMIT
    • ROLLBACK
    • SAVEPIOINT
    • GRANT
    • REVOKE

2. SQL语言规则与规范

2.1 基本规则

  • 为了提高可读性,子句分行写,必要时缩进
  • 使用结束符号
  • 字符串日期类型使用’',列名使用""

2.2 SQL大小写规范

  • MySQL在Windows操作系统大小写不敏感
  • MySQL在Linux操作系统大小写敏感
    • 数据库名、表名、表别名、表变量名严格区分大小写
    • 关键字、函数名、字段名、字段别名忽略大小写
  • 推荐规范
    • 数据库名、表名、表别名、字段名、字段别名使用小写
    • SQL关键字、函数名、绑定变量都大写

2.3 注解

2.4 命名规则

  • AS :alias 规范:字段别名使用""包围

    • SELECT 字段一,字段二 AS “字段别名”,字段二 * 12 AS “字 段 别 名(带空格)”

      From 表名

DML

SELECT

  • SELECT 字段名…
    FROM 表名;

    • AS别名:

      • 两种方式
        SELECT field [AS] <“alias”>
        FROM table_name;
    • DISTINCT去重:

      • 给字段一结果去重
        SELECT DISTINCT field
        FROM table_name;
      • 给字段一和字段二的组合结果去重
        SELECT DISTINCT field1,field2
        FROM table_name;
    • 查询常数:

      • 在每条数据查询结果前添加一个常量

        SELECT <‘查询常量’>,field
        FROM table_name;

    • WHERE条件查询:

      • 条件为1时打印

      • SELECT *
        FROM table_name
        WHERE <your_condition>

DESCRIBE/DESC

  • DESCRIBE/DESC 表名;

运算

  • null

    • null 不等于 “null”,0,“”
    • null参与的运算结果也为null
      • 解决方案IFNULL(null,0)
  • 反引号`

    • 当不得不使用关键字和保留字时(例如:字段名或者表名与关键字相同),使用``包围

运算符

  • 算数运算符 + - * / div % mod

    • +没有字符串拼接功能
      • 可以使用CONCAT()方法来实现拼接
  • 比较运算符

    • 返回结果为1/0,运算符两边有一个NULL出现时返回NULL (NULL+1 = 1 结果为NULL)

    • =

    • <=> 安全等于符号(可处理NULL出现情况)

      • 比等于号多个一个功能来对NULL情况进行判断(以下情况<=>被=替换时返回值全为NULL)
      • NULL <=> NULL 返回1
        • NULL <=> 1/0 返回0
      • 1/0 <=> NULL 返回0
    • <> 不等于符号

      • !=
    • <

    • <=

    • >

    • >=

  • 运算关键字和函数

    • IS NULL

      • ISNULL()

      • IS NOT NULL

    • LEAST()

    • GREATEST()

    • LENGTH()

    • BETWEEN … AND …

      • NOT BETWEEN … AND …
    • IN()

      • NOT IN
    • LIKE

      • 转义字符 \
    • REGEXP

      • RLIKE
  • 逻辑运算符

    • NOT
      • !
    • AND
      • &&
    • OR
      • ||
    • XOR(逻辑异或)
  • 二进制/位运算符

运算符优先级

排序与分页

1. 数据排序ORDER BY

  • 默认排序是按照添加顺序来排的
  • ORDER BY field ASC/DESC
    • 升序:ASC[ascend]
    • 降序:DESC[descend]
    • SELECT field1
      FROM table_name
      WHERE conditions
      ORDER BY field1/field2/field_aliase ASC/DESC;
      • 列的别名只能在ORDER BY中使用(跟SQL语句运行顺序有关)
        1. 先运行FROM … WHERE …获取符合条件的表1
        2. 再执行SELECT …从表1获取需要的字段来组成表2
        3. 最后执行ORDER BY将表2排序

1.1 单字段排序

  • SELECT field
    FROM table_name
    WHERE conditions
    ORDER BY field ASC/DESC;

1.2 多字段排序/二级排序

  • 先排前面的字段相同的才需要再排后续字段
    SELECT field
    FROM table_name
    WHERE conditions
    ORDER BY field ASC/DESC,field ASC/DESC;

2. 分页LIMIT

2.1 分页显示

  • SELECT filed

    FROM table

    LIMIT 偏移量,page_size;

多表查询

  • 使用表连接条件:n张表相连至少有n-1个关联条件,各个条件使用AND相连
    SELECT …
    FROM …
    WHERE …

    • 多表出现相同字段时/优化查询(推荐)
      SELECT table1.field,table2.field
      FROM table1,table2
      WHERE … # 连接条件
  • 表别名

    • 与字段别名语法相同,可以在其他位置使用FROM优先执行
    • 表别名会覆盖原表名
  • 多表查询分类

    • 等值连接/非等值连接

      • 等值连接 条件表达式里使用 = / <=>
      • 非等值连接 条件表达式中不使用 = / <=>
    • 自连接/非自连接

      • 自连接 与自恋相似
      • 非自连接 不同表间连接
    • 内连接/外连接

      • 内连接 : 结果集只包含符合规则的数据

      • 外连接 :结果集包还含指定不满足的数据,数据全保留的表叫做主表,其他表叫从表

        • 左外连接 : 包含左表不满足条件的数据
        • 右外连接 : 包含右表不满足条件的数据
        • 全连接 : 包含左右表不满足条件的数据
      • SQL92语法(MySQL不支持):

        • 内连接

          SELECT employees.name AS employee_name, departments.name AS department_name  
          FROM employees  
          INNER JOIN departments ON employees.department_id = departments.id;
          
        • 外连接 把+符号给从表

          • 左连接
          SELECT employees.*, departments.department_name  
          FROM employees, departments  
          WHERE employees.department_id = departments.id(+) 
          
          • 右连接

          • 全连接

      • SQL99语法:

        使用JOIN/LEFT/RIGHT/FULL等关键字来实现多表查询 INNER/OUTER可以省略

        • 内连接

          SELECT *
          FROM emp a INNER JOIN salgrade b
          ON a.sal BETWEEN b.losal AND b.hisal
          # 如果再添加表/把结果集当作表继续连接
          JOIN xxxx c
          ON condition
          
        • 外连接

          • 左连接 LEFT
          SELECT *
          FROM emp a LEFT OUTER JOIN salgrade b
          ON a.sal BETWEEN b.losal AND b.hisal
          
          • 右连接 RIGHT
          • 全连接 FULL (MySQL 不支持)

UNION

  • UNION/UNION ALL可以建SELECT结果集合并

  • UNION
    求交集并去重
    在这里插入图片描述

  • UNION ALL
    求交集无去重
    没有去重操作,效率比UNION高
    在这里插入图片描述

多种连接实现

在这里插入图片描述

  • 左上图:使用左连接
  • 右上图:使用右连接
  • 左中图:使用左连接后添加条件
  • 右中图:使用右连接后添加条件
  • 下图:使用UNION/UNION ALL来连接上中图

SQL99-NATURAL JOIN(没用)

  • 会将两张表自动内连接(连接条件为相同字段名等值AND)不推荐使用
    SELECT a.deptno,b.deptno
    FROM dept a
    NATURAL JOIN emp b

表连接的约束条件的三种方式

  • WHERE:适用所有关联查询
  • ON:只能与JOIN配合使用,用来使用关联条件
  • USING:用处不大

SQL规范

https://ucc-private-download.oss-cn-beijing.aliyuncs.com/ba2acfb349324c0b9f62635567e2d189.pdf?Expires=1721007027&OSSAccessKeyId=LTAIvsP3ECkg4Nm9&Signature=TrGJrRDiXtL5yf461y0Z4u8H2jY%3D

MySQL函数

  • 不同DBMS的函数差异很大,以下函数大多数仅适用于MySQL

函数分类

  • 单行函数
    • 只能接收一列(一组)/一个值
  • 多行函数/聚合函数
    • 可以接收多列/多个值

单行函数

单行函数能嵌套

数值函数

基本函数

  • ABS()
  • SIGN()
  • PI()
  • CEIL/CEILING()
  • FLOOR()
  • LEAST()
  • GREATEST()
  • MOD()
  • RAND()
  • RAND(x)
  • ROUND(x)
  • ROUND(x,y)
  • TRUNCATE(x,y)
  • SQRT(x)

角度弧度互换函数

  • RADIANS(x)
  • DEGREES(x)

三角函数

  • SIN(x)
  • COS(x)
  • TAN(x)
  • COT(x)
  • ASIN(x)
  • ACOS(x)
  • ATAN(x)
  • ATAN2(x,y)

指数和对数函数

进制间的转换函数

  • BIN(x)
  • HEX(x)
  • OCT(x)
  • CONV(x,m,n)

字符串函数

  • ASCII
  • CHAR_LENGTH
  • LENGTH
  • CONCAT
  • CONCAT_WX
  • INSERT
  • REPLACE
  • UPPER/UCASE
  • LOWER/LCASE
  • LEFT
  • RIGHT

日期和时间的函数

获取
  • CURDATE/CURRENT_DATA
  • CURTIME/CURRENT_TIME
  • NOW/SYSDATE/CURRENT_TIMESTAMP/LOCALTIME/LOCALTIMESTAMP
  • UTC_DATE
日期与时间戳转换
获取月份、星期、星期几、天数等
日期的操作函数
时间和秒钟转换
计算日期和时间的函数
日期的格式化与解析

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

加密和解密函数(个人觉得没用)

流程控制函数

在这里插入图片描述
在这里插入图片描述

聚合函数

MySQL聚合函数不能嵌套

常见聚合函数

  • AVG
  • SUM
  • MAX
  • MIN
  • COUNT
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

GROUP BY

在这里插入图片描述

当级分组

在这里插入图片描述

多级分组

在这里插入图片描述

非组函数字段,如果出现在SELECT后则必须出现在GROUP BY之后
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

子查询在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

单行子查询

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

多行子查询

嗡嗡嗡
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

非相关子查询

相关子查询

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

自连接与子查询对比

在这里插入图片描述

  • 24
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Qzer_407

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值