777 Interview Notes
  • 🎯ᐕ)୨ 戳我戳我
  • 社招
    • 叨叨
  • 外企
    • 上海外企汇总
  • 数据结构与算法
    • 简介
    • 题型
      • Template
      • 动态规划
        • LEETCODE 5. 最长回文子串
        • LEETCODE 32. 最长有效括号
        • LEETCODE 44. 通配符匹配
        • LEETCODE 62. 不同路径
        • LEETCODE 63. 不同路径 II
        • LEETCODE 64. 最小路径和
        • LEETCODE 97. 交错字符串
        • LEETCODE 120. 三角形最小路径和
        • LEETCODE 122. 买卖股票的最佳时机 II
        • LEETCODE 139. 单词拆分
        • LEETCODE 174. 地下城游戏
        • LEETCODE 188. 买卖股票的最佳时机 IV
        • *LEETCODE 222. 完全二叉树的节点个数
        • LEETCODE 309. 最佳买卖股票时机含冷冻期
        • LEETCODE 343. 整数拆分
        • LEETCODE 494. 目标和
        • LEETCODE 718. 最长重复子数组
        • LEETCODE 837. 新21点
        • LEETCODE 1014. 最佳观光组合
        • LCOF 10-II. 青蛙跳台阶问题
        • LCOF 14-I. 剪绳子
        • LCOF 19. 正则表达式匹配
        • LCOF 42. 连续子数组的最大和
        • LCOF 46. 把数字翻译成字符串
        • LCOF 47. 礼物的最大价值
        • LCOF 48. 最长不含重复字符的子字符串
        • LCOF 49. 丑数
        • LCOF 63. 股票的最大利润
      • 贪心
        • LEETCODE 12. 整数转罗马数字
        • LEETCODE 122. 买卖股票的最佳时机 II
        • *LEETCODE 316. 去除重复字母
        • LEETCODE 435. 无重叠区间
        • LEETCODE 455. 分发饼干
        • LEETCODE 605. 种花问题
        • LEETCODE 860. 柠檬水找零
        • LEETCODE 1046. 最后一块石头的重量
        • LCOF 14-I. 剪绳子
        • LCOF 14-II. 剪绳子 II
      • 双指针
        • LEETCODE 4. 寻找两个正序数组的中位数
        • LEETCODE 19. 删除链表的倒数第N个节点
        • LEETCODE 75. 颜色分类
        • LEETCODE 86. 分隔链表
        • LCOF 04. 二维数组中的查找
        • LCOF 21. 调整数组顺序使奇数位于偶数前面
        • LCOF 24. 反转链表
        • LCOF 52. 两个链表的第一个公共节点
        • LCOF 57. 和为s的两个数字
        • LCOF 58 - I. 翻转单词顺序
      • 滑动窗口
        • LEETCODE 239. 滑动窗口最大值
        • LEETCODE 424. 替换后的最长重复字符
        • LEETCODE 643. 子数组最大平均数 I
        • LEETCODE 1208. 尽可能使字符串相等
        • LEETCODE 1423. 可获得的最大点数
        • LCOF 59 - I. 滑动窗口的最大值
      • 深度优先搜索
        • LEETCODE 207. 课程表
        • *LEETCODE 210. 课程表 II
        • LEETCODE 329. 矩阵中的最长递增路径
        • LEETCODE 547. 省份数量
        • LEETCODE 785. 判断二分图
        • LCOF 12. 矩阵中的路径
        • LCOF 13. 机器人的运动范围
        • LCOF 34. 二叉树中和为某一值的路径
        • LCOF 38. 字符串的排列
        • LCOF 54. 二叉搜索树的第k大节点
        • LCOF 55 - I. 二叉树的深度
        • LCOF 55 - II. 平衡二叉树
        • LCOF 68 - II. 二叉树的最近公共祖先
      • 广度优先搜索
        • LEETCODE 547. 省份数量
        • LCOF 32 - I. 从上到下打印二叉树
        • LCOF 32 - II. 从上到下打印二叉树 II
        • LCOF 32 - III. 从上到下打印二叉树 III
        • LCOF 55 - I. 二叉树的深度
      • 前缀和
        • LEETCODE 560. 和为K的子数组
      • 背包问题
        • LEETCODE 494. 目标和
      • HashMap
        • LEETCODE 128. 最长连续序列
        • LEETCODE 242. 有效的字母异位词
        • LEETCODE 350. 两个数组的交集 II
        • LEETCODE 560. 和为K的子数组
        • LCOF 03. 数组中重复的数字
        • LCOF 35. 复杂链表的复制
        • LCOF 50. 第一个只出现一次的字符
      • HashSet
        • LEETCODE 888. 公平的糖果棒交换
        • LCOF 61. 扑克牌中的顺子
      • 数组
        • LEETCODE 31. 下一个排列
        • LEETCODE 75. 颜色分类
        • LEETCODE 189. 旋转数组
        • LEETCODE 228. 汇总区间
        • LEETCODE 442. 数组中重复的数据
        • LEETCODE 448. 找到所有数组中消失的数字
        • LEETCODE 560. 和为K的子数组
      • 模拟
        • LEETCODE 860. 柠檬水找零
        • LCOF 29. 顺时针打印矩阵
        • LCOF 31. 栈的压入、弹出序列
      • 排序
        • LCOF 45. 把数组排成最小的数
        • LCOF 51. 数组中的逆序对
      • 递归
        • LCOF 06. 从尾到头打印链表
        • LCOF 07. 重建二叉树
        • LCOF 10-I. 斐波那契数列
        • LCOF 16. 数值的整数次方
        • LCOF 24. 反转链表
        • LCOF 25. 合并两个排序的链表
        • LCOF 26. 树的子结构
        • LCOF 27. 二叉树的镜像
        • LCOF 28. 对称的二叉树
        • LCOF 64. 求1+2+…+n
      • 队列
        • LCOF 59 - I. 滑动窗口的最大值
        • LCOF 59 - II. 队列的最大值
      • 字符串
        • LEETCODE 5. 最长回文子串
        • *LEETCODE 165. 比较版本号
        • LEETCODE 205. 同构字符串
        • LEETCODE 242. 有效的字母异位词
        • LEETCODE 678. 有效的括号字符串
        • LEETCODE 830. 较大分组的位置
        • LCOF 05. 替换空格
        • LCOF 20. 表示数值的字符串
        • LCOF 38. 字符串的排列
        • LCOF 45. 把数组排成最小的数
        • LCOF 58 - I. 翻转单词顺序
        • LCOF 58 - II. 左旋转字符串
        • LCOF 67. 把字符串转换成整数
      • 二分查找
        • LEETCODE 4. 寻找两个正序数组的中位数
        • LEETCODE 33. 搜索旋转排序数组
        • LEETCODE 34. 在排序数组中查找元素的第一个和最后一个位置
        • LEETCODE 153. 寻找旋转排序数组中的最小值
        • LEETCODE 154. 寻找旋转排序数组中的最小值 II
        • LEETCODE 278. 第一个错误的版本
        • LEETCODE 704. 二分查找
        • LEETCODE 744. 寻找比目标字母大的最小字母
        • LEETCODE 852. 山脉数组的峰顶索引
        • LCOF 11. 旋转数组的最小数字
        • LCOF 53 - I. 在排序数组中查找数字 I
        • LCOF 53 - II. 0~n-1中缺失的数字
      • 位运算
        • LEETCODE 338. 比特位计数
        • LEETCODE 461. 汉明距离
        • LCOF 15. 二进制中1的个数
        • LCOF 56 - I. 数组中数字出现的次数
        • LCOF 56 - II. 数组中数字出现的次数 II
      • 链表
        • LEETCODE 19. 删除链表的倒数第N个节点
        • LEETCODE 86. 分隔链表
        • # LEETCODE 234. 回文链表
        • LEETCODE 237. 删除链表中的节点
        • LCOF 06. 从尾到头打印链表
        • LCOF 18. 删除链表的节点
        • LCOF 22. 链表中倒数第k个节点
        • LCOF 24. 反转链表
        • LCOF 25. 合并两个排序的链表
        • LCOF 35. 复杂链表的复制
        • LCOF 36. 二叉搜索树与双向链表
        • LCOF 52. 两个链表的第一个公共节点
      • 二叉树
        • LEETCODE 94. 二叉树的中序遍历
        • LEETCODE 95. 不同的二叉搜索树 II
        • LEETCODE 96. 不同的二叉搜索树
        • # LEETCODE 98. 验证二叉搜索树
        • LEETCODE 104. 二叉树的最大深度
        • LEETCODE 108. 将有序数组转换为二叉搜索树
        • LEETCODE 112. 路径总和
        • # LEETCODE 144. 二叉树的前序遍历
        • LEETCODE 543. 二叉树的直径
        • LEETCODE 617. 合并二叉树
        • LEETCODE 958. 二叉树的完全性检验
        • LCOF 07. 重建二叉树
        • LCOF 26. 树的子结构
        • LCOF 27. 二叉树的镜像
        • LCOF 28. 对称的二叉树
        • LCOF 32 - I. 从上到下打印二叉树
        • LCOF 32 - II. 从上到下打印二叉树 II
        • LCOF 32 - III. 从上到下打印二叉树 III
        • LCOF 33. 二叉搜索树的后序遍历序列
        • LCOF 34. 二叉树中和为某一值的路径
        • LCOF 36. 二叉搜索树与双向链表
        • LCOF 37. 序列化二叉树
        • LCOF 54. 二叉搜索树的第k大节点
        • LCOF 55 - I. 二叉树的深度
        • LCOF 55 - II. 平衡二叉树
        • LCOF 68 - I. 二叉搜索树的最近公共祖先
        • LCOF 68 - II. 二叉树的最近公共祖先
      • 堆
        • LEETCODE 215. 数组中的第K个最大元素
        • LEETCODE 1046. 最后一块石头的重量
        • LCOF 40. 最小的k个数
        • LCOF 41. 数据流中的中位数
      • 栈
        • LEETCODE 32. 最长有效括号
        • LCOF 06. 从尾到头打印链表
        • LCOF 09. 用两个栈实现队列
        • LCOF 27. 二叉树的镜像
      • 大数
      • 数学
        • LEETCODE 16. 最接近的三数之和
        • LEETCODE 9. 回文数
        • LEETCODE 238. 除自身以外数组的乘积
        • LEETCODE 990. 等式方程的可满足性
        • LCOF 43. 1~n 整数中 1 出现的次数
        • LCOF 44. 数字序列中某一位的数字
        • LCOF 62. 圆圈中最后剩下的数字
        • LCOF 67. 把字符串转换成整数
      • 多线程
      • 回溯
        • LEETCODE 17. 电话号码的字母组合
        • LEETCODE 46. 全排列
        • LCOF 34. 二叉树中和为某一值的路径
        • LCOF 38. 字符串的排列
      • 设计
        • LEETCODE 146. LRU缓存机制
        • LCOF 30. 包含min函数的栈
        • LCOF 37. 序列化二叉树
        • LCOF 41. 数据流中的中位数
        • LCOF 59 - II. 队列的最大值
      • 分治
        • LCOF 16. 数值的整数次方
        • LCOF 17. 打印从1到最大的n位数
        • LCOF 33. 二叉搜索树的后序遍历序列
        • LCOF 36. 二叉搜索树与双向链表
        • LCOF 40. 最小的k个数
        • LCOF 51. 数组中的逆序对
    • 剑指Offer
      • 03. 数组中重复的数字【排序/哈希/比较交换】
      • 04. 二维数组中的查找【线性查找】
      • 05. 替换空格【字符串】
      • 06. 从尾到头打印链表【栈/递归】
      • 07. 重建二叉树【递归】
      • 09. 用两个栈实现队列【辅助栈】
      • 10-I. 斐波那契数列【DP】
      • 10-II. 青蛙跳台阶问题【DP】
      • 11. 旋转数组的最小数字【二分查找】
      • 12. 矩阵中的路径【DFS】
      • 13. 机器人的运动范围【DFS/BFS】
      • 14-I. 剪绳子【DP/贪心】
      • 14-II. 剪绳子 II【贪心】
      • 15. 二进制中1的个数【位运算】
      • 16. 数值的整数次方【分治】
      • *17. 打印从1到最大的n位数
      • 18. 删除链表的节点
      • *19. 正则表达式匹配
      • 20. 表示数值的字符串
      • 21. 调整数组顺序使奇数位于偶数前面【双指针】
      • 22. 链表中倒数第k个节点【快慢指针】
      • 24. 反转链表【递归/双指针】
      • 25. 合并两个排序的链表【递归】
      • 26. 树的子结构【递归】
      • 27. 二叉树的镜像【递归/辅助栈】
      • 28. 对称的二叉树【递归】
      • 29. 顺时针打印矩阵【模拟】
      • 30. 包含min函数的栈【辅助栈】
      • 31. 栈的压入、弹出序列【辅助栈】
      • 32 - I. 从上到下打印二叉树【BFS】
      • 32 - II. 从上到下打印二叉树 II【BFS】
      • 32 - III. 从上到下打印二叉树 III【BFS 双端队列】
      • 33. 二叉搜索树的后序遍历序列【分治 递归】
      • 34. 二叉树中和为某一值的路径【递归 回溯】
      • *35. 复杂链表的复制【哈希表】
      • 36. 二叉搜索树与双向链表【DFS】
      • 37. 序列化二叉树【BFS】
      • 38. 字符串的排列【DFS】
      • *39. 数组中出现次数超过一半的数字【哈希/摩尔投票】
      • 40. 最小的k个数【堆】
      • 41. 数据流中的中位数【堆】
      • 42. 连续子数组的最大和【DP】
      • 43. 1~n 整数中 1 出现的次数【找规律】
      • 44. 数字序列中某一位的数字【找规律】
      • 45. 把数组排成最小的数【排序】
      • 46. 把数字翻译成字符串【DP】
      • 47. 礼物的最大价值【DP】
      • 48. 最长不含重复字符的子字符串【滑动窗口】
      • 49. 丑数【DP】
      • 50. 第一个只出现一次的字符【哈希表】
      • *51. 数组中的逆序对【归并排序】
      • 52. 两个链表的第一个公共节点【双指针】
      • 53 - I. 在排序数组中查找数字 I【二分查找】
      • 53 - II. 0~n-1中缺失的数字【二分查找/位运算】
      • 54. 二叉搜索树的第k大节点【中序遍历】
      • 55 - I. 二叉树的深度【DFS/BFS】
      • 55 - II. 平衡二叉树【DFS】
      • 56 - I. 数组中数字出现的次数【位运算】
      • 56 - II. 数组中数字出现的次数 II【位运算】
      • 57. 和为s的两个数字【双指针/哈希表】
      • 57 - II. 和为s的连续正数序列【双指针】
      • 58 - I. 翻转单词顺序【双指针】
      • 58 - II. 左旋转字符串【字符串】
      • *59 - I. 滑动窗口的最大值【滑动窗口】
      • 59 - II. 队列的最大值【队列】
      • *60. n个骰子的点数【DP】
      • 61. 扑克牌中的顺子【Set/排序】
      • 62. 圆圈中最后剩下的数字【约瑟夫环】
      • 63. 股票的最大利润【DP】
      • 64. 求1+2+…+n【短路】
      • 65. 不用加减乘除做加法【位运算】
      • *66. 构建乘积数组【DP】
      • 67. 把字符串转换成整数
      • 68 - I. 二叉搜索树的最近公共祖先【迭代/递归】
      • 68 - II. 二叉树的最近公共祖先【递归】
    • 常见问题
      • 俩必须掌握的排序
      • 腾讯常见问题
      • 字节常见问题
  • 计算机网络
    • 简介
    • 基础知识
      • 综述
      • 物理层
      • 链路层
      • 网络层
      • 传输层
      • 应用层
        • HTTP
    • 常见问题
      • 常见问题带答案
  • 操作系统
    • 简介
    • 基础知识
      • 概述
      • 进程管理
      • 死锁
      • 内存管理
      • 设备管理
      • 链接
    • 常见问题
  • 数据库
    • 简介
    • 基础知识
      • SQL 语法
      • 数据库系统基础
    • 常见问题
  • Java
    • 简介
    • 基础知识
      • Java 基础
      • Java 容器
      • Java 并发
      • Java 虚拟机
      • Java I/O
    • 常见问题
  • Android
    • 简介
    • 基础知识
      • Android 基础
      • Android 进阶
      • 开源框架
      • 具体场景分析
    • 常见问题
  • 面经
    • 简介
      • 777牌面筋
    • 腾讯面经汇总
      • 实习
      • 提前批
      • 秋招
    • 阿里面经汇总
      • 杂
      • HR 面准备
    • 字节跳动面经汇总
      • 实习
        • Android
          • 字节跳动客户端一二面面经
          • 字节客户端暑期实习一面面经
          • 字节跳动客户端面试经历
          • 字节实习面筋
          • 移动客户端开发(抖音)面经
          • [21届秋招] 字节——安卓开发实习生 面经
          • 字节跳动-头条Android开发实习生面试
          • 字节 安卓一面面经
          • 字节跳动安卓客户端面经
          • 字节跳动安卓日常实习生凉经
          • 字节 客户端开发 一面
          • 字节安卓实习一面
          • 字节跳动客户端一面面经
          • 字节跳动安卓实习一二面面经
          • BAT集齐!Java/安卓暑期实习面经汇总
          • 字节跳动(Andriod方向)一二三面面经
          • 字节客户端神奇二面
          • 字节抖音(一面客户端开发)
          • 字节跳动安卓、后端实习5轮面经
          • 2020技术开发岗面经:腾讯 & 字节跳动(已Offer)
          • 字节跳动安卓客户端面经(安卓开发零经验)
          • 字节跳动Android客户端一面凉经
          • 西瓜视频一面
          • 头条三面面筋+HR(已上岸,感谢各位牛友的帮助)
          • 字节跳动android实习生一面二面
          • 字节跳动 客户端实习生 1-5面 面经
          • 2019春招实习Android面试总结(后续再发秋招总结)
          • 字节客户端安卓开发三面面经
          • 字节跳动效率工程提前批Android实习面经
          • 字节 客户端 一二面面经 下周三面
          • 【字节跳动安卓暑假实习一面】
          • 字节跳动Android实习面经
          • 字节跳动 Android客户端 一~三面(已收到offer)
          • 字节跳动暑期实习Android一二三hr面经(offer)
        • iOS
          • 字节ios懂车帝实习 三面已过
          • 字节懂车帝IOS实习一面面经
          • 字节飞书iOS客户端实习一面面经
          • 字节飞书iOS客户端二面面经[已OC]
          • 字节跳动iOS客户端实习面经
          • 字节飞书iOS客户端日常实习面经 一二面+HR面
          • 21届字节ios开发日常实习 一二三面面经(已拿offer)
          • 字节iOS客户端实习123面经
          • 字节iOS客户端实习 三次技术面面经
          • 字节跳动 iOS日常实习三面+hr面挂
          • 字节跳动ios客户端一二三四+hr面(已收到offer)
          • 字节IOS客户端实习面经
          • iOS实习面经(字节美团阿里蘑菇街)
          • 字节跳动面经|iOS开发|大三暑期实习(已收offer)
          • 字节ios[深圳]实习一面面经
          • 字节跳动飞书iOS开发一二面
          • 字节跳动ios客户端实习3+hr面经【已拿offer】
          • 字节客户端三面完成后两天接到hr电话 ,许愿offer
          • 字节跳动iOS客户端日常实习一、二、三面凉经
          • 21届大三抖音ios 一面 二面 三面 面经(挂hr……)
          • 字节跳动iOS客户端实习生面经
          • 抖音iOS 暑期实习 过经(问了安卓)
          • 字节跳动 IOS开发实习 面经 (内附投递经验与总结!)
          • 字节三面问题整理
      • 提前批
        • 字节跳动的校招面试精髓(提前批免笔试)
        • 字节提前批移动端面经(1-3面)已拿意向书
        • 字节跳动客户端开发两次一轮游(21 届秋招)
        • 字节提前批。客户端开发一面二面
        • 字节提前批 安卓客户端加面 四面
        • 字节跳动 客户端开发提前批一面凉经
        • 字节跳动提前批安卓客户端 一二三四+HR面(已意向书)
        • 字节跳动提前批客户端至二面(凉透经)
        • 字节提前批-客户端Android一面面经
        • 字节提前批客户端一二三面面经(已凉)
        • 字节跳动抖音Android客户端一二三面面经
        • 字节客户端开发面经
      • 秋招
        • 2020年字节跳动秋招面经(抖音全栈已oc)
        • 字节客户端 一、二面面经,许愿三面~
        • 字节客户端三~四面面经,已oc(更新:已邮件)
        • 字节客户端几乎无安卓基础三面面经
        • 字节客户端抖音一二三面凉经
        • 上海抖音客户端开发面经
        • 字节跳动安卓工程师一面凉
        • 字节跳动客户端一面二面凉经
        • 字节视频架构一面凉经(安卓)
        • 字节客户端一二三面面经,已收到意向书
        • 字节客户端三面面经分享,求一个意向书(已收到意向书)
        • 字节教育客户端一二面,求个offer
        • 字节跳动客户端开发一面+二面
        • pyer零基础字节跳动客户端面试
        • 字节上海抖音客户端
        • 字节跳动客户端开发0基础 一面凉经
  • 杂
    • Git
    • 智力题
    • 设计模式
      • 单例模式
      • MVC MVP MVVM
    • 简历
  • JAVASCRIPT
    • 简介
    • 基础知识
    • 常见问题
由 GitBook 提供支持
在本页
  • 一、基础
  • 模式
  • SQL 语句
  • 二、创建表 CREATE
  • 三、修改表 ALTER/DROP
  • 四、插入 INSERT
  • 五、更新 UPDATE
  • 六、删除 DELETE
  • 七、查询 SELECT
  • DISTINCT
  • LIMIT
  • 八、排序 ASC/DESC
  • 九、过滤 WHERE
  • 十、通配符 LIKE
  • 十一、计算字段
  • 十二、函数
  • 汇总
  • 文本处理
  • 日期和时间处理
  • 数值处理
  • 十三、分组 GROUP BY
  • 十四、子查询
  • 十五、连接 JOIN
  • 内连接 INNER JOIN
  • 自连接
  • 自然连接 NATURAL JOIN
  • 外连接 OUTER JOIN
  • 十六、组合查询 UNION
  • 十七、视图 VIEW
  • 十八、存储过程
  • 十九、游标
  • 二十、触发器 TRIGGER
  • 二十一、事务管理
  • 二十二、字符集
  • 二十三、权限管理

这有帮助吗?

  1. 数据库
  2. 基础知识

SQL 语法

上一页基础知识下一页数据库系统基础

最后更新于4年前

这有帮助吗?

一、基础

模式

模式定义了数据如何存储、存储什么样的数据以及数据如何分解等信息,数据库和表都有模式。

数据模型(组织层数据模型)描述数据的组织形式。模式是用给定的数据模型对具体数据的描述(就像用某一种编程语言编写具体应用程序一样)。

模式是数据库中全体数据的逻辑结构和特征的描述,它仅仅涉及“型”的描述,不涉及具体的值。

关系模式是关系的“型”或元组的结构共性的描述,它实际上对应的是关系表的表头。模式的一个具体值称为模式的一个实例。一个模式可以有多个实例。模式是相对稳定的(结构不会经常变动),而实例是相对变动的(具体的数据值可以经常变化)。

数据模式描述一类事物的结构、属性、类型和约束,实质上是用数据模型对一类事物进行模拟,而实例是反映某类事物在某一时刻的当前状态。虽然实际的数据库管理系统产品种类很多,支持的数据模型和数据库语言也不尽相同,数据的存储结构也各不相同,但它们在体系结构上通常都具有相同的特征,即采用三级模式结构,并提供两级映像功能。

数据库的三级模式结构是指数据库的外模式、模式和内模式。

SQL 语句

SQL(Structured Query Language),标准 SQL 由 ANSI 标准委员会管理,从而称为 ANSI SQL。各个 DBMS(Database Management System) 都有自己的实现,如 PL/SQL、Transact-SQL 等。

SQL 语句不区分大小写,但是数据库表名、列名和值是否区分依赖于具体的 DBMS 以及配置。

主键的值不允许修改,也不允许复用(不能将已经删除的主键值赋给新数据行的主键)。

SQL 支持以下三种注释:

# 注释
SELECT *
FROM mytable; -- 注释
/* 注释
   注释 */

数据库创建与使用:

CREATE DATABASE test;
USE test;

二、创建表 CREATE

CREATE TABLE mytable (
  # int 类型,不为空,自增
  id INT NOT NULL AUTO_INCREMENT,
  # int 类型,不可为空,默认值为 1,不为空
  col1 INT NOT NULL DEFAULT 1,
  # 变长字符串类型,最长为 45 个字符,可以为空
  col2 VARCHAR(45) NULL,
  # 日期类型,可为空
  col3 DATE NULL,
  # 设置主键为 id
  PRIMARY KEY (`id`));

三、修改表 ALTER/DROP

添加列

ALTER TABLE mytable
ADD col CHAR(20);

删除列

ALTER TABLE mytable
DROP COLUMN col;

删除表

DROP TABLE mytable;

四、插入 INSERT

普通插入

INSERT INTO mytable(col1, col2)
VALUES(val1, val2);

插入检索出来的数据

INSERT INTO mytable1(col1, col2)
SELECT col1, col2
FROM mytable2;

将一个表的内容插入到一个新表

CREATE TABLE newtable AS
SELECT * FROM mytable;

五、更新 UPDATE

UPDATE mytable
SET col = val
WHERE id = 1;

六、删除 DELETE

DELETE FROM mytable
WHERE id = 1;

TRUNCATE TABLE 可以清空表,也就是删除所有行。

TRUNCATE TABLE mytable;

使用更新和删除操作时一定要用 WHERE 子句,不然会把整张表的数据都破坏。可以先用 SELECT 语句进行测试,防止错误删除。

七、查询 SELECT

DISTINCT

相同值只会出现一次。它作用于所有列,也就是说所有列的值都相同才算相同。

SELECT DISTINCT col1, col2
FROM mytable;

LIMIT

限制返回的行数。可以有两个参数,第一个参数为起始行,从 0 开始;第二个参数为返回的总行数。

返回前 5 行:

SELECT *
FROM mytable
LIMIT 5;
SELECT *
FROM mytable
LIMIT 0, 5;

返回第 3 ~ 5 行:

SELECT *
FROM mytable
LIMIT 2, 3;

八、排序 ASC/DESC

  • ASC :升序(默认)

  • DESC :降序

可以按多个列进行排序,并且为每个列指定不同的排序方式:

SELECT *
FROM mytable
ORDER BY col1 DESC, col2 ASC;

九、过滤 WHERE

不进行过滤的数据非常大,导致通过网络传输了多余的数据,从而浪费了网络带宽。因此尽量使用 SQL 语句来过滤不必要的数据,而不是传输所有的数据到客户端中然后由客户端进行过滤。

SELECT *
FROM mytable
WHERE col IS NULL;

下表显示了 WHERE 子句可用的操作符

操作符

说明

=

等于

<

小于

>

大于

<> !=

不等于

<= !>

小于等于

>= !<

大于等于

BETWEEN

在两个值之间

IS NULL

为 NULL 值

应该注意到,NULL 与 0、空字符串都不同。

AND 和 OR 用于连接多个过滤条件。优先处理 AND,当一个过滤表达式涉及到多个 AND 和 OR 时,可以使用 () 来决定优先级,使得优先级关系更清晰。

IN 操作符用于匹配一组值,其后也可以接一个 SELECT 子句,从而匹配子查询得到的一组值。

NOT 操作符用于否定一个条件。

十、通配符 LIKE

通配符也是用在过滤语句中,但它只能用于文本字段。

  • % 匹配 >=0 个任意字符;

  • _ 匹配 ==1 个任意字符;

  • [ ] 可以匹配集合内的字符,例如 [ab] 将匹配字符 a 或者 b。用脱字符 ^ 可以对其进行否定,也就是不匹配集合内的字符。

使用 Like 来进行通配符匹配。

SELECT *
FROM mytable
WHERE col LIKE '[^AB]%'; -- 不以 A 和 B 开头的任意文本

不要滥用通配符,通配符位于开头处匹配会非常慢。

十一、计算字段

在数据库服务器上完成数据的转换和格式化的工作往往比客户端上快得多,并且转换和格式化后的数据量更少的话可以减少网络通信量。

计算字段通常需要使用 AS 来取别名,否则输出的时候字段名为计算表达式。

SELECT col1 * col2 AS alias
FROM mytable;

CONCAT() 用于连接两个字段。许多数据库会使用空格把一个值填充为列宽,因此连接的结果会出现一些不必要的空格,使用 TRIM() 可以去除首尾空格。

SELECT CONCAT(TRIM(col1), '(', TRIM(col2), ')') AS concat_col
FROM mytable;

十二、函数

各个 DBMS 的函数都是不相同的,因此不可移植,以下主要是 MySQL 的函数。

汇总

函 数

说 明

AVG()

返回某列的平均值

COUNT()

返回某列的行数

MAX()

返回某列的最大值

MIN()

返回某列的最小值

SUM()

返回某列值之和

AVG() 会忽略 NULL 行。

使用 DISTINCT 可以汇总不同的值。

SELECT AVG(DISTINCT col1) AS avg_col
FROM mytable;

文本处理

函数

说明

LEFT()

左边的字符

RIGHT()

右边的字符

LOWER()

转换为小写字符

UPPER()

转换为大写字符

LTRIM()

去除左边的空格

RTRIM()

去除右边的空格

LENGTH()

长度

SOUNDEX()

转换为语音值

其中, SOUNDEX() 可以将一个字符串转换为描述其语音表示的字母数字模式。

SELECT *
FROM mytable
WHERE SOUNDEX(col1) = SOUNDEX('apple')

日期和时间处理

  • 日期格式:YYYY-MM-DD

  • 时间格式:HH:MM:SS

函 数

说 明

ADDDATE()

增加一个日期(天、周等)

ADDTIME()

增加一个时间(时、分等)

CURDATE()

返回当前日期

CURTIME()

返回当前时间

DATE()

返回日期时间的日期部分

DATEDIFF()

计算两个日期之差

DATE_ADD()

高度灵活的日期运算函数

DATE_FORMAT()

返回一个格式化的日期或时间串

DAY()

返回一个日期的天数部分

DAYOFWEEK()

对于一个日期,返回对应的星期几

HOUR()

返回一个时间的小时部分

MINUTE()

返回一个时间的分钟部分

MONTH()

返回一个日期的月份部分

NOW()

返回当前日期和时间

SECOND()

返回一个时间的秒部分

TIME()

返回一个日期时间的时间部分

YEAR()

返回一个日期的年份部分

mysql> SELECT NOW();
2018-4-14 20:25:11

数值处理

函数

说明

SIN()

正弦

COS()

余弦

TAN()

正切

ABS()

绝对值

SQRT()

平方根

MOD()

余数

EXP()

指数

PI()

圆周率

RAND()

随机数

十三、分组 GROUP BY

把具有相同的数据值的行放在同一组中。

可以对同一分组数据使用汇总函数进行处理,例如求分组数据的平均值等。

指定的分组字段除了能按该字段进行分组,也会自动按该字段进行排序。

SELECT col, COUNT(*) AS num
FROM mytable
GROUP BY col;

GROUP BY 自动按分组字段进行排序,ORDER BY 也可以按汇总字段来进行排序。

SELECT col, COUNT(*) AS num
FROM mytable
GROUP BY col
ORDER BY num;

WHERE 过滤行,HAVING 过滤分组,行过滤应当先于分组过滤。

SELECT col, COUNT(*) AS num
FROM mytable
WHERE col > 2
GROUP BY col
HAVING num >= 2;

分组规定:

  • GROUP BY 子句出现在 WHERE 子句之后,ORDER BY 子句之前;

  • 除了汇总字段外,SELECT 语句中的每一字段都必须在 GROUP BY 子句中给出;

  • NULL 的行会单独分为一组;

  • 大多数 SQL 实现不支持 GROUP BY 列具有可变长度的数据类型。

十四、子查询

子查询中只能返回一个字段的数据。

可以将子查询的结果作为 WHRER 语句的过滤条件:

SELECT *
FROM mytable1
WHERE col1 IN (SELECT col2
               FROM mytable2);

下面的语句可以检索出客户的订单数量,子查询语句会对第一个查询检索出的每个客户执行一次:

SELECT cust_name, (SELECT COUNT(*)
                   FROM Orders
                   WHERE Orders.cust_id = Customers.cust_id)
                   AS orders_num
FROM Customers
ORDER BY cust_name;

十五、连接 JOIN

连接用于连接多个表,使用 JOIN 关键字,并且条件语句使用 ON 而不是 WHERE。

连接可以替换子查询,并且比子查询的效率一般会更快。

可以用 AS 给列名、计算字段和表名取别名,给表名取别名是为了简化 SQL 语句以及连接相同表。

内连接 INNER JOIN

内连接又称等值连接,使用 INNER JOIN 关键字。

SELECT A.value, B.value
FROM tablea AS A INNER JOIN tableb AS B
ON A.key = B.key;

可以不明确使用 INNER JOIN,而使用普通查询并在 WHERE 中将两个表中要连接的列用等值方法连接起来。

SELECT A.value, B.value
FROM tablea AS A, tableb AS B
WHERE A.key = B.key;

自连接

自连接可以看成内连接的一种,只是连接的表是自身而已。

一张员工表,包含员工姓名和员工所属部门,要找出与 Jim 处在同一部门的所有员工姓名。

子查询版本

SELECT name
FROM employee
WHERE department = (
      SELECT department
      FROM employee
      WHERE name = "Jim");

自连接版本

SELECT e1.name
FROM employee AS e1 INNER JOIN employee AS e2
ON e1.department = e2.department
      AND e2.name = "Jim";

自然连接 NATURAL JOIN

自然连接是把同名列通过等值测试连接起来的,同名列可以有多个。

内连接和自然连接的区别:内连接提供连接的列,而自然连接自动连接所有同名列。

SELECT A.value, B.value
FROM tablea AS A NATURAL JOIN tableb AS B;

外连接 OUTER JOIN

如果希望不满足连接条件的元组也出现在连接结果中,则可以通过外连接(OUTER JOIN)操作实现。外连接有三种形式:左外连接(LEFT OUTER JOIN)、右外连接(RIGHT OUTER JOIN)和全外连接(FULL OUTER JOIN)。

左外连接的含义是把连接符号左边的关系(这里是关系R)中不满足连接条件的元组也保留到连接后的结果中,并在连接结果中将该元组对应的右边关系(这里是关系S)的各个属性均置成空值(NULL)。

右外连接的含义是把连接符号右边的关系(这里是关系S)中不满足连接条件的元组也保留到连接后的结果中,并在连接结果中将该元组对应的左边关系(这里是R)的各个属性均置成空值(NULL)。

全外连接的含义是把连接符号两边的关系(R和S)中不满足连接条件的元组均保留到连接后的结果中,并在连接结果中将不满足连接条件的各元组的相关属性均置成空值(NULL)。

外连接保留了没有关联的那些行。分为左外连接,右外连接以及全外连接。

左外连接会保留左表没有关联的行,右外连接会保留右表没有关联的行,全外连接会保留左右表没有关联的行。

检索所有顾客的订单信息,包括还没有订单信息的顾客。

SELECT Customers.cust_id, Customer.cust_name, Orders.order_id
FROM Customers LEFT OUTER JOIN Orders
ON Customers.cust_id = Orders.cust_id;

customers 表:

cust_id

cust_name

1

a

2

b

3

c

orders 表:

order_id

cust_id

1

1

2

1

3

3

4

3

结果:

cust_id

cust_name

order_id

1

a

1

1

a

2

3

c

3

3

c

4

2

b

Null

十六、组合查询 UNION

使用 UNION 来组合两个查询,如果第一个查询返回 M 行,第二个查询返回 N 行,那么组合查询的结果一般为 M+N 行。

每个查询必须包含相同的列、表达式和聚集函数。

默认会去除相同行,如果需要保留相同行,使用 UNION ALL。

只能包含一个 ORDER BY 子句,并且必须位于语句的最后。

SELECT col
FROM mytable
WHERE col = 1
UNION
SELECT col
FROM mytable
WHERE col =2;

十七、视图 VIEW

视图是虚拟的表,本身不包含数据,也就不能对其进行索引操作。

对视图的操作和对普通表的操作一样。

视图具有如下好处:

  • 简化复杂的 SQL 操作,比如复杂的连接;

  • 只使用实际表的一部分数据;

  • 通过只给用户访问视图的权限,保证数据的安全性;

  • 更改数据格式和表示。

CREATE VIEW myview AS
SELECT Concat(col1, col2) AS concat_col, col3*col4 AS compute_col
FROM mytable
WHERE col5 = val;

十八、存储过程

存储过程可以看成是对一系列 SQL 操作的批处理。

使用存储过程的好处:

  • 代码封装,保证了一定的安全性;

  • 代码复用;

  • 由于是预先编译,因此具有很高的性能。

命令行中创建存储过程需要自定义分隔符,因为命令行是以 ; 为结束符,而存储过程中也包含了分号,因此会错误把这部分分号当成是结束符,造成语法错误。

包含 in、out 和 inout 三种参数。

给变量赋值都需要用 select into 语句。

每次只能给一个变量赋值,不支持集合的操作。

delimiter //

create procedure myprocedure( out ret int )
    begin
        declare y int;
        select sum(col1)
        from mytable
        into y;
        select y*y into ret;
    end //

delimiter ;
call myprocedure(@ret);
select @ret;

十九、游标

在存储过程中使用游标可以对一个结果集进行移动遍历。

游标主要用于交互式应用,其中用户需要对数据集中的任意行进行浏览和修改。

使用游标的四个步骤:

  1. 声明游标,这个过程没有实际检索出数据;

  2. 打开游标;

  3. 取出数据;

  4. 关闭游标;

delimiter //
create procedure myprocedure(out ret int)
    begin
        declare done boolean default 0;

        declare mycursor cursor for
        select col1 from mytable;
        # 定义了一个 continue handler,当 sqlstate '02000' 这个条件出现时,会执行 set done = 1
        declare continue handler for sqlstate '02000' set done = 1;

        open mycursor;

        repeat
            fetch mycursor into ret;
            select ret;
        until done end repeat;

        close mycursor;
    end //
 delimiter ;

二十、触发器 TRIGGER

触发器会在某个表执行以下语句时而自动执行:DELETE、INSERT、UPDATE。

触发器必须指定在语句执行之前还是之后自动执行,之前执行使用 BEFORE 关键字,之后执行使用 AFTER 关键字。BEFORE 用于数据验证和净化,AFTER 用于审计跟踪,将修改记录到另外一张表中。

INSERT 触发器包含一个名为 NEW 的虚拟表。

CREATE TRIGGER mytrigger AFTER INSERT ON mytable
FOR EACH ROW SELECT NEW.col into @result;

SELECT @result; -- 获取结果

DELETE 触发器包含一个名为 OLD 的虚拟表,并且是只读的。

UPDATE 触发器包含一个名为 NEW 和一个名为 OLD 的虚拟表,其中 NEW 是可以被修改的,而 OLD 是只读的。

MySQL 不允许在触发器中使用 CALL 语句,也就是不能调用存储过程。

二十一、事务管理

基本术语:

  • 事务(transaction)指一组 SQL 语句;

  • 回退(rollback)指撤销指定 SQL 语句的过程;

  • 提交(commit)指将未存储的 SQL 语句结果写入数据库表;

  • 保留点(savepoint)指事务处理中设置的临时占位符(placeholder),你可以对它发布回退(与回退整个事务处理不同)。

不能回退 SELECT 语句,回退 SELECT 语句也没意义;也不能回退 CREATE 和 DROP 语句。

MySQL 的事务提交默认是隐式提交,每执行一条语句就把这条语句当成一个事务然后进行提交。当出现 START TRANSACTION 语句时,会关闭隐式提交;当 COMMIT 或 ROLLBACK 语句执行后,事务会自动关闭,重新恢复隐式提交。

设置 autocommit 为 0 可以取消自动提交;autocommit 标记是针对每个连接而不是针对服务器的。

如果没有设置保留点,ROLLBACK 会回退到 START TRANSACTION 语句处;如果设置了保留点,并且在 ROLLBACK 中指定该保留点,则会回退到该保留点。

START TRANSACTION
// ...
SAVEPOINT delete1
// ...
ROLLBACK TO delete1
// ...
COMMIT

二十二、字符集

基本术语:

  • 字符集为字母和符号的集合;

  • 编码为某个字符集成员的内部表示;

  • 校对字符指定如何比较,主要用于排序和分组。

除了给表指定字符集和校对外,也可以给列指定:

CREATE TABLE mytable
(col VARCHAR(10) CHARACTER SET latin COLLATE latin1_general_ci )
DEFAULT CHARACTER SET hebrew COLLATE hebrew_general_ci;

可以在排序、分组时指定校对:

SELECT *
FROM mytable
ORDER BY col COLLATE latin1_general_ci;

二十三、权限管理

MySQL 的账户信息保存在 mysql 这个数据库中。

USE mysql;
SELECT user FROM user;

创建账户 CREATE

新创建的账户没有任何权限。

CREATE USER myuser IDENTIFIED BY 'mypassword';

修改账户名 RENAME

RENAME USER myuser TO newuser;

删除账户 DROP

DROP USER myuser;

查看权限 SHOW

SHOW GRANTS FOR myuser;

授予权限 GRANT

账户用 username@host 的形式定义,username@% 使用的是默认主机名。

GRANT SELECT, INSERT ON mydatabase.* TO myuser;

删除权限 REVOKE

GRANT 和 REVOKE 可在几个层次上控制访问权限:

  • 整个服务器,使用 GRANT ALL 和 REVOKE ALL;

  • 整个数据库,使用 ON database.*;

  • 特定的表,使用 ON database.table;

  • 特定的列;

  • 特定的存储过程。

REVOKE SELECT, INSERT ON mydatabase.* FROM myuser;

更改密码 SET

必须使用 Password() 函数进行加密。

SET PASSWROD FOR myuser = Password('new_password');