SQL基础随记1 SQL分类 常用函数 ALL ANY EXISTS IN 约束
SQL基础随记1 SQL分类 常用函数 ALL ANY EXISTS IN 约束
其实这里知识不难,只是好久不接触突然被问的话有时还真的一时答不上,自己写一遍胜过盲扫。当然,也有些常读常新的地方会记录下来。
对SQL语言进行划分
DDL --- Data Definition Language --- 定义 --- 增删改数据库和表的结构
DML --- Data Manipulation Language --- 操作 --- 对记录增删改
DQL --- Data Quary Language --- 查询 --- 对记录进行查询
DCL --- Data Control Language --- 控制 --- 访问权限和安全规则
要是要突然问的话有时还真的一时回答不上,记住单词胜过记缩写
DBMS的分类
- 关系型
- 行存储 --- MySQL
- NosQL
- 键值型 --- Redis
- 文档型 --- MongoDB
- 搜索引擎 --- Elasticsearch
- 列存储(列族数据库)
- 图形数据库
列存储数据库说是“可以降低系统的I/O,但功能相对有限”,不过我看到了一段有意思的话觉得很有道理

列存储常见于分布式文件系统,如Hbase
图(这种数据结构)存储了实体(对象)之间的关系。以最典型的人与人社交关系为例,其数据模型主要是以节点和边来实现。特点在于可以有效解决复杂的关系问题。
DDL
创建表时可以在
create table tableName (...)后面追加参数,可以追加的有engine = InnoDB
CHARACTER SET = utf8 COLLATE = utf8_general_ci
其中
CHARACTER SET是指定字符编码,COLLATE是指定排序规则。且utf8_general_ci是对大小写不敏感,对大小写敏感是utf8_bin在定义varchar()类型字段的时候也可以后缀
CHARACTER SET = xxx COLLATE = yyy
在创建索引的时候我们可以选择不同类型的索引(UNIQUE INDEX --- 唯一索引 或 NORMAL INDEX --- 普通索引)以及不同的索引方式(BTREE 或 HASH),如
CREATE TABLE XXX(
...
UNNIQUE INDEX indexName (字段名) USING BTREE
...
)
索引分为单列索引和组合索引,组合即一个索引可以包含多个列
约束
- 主键,可以是一个字段也可以是多个字段
- 外键
- UNIQUE (唯一性)约束,
- NOT NULL 约束
- DEFAULT 约束,在插入记录时如果该字段为空,那么就会设置为默认值。(而不是“不变量”的意思,它仍然可变)
- CHECK 约束 (MySQL8.0.16后版本支持)
理论上设计数据表的“三少一多”原则
表个数少
表中字段少
联合主键字段少
主键和外键多
表的设计核心就是简单可复用,主键是一张表的代表,因此主键外键越多,说明表之间的利用率最高。
但这个原则不是绝对的,因为有时我们需要牺牲数据的冗余度来换取处理数据的效率,毕竟join总是会造成复杂。
另外在大型项目中,大量的更新以及高并发的情况下,外键会造成额外的开销,也容易造成死锁。因此在业务量较大时,可以采用在业务层实现,取消外键来提高效率。因此在实际生产中为了方便维护基本不使用外键。
另外也不推荐使用自增长主键,不利于维护。例如银行一般使用
唯一表示字段uuid+日期+渠道流水(unique index)来保证数据唯一性。修改字段类型不要忘记
COLUMNALTER TABLE tableName MODIFY COLUMN newName type;
修改字段名
ALTER TABLE tableName CHANGE oldName newName type;
修改大表字段需要谨慎 容易引发表结构写锁。(0623)
DQL随记
发现一个有趣的新用法 --- 在查询时插入临时列
使用单引号可以将单引号中内容作为定值,然后在查询中临时加入该列(临时意味着并不改变表的结构,仅在返回时临时插入)

Order by 后有多个列时,会先按照第一个列进行排序,如果第一列的值相同,则会根据第二列进行排序,以此类推。
select 语句的关键词顺序(很基础的还是默一遍吧)
SELECT...(DISTINCT)...FROM...WHERE...GROUP BY...HAVING...ORDER BY...LIMIT
select 语句执行顺序 (0624)
先找表再分组再排序;分组前WHERE分组后HAVING;排序前SELECT+DISTINCT,排序后LIMIT
FROM
WHERE
GROUP BY
HAVING
SELECT+DISTINCT
ORDER BY
LIMIT
BETWEEN AND 的边界值
对于数值,包含左右边界
对于data类型,查询时不带分秒,包含左右边界
对于datatime类型,查询时不带分秒,只包含左边界。
因为只查询yyyy-MM-DD时,默认将时分秒设置为00:00:00,即在右边界的日期一开始的时候就会停止查询,遂不包含右边界。
少见的运算符号
REGEXP --- 正则表达式(RegExp)--- SELECT REGEXP
<=> --- SELECT a<=>b FROM ... --- 当a,b都为NULL时返回1,否则返回0
<=>与=不同的是,当a,b都为null时
a<=>b 返回 1
a=b 返回 null
- 通配符 % 是匹配 大于等于0个任意数量的字符
SQL常用函数
算术函数
- ABS() --- 取绝对值
- MOD(a,b) --- 取余,a%b的余数
- ROUND(a,b) --- 四舍五入保留位数,保留b位小数
字符串函数
CONCAT("a",b) --- 拼接字符串,a必须有单引号或者双引号,后面的可以没有,在MySQL中可以连接多个字符串
LENGTH(“a”) --- 返回字符串a的长度,中文占三个字符
CHAR_LENGTH() --- 返回字符串的长度,中文也只算一个字符
LOWER(),UPPER()
REPALCE("要被替换的字符串","要替换的部分","替换内容")
SELECT REPLACE("CIVILAZATION","IVILAZATION",LOWER("IVILAZATION"));
返回
+------------------------------------------------------------+
| REPLACE("CIVILAZATION","IVILAZATION",LOWER("IVILAZATION")) |
+------------------------------------------------------------+
| Civilazation |
+------------------------------------------------------------+
1 row in set (0.00 sec)
SUBSTRING ("要被截取的字符串",开始截取的位置,截取长度)
截取位置的第一位从1开始
每个中文汉字也只占一个长度
时间函数
当前时间
CURRENT_DATECURRENT_TIMECURRENT_TIMESTAMP--- (时间戳)具体从年到秒的时间EXTRACT(xxx FROM (符合格式的时间或者函数))
mysql> SELECT EXTRACT(YEAR FROM CURRENT_TIMESTAMP);
+--------------------------------------+
| EXTRACT(YEAR FROM CURRENT_TIMESTAMP) |
+--------------------------------------+
| 2020 |
+--------------------------------------+
1 row in set (0.00 sec)
上面的
xxx可以用下列函数的名称替换 YEAR()、MONTH()、DAY()、HOUR()、MINUTE()、SECOND()
DATE()
转换函数
CAST(),目标类型可以是以下类型之一:
BINARY,CHAR,DATE,DATETIME,TIME,DECIMAL,SIGNED,UNSIGNED。mysql> SELECT CONCAT('Your num is ',CAST(7 as char));
+----------------------------------------+
| CONCAT('Your num is ',CAST(7 as char)) |
+----------------------------------------+
| Your num is 7 |
+----------------------------------------+
1 row in set (0.00 sec)
CONVERT(字段名/字符串 as 字符集名)
用于转换字符集
COALESCE(),返回参数中第一个非空返回值
mysql> SELECT COALESCE(NULL, NULL, NULL, 'Google', NULL, 'baidu');
+-----------------------------------------------------+
| COALESCE(NULL, NULL, NULL, 'Google', NULL, 'baidu') |
+-----------------------------------------------------+
| Google |
+-----------------------------------------------------+
1 row in set (0.00 sec)
忽略NULL
COUNT(*) 只统计行数,无论某行中某些字段是否为null
COUNT(字段)时会忽略
字段值为NULL的行,只统计字段值不为NULL的行的总数AVG(),MAX(),MIN() 也会忽略为NULL的数据行
- MAX(),MIN() 也可以对字符串类型进行统计,按照英文或汉语字母顺序从前到后,越向后越大
ANY ALL
- any是
只要满足任何一个子查询的返回值&&满足比较条件就返回结果。some是any的别名 - all是
只有满足所有子查询的返回值&&满足比较条件才返回结果
EXISTS IN
EXISTS 和IN 很相似,使用IN时要提起写出字段,因此适合在知道去哪个字段里查询时使用
in是先执行子查询并得到一个结果集,再将结果集带入外层谓词条件。子查询只进行一次。
EXISTS是先取一条主查询中的数据,再将数据带入并执行一次子查询。主查询有多少数据子查询就会进行多少次。
因为in和exists的查询机制,为了效率,外表数据量大使用in,外表数据量小使用exists
即
小表驱动大表#现有A,B两表,
SELECT * FROM A WHERE columnA IN (SELECT columnA FROM B);
SELECT * FROM A WHERE columnA EXISTS (SELECT columnA FROM B WHERE B.columnA=A.columnA);
假如A表大于B表,使用IN较好,因为IN先使用的是较小的表B
假如A表小于B表,使用EXISTS较好,因为EXISTS先使用的是较小的表A
NOT EXISTS 与 NOT IN 之间最好使用 NOT EXIST 或者是 NOT IN ( ... IS NOT NULL)
因为NULL值是无法被比较的,IN在先执行子查询时可能会过滤掉有null值得那一行
當一句Where id not in('A123456789','B123456789')執行時其實就是跟 Where id<>'A123456789' and id<>'B123456789' 是一樣的。而用and就是要所有條件都是True才會是True,只要有一個條件不成立就會是False。因此當比對的欄位有NULL時(例 : Where id<>'A123456789' and id<>NULL),而NULL是不能比較的,因此id<>NULL會判斷是False。一但有一條件是回傳False,那整個Where條件式就是False了,因此這一筆資料就會被認為是不符合的。
具体案例可见此处
NULL对NOT IN的影响本质上是对SELECT子查询的影响,因此在select查询时也要注意

- MySQL不支持全外连接 (0625)
随记2
SQL基础随记1 SQL分类 常用函数 ALL ANY EXISTS IN 约束的更多相关文章
- SQL基础随记3 范式 键
SQL基础随记3 范式 键 什么是范式?哈,自己设计会使用但是一问还真说不上来.遂将不太明晰的概念整体下 什么是 & 分类 范式(NF),一种规范,设计数据库模型时对关系内部各个属性之间的 ...
- SQL基础随记2 视图 存储过程
SQL基础随记2 视图 存储过程 View CREATE/ALTER/DROP VIEW ViewName as SELECT(...) 可以在视图的基础上继续创建视图,即,将之前创建的视图当做表 ...
- SQL操作数据——SQL组成,查询基础语法,where,Oracle常用函数等
SQL组成 DML数据操作语言 DCL数据控制语言 DQL数据查询语言 DDL数据定义语言 查询基础语法 记录筛选 where 子句 记录筛选 where 子句 实例练习 实例练习 Select语句中 ...
- 《SQL基础教程》+ 《SQL进阶教程》 学习笔记
写在前面:本文主要注重 SQL 的理论.主流覆盖的功能范围及其基本语法/用法.至于详细的 SQL 语法/用法,因为每家 DBMS 都有些许不同,我会在以后专门介绍某款DBMS(例如 PostgreSQ ...
- Python基础——数据类型、流程控制、常用函数
Python tutorial :Python网站上的对 Python 语言和系统的基本概念和功能进行的非正式的介绍. 在学习Python之前,我们需要学会在各个平台配置Python的运行环境,下文中 ...
- 性能测试基础-开门篇3(LR常用函数介绍)
LR常用的函数,协议不一样函数会不一样,这里简单的介绍下HTTP\WEBSERVICE\SOCKET协议常用函数: HTTP: web_set_max_html_param_len("102 ...
- SQL Server进阶(十二)常用函数
在SQL 2012基础教程中列出子句是按照以下顺序进行逻辑处理. FROM WHERE GROUP BY HAVING SELECT ORDER BY FROM TableName WHERE Use ...
- sql 基础语法3:分组,聚合函数,having,联合查询,快速备份,内联函数
select * from Classinfo select * from StuInfo select * from CourseInfo select * from ScoreInfo --分组 ...
- 第一章 SQL基础
第一部分:SQL基础1. 为什么学习SQL自人类社会形成之日起,社会的运转就在不断地产生和使用各种信息(文献.档案.资料.数据等):在如今所谓的信息时代,由于计算机和互联网的作用,信息的产生和使用达到 ...
随机推荐
- java实现第二届蓝桥杯四方定理
四方定理. 数论中有著名的四方定理:所有自然数至多只要用四个数的平方和就可以表示. 我们可以通过计算机验证其在有限范围的正确性. 对于大数,简单的循环嵌套是不适宜的.下面的代码给出了一种分解方案. 请 ...
- opencl(4)命令队列
1:创建命令队列 cl_command _queue clCreateCommandQueue( cl_context context, //上下文 cl_device_id device, ...
- PHP 直接插入排序
php数组下标从0开始,所以第一步就是数组长度加1,数组元素全部后移一位,把下标0对应值设置为哨兵.结果顺序排序完成后,删除哨兵. function insert_sort($arr) { //这里可 ...
- Linux系统管理——Linux安装
实验软件包下载地址 VirtualBox下载地址 VirtualBox:下载地址 CentOS7镜像下载地址 CentOS7:下载地址 远程登录管理工具下载地址 MobaXterm:下载地址 Virt ...
- Flask Jinja2 知识点
Jinja2模板引擎使用以下分隔符从HTML转义. {% ... %}用于语句 {{ ... }}用于表达式可以打印到模板输出 {# ... #}用于未包含在模板输出中的注释 # ... ##用于行语 ...
- Microsoft SQL Server Migration Assistant for MySQL(从MySQL迁移表数据到MSSQL2008R2)_3
环境: 英文版(Windows7 64 bit + MySQL8.0.18 64 bit + MSSQL2008R2 64 bit) Microso ...
- (七)Maven Profile 和 Filtering
每个项目都会有多套运行环境(开发,测试,正式等等),不同的环境配置也不尽相同(如jdbc.url),借助Jenkins和自动部署提供的便利,我们可以把不同环境的配置文件单独抽离出来,打完包后用对应环境 ...
- 浅谈async 及 await
async 及 await 涉及面试题:async 及 await 的特点,它们的优点和缺点分别是什么?await 原理是什么? 一个函数如果加上 async ,那么该函数就会返回一个 Promise ...
- selenium(2)-selenium针对浏览器的操作有哪些
对浏览器有哪些操作 最大化.最小化浏览器 控制.获取浏览器大小 获取当前标签页title.url 前进.后退.刷新 执行js语句 打开.关闭,切换新标签页 滚动页面 上传附件 鼠标悬停 对话框的定位方 ...
- 多页面共用sessionStorage的实现(转载)
sessionStorage的局限: sessionStorage是页面级别的,仅在一个标签页生效,如果同一个浏览器同时打开多个标签页,且都访问同一个域名,sessionStorage是不会在这多个标 ...