君玉自牧 君玉自牧
首页
  • Linux
  • Nginx
  • MySQL
  • Redis
  • Kafka
  • Docker
  • Jenkins
  • Oneindex
  • Bitwarden
  • Confluence
  • Photogallery
  • 智能手机
  • 上古卷轴
  • 健身记录
  • 站点相关
  • 未完待续
GitHub (opens new window)
首页
  • Linux
  • Nginx
  • MySQL
  • Redis
  • Kafka
  • Docker
  • Jenkins
  • Oneindex
  • Bitwarden
  • Confluence
  • Photogallery
  • 智能手机
  • 上古卷轴
  • 健身记录
  • 站点相关
  • 未完待续
GitHub (opens new window)
  • 技术架构

  • 桌面维护

  • 网络工程

  • 系统运维

    • Linux

    • Apache

    • Nginx

    • MySQL

      • MySQL 安装部署 & 项目实践
      • MySQL 主从复制 & 读写分离
      • MySQL 相关设置 & 性能调优
      • MySQL 数据备份 & 迁移恢复
      • MySQL v5.7.9 安装部署
      • MySQL 事务 & 视图 & 索引
      • MySQL 慢查询 & 可视化分析
      • MySQL 位运算函数
      • SQL 语法入门
        • SQL 简介
          • 用途
          • 特性
          • 概念
          • 主键
        • SQL 语句
          • 数据库表
          • 增删改查
          • 增加
          • 删除
          • 修改
          • 查询
          • 其他语句
          • WHERE
          • IS (NOT) NULL
          • BETWEEN AND
          • NOT
          • ORDER BY
          • LIMIT
        • 复杂查询
          • 排序
          • 分组
          • 联查
          • 连表
          • 实例
          • 分组联查
    • Redis

    • MQ

    • ELK

    • Nacos

    • PostgreSQL

    • MongoDB

  • 环境搭建

  • 容器编排

  • 持续集成

  • 监控告警

  • 项目实践

  • 脚本开发

  • 前端开发

  • 后端开发

  • 效率工具

目录

SQL 语法入门

# SQL 简介

SQL 是 Structured Query Language(结构化查询语言)的缩写,用于管理关系数据库;包含数据库模式创建和修改、数据的访问控制:插入、查询、更新和删除等操作。

# 用途

  • 面向数据库执行查询
  • 从数据库取回数据
  • 在数据库中插入新的记录
  • 更新数据库中的数据
  • 从数据库删除记录
  • 创建新数据库
  • 在数据库中创建新表
  • 在数据库中创建存储过程
  • 设置表、存储过程和视图的权限

# 特性

  • 标准的计算机语言
  • 对大小写不敏感
  • 以;表示结束,可分成多行以便于阅读和调试
  • 自上而下执行

# 概念

数据库(database) 保存有组织的数据的容器
表(table) 某种特定类型数据的结构化清单
模式(schema) 关于数据库和表的布局及特性的信息
列(column) 表中的一个字段,所有表都是由一个或多个列组成
数据类型(datatype) 所容许的数据的类型
行(row) 表中的一个记录
主键(primary key) 一列(或一组列),其值能够唯一区分表中每个行
外键(foreign key) 表中的一列,它包含另一个表的主键值,定义了两个表之间的关系
子句(clause) SQL 语句由子句构成,有些子句是必需的,有些是可选的,比如 select 语句的 from 子句

# 主键

不更新主键列中的值; 不重用主键列的值; 不在主键列中使用可能会更改的值。

# SQL 语句

连接数据库

mysql -uroot -p
show full processlist
explain
ALTER TABLE employee ADD COLUMN Ethnic_Groups char(6) DEFAULT NULL COMMENT '民族' AFTER Sex;
1
2
3
4

# 数据库表

CREATE DATABASE 创建新数据库
ALTER DATABASE 修改数据库
CREATE TABLE 创建新表
ALTER TABLE 变更(改变)数据库表
DROP TABLE 删除表

# 增删改查

INSERT INTO 向数据库中插入新数据
DELETE 从数据库中删除数据
UPDATE 更新数据库中的数据
SELECT 从数据库中提取数据

# 增加

INSERT INTO 语句用于向表中插入新记录,有两种编写形式:

INSERT INTO 表名
VALUES (数据1,数据2,数据3,...);
1
2
INSERT INTO 表名 (列1,列2,列3,...)
VALUES (数据1,数据2,数据3,...);
1
2

# 删除

DELETE 语句用于删除表中的行,使用时要慎重,没有撤销操作

DELETE FROM 表名
WHERE 列=数据;
1
2

# 修改

UPDATE 语句用于更新表中的记录。

UPDATE 表名
SET 列1=新数据,列2=新数据,...
WHERE 列=数据;
#例如:
UPDATE employee SET Office="青网科技园" WHERE Office="合肥";
1
2
3
4
5

# 查询

SELECT 语句用于从数据库中选取数据,结果被存储在一个结果表中,称为结果集

SELECT * FROM 表名;
1
SELECT 列1,列2
FROM 表名;
1
2
SELECT * FROM employee;
SELECT Employee_Name,Sex FROM employee WHERE Office="中科大厦";
1
2

SELECT DISTINCT 语句用于返回唯一不同的值,去重

SELECT DISTINCT 列1,列2
FROM 表名;
1
2

# 其他语句

# WHERE

WHERE 子句用来指定满足条件的记录,省略所有的记录都会受影响

  • 文本需要使用引号包括
  • 可以使用运算符、函数
  • 运算符 | = | 等于 | | --- | --- | | <> | 不等于(!=) | | > | 大于 | | < | 小于 | | >= | 大于等于 | | <= | 小于等于 | | BETWEEN | 在某个范围内 | | LIKE | 搜索某种模式 | | IN | 指定针对某个列的多个可能值 | | AND | 两个条件都得满足 | | OR | 满足其中一个就行 |

# IS (NOT) NULL

是(否)为空值,=&<>、!=不能用来判断NULL

SELECT 列
FROM 表名
WHERE 列 IS (NOT) NULL;
1
2
3

# BETWEEN AND

使用BETWEEN m AND n指定所需范围的开始值和结束值,进行范围限定,m<n

  • IN & OR IN操作符后接()里面的每个条件进行匹配,如果只有两个条件可用 OR 代替
SELECT 列
FROM 表名
WHERE 列 IN (a,b,c);
1
2
3

# NOT

否操作符,跟上述两个操作一起使用,对条件取反

  • LIKE 操作符

  • %表示任意多个字符,包括没有字符(无法匹配NULL的)

  • _表示任意单个字符

  • 可以使用\进行转义

  • 正则表达式 正则表达式中转译使用 \

SELECT 列
FROM 表名
WHERE 列 REGEXP 'regexp';
1
2
3

# ORDER BY

SELECT 列1,列2
FROM 表名
ORDER BY 列1,列2 ASC|DESC;
1
2
3

# LIMIT

限制运行结果

SELECT DISTINCT 列1,列2
FROM 表名
LIMIT 数字;
1
2
3

# 复杂查询

所谓复杂查询其实就是子查询,因为查询中嵌套着查询(无限套娃),导致查询复杂度被无限放大。

# 排序

ORDER BY 子句用来设定按哪个字段哪种方式进行排序,再返回搜索结果

;默认 ASC(A升序)DESC(降序)
SELECT * FROM info ORDER BY balance [ASC];
SELECT * FROM info ORDER BY balance DESC;
1
2
3

多字段排序

SELECT * FROM info ORDER BY balance [ASC],ORDER BY age DESC;
1

# 分组

GROUP BY 语句根据一个或多个列对结果集进行分组 WITH ROLLUP 可以实现在分组统计数据基础上再进行相同的统计(SUM,AVG,COUNT…)

# 联查

UNION 操作符用于连接两个以上的 SELECT 语句的结果组合到一个结果集合中 UNION ALL:返回所有结果集,包含重复数据 UNION DISTINCT:删除结果集中重复的数据(默认)

# 连表

INNER JOIN(内连接或等值连接):获取两个表中字段匹配关系的记录

LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录

RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录

# 实例

# 分组联查

需求:列出薪资高于部门号为 30 下的所有员工的姓名、薪资、部门名称

SELECT e.ename , e.sal , d.dname
FROM emp e JOIN dept d ON e.deptno = d.depno
WHERE e.sal > ALL(SELECT sal FROM emp WHERE dempno = 30);
1
2
3

需求:列出公司各等级雇员的数量和平均工资

SELECT s.grade , COUNT(e.empno) , AVG(e.sal)
FROM emp e JOIN salgrade s ON  e.sal BETWEEN s.losal AND s.hisal
GROUP BY s.grade;
1
2
3

需求:列出与张三(排除)从事相同工作的所有员工及部门名称,部门人数

  • 列出与张三(排除)从事相同工作的所有员工及部门名称
SELECT e.* , d.dname
FROM emp e JOIN dept d ON e.deptno = d.depno
WHERE e.job = (SELECT job FROM emp WHERE ename = '张三')
AND e.ename != '张三';
1
2
3
4
  • 统计部门人数
SELECT deptno , COUNT(1) dc
FROM emp
GROUP BY deptno
1
2
3
  • 三表联查,完成
SELECT e.* , d.dname
FROM emp e JOIN dept d ON e.deptno = d.depno
JOIN (SELECT deptno , COUNT(1) dc FROM emp GROUP BY deptno) n ON e.deptno = n.depno
WHERE e.job = (SELECT job FROM emp WHERE ename = '张三')
AND e.ename != '张三';
1
2
3
4
5
网页编辑 (opens new window)
最近提交: 2023/03/22, 11:52:35
MySQL 位运算函数
Redis 安装部署 & 项目实践

← MySQL 位运算函数 Redis 安装部署 & 项目实践→

Theme by Vdoing | Copyright © 2011-2023 | 君玉自牧
粤ICP备15057965号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式