《MySql必知必会》笔记整理
数据库基础
关键词:
数据库
表
(表名唯一,取决多个因素,如不同数据库的表可以同名)
模式
(关于数据库和表的布局及特性的信息)
列
(表中的字段)
行
[行(raw)和记录(record)很大程度可以等同,但行才是正确的术语]
数据类型
(限制数据种类,帮助正确排序,磁盘优化方面的作用)
主键
(primary key): 一列,其值可以唯一区分表中的行。
SQL
[(Structured Query Language):结构化查询语言。]
主键条件:
- 每行都应有一个主键,所以其值不为null。
- 任意两行间的主键值不同。
主键通常是一列,但也可多列共同构成主键。
主键设置建议:
- 不更新主键列中的值;
- 不重用主键列的值;
- 不在主键列中使用可能会更改的值。
SQL命令执行:
- 命令在
mysql>
之后输入; - 命令用
;
或\g
结束,仅按Enter
不执行命令; - 输入
help
或\h
获取帮助; - 输入
quit
或exit
退出程序。
基本语句:
myslq -u root -p;
use Database;
#SHOW相关
SHOW databases;
SHOW tables;
SHOW columns FROM tables; -- 等于 describe "tables";
SHOW CREATE DATABASE db_name; 显示完整的建库语句
SHOW CREATE TABLE tbl_name;
SHOW [STORAGE] ENGINES
#SELECT相关
SELECT column_name1,column_name2 FROM table;
SELECT *FROM tables;
-- Distinct
-- 不能部分使用DISTINCT,其应用于所有列而不是其前置列
SELECT DISTINCT column_namw FROM table;
-- Limit 从第零个开始后的5个 取的时候排列顺序是从零开始的。
SELECT column_name FROM table_name LIMIT 5;
-- 从第二个开始后的5个
SELECT column_name FROM table_name LIMIT 2,5;
-- OFFSET 限制两个,从第三为开始取
SELECT column_name FROM table_name LIMIT 2 OFFSET 3;
-- 使用全限定的表名 库:manxc 表:tags
SELECT tags.tid FROM manxc.tags;
排序检索数据
关键字:ORDER BY
SELECT column_name FROM table_name ORDER BY column_name;
默认升序,字母按A-Z排,数字从小到大;
注:排序中文时出现问题。
解决:https://www.jianshu.com/p/8a9135f9cd47?utm_campaign
升序(默认):ASC 降序:DESC
过滤数据
关键字:WHERE
(同时可与其它关键字组合)
SELECT * FROM manxc.tags WHERE tags.tid BETWEEN 2 AND 9 ORDER BY tid DESC,tagname;
操作符 | 说明 |
---|---|
= | 等于 |
<> | 不等于 |
!= | 不等于 |
< | 小于 |
<= | 小于等于 |
> | 大于 |
>= | 大于等于 |
BETWEEN | 在指定的两个值之间 |
eg:
mysql> SELECT 2 BETWEEN 1 AND 3, 2 BETWEEN 3 and 1;
-> 1, 0
mysql> SELECT 1 BETWEEN 2 AND 3;
-> 0
mysql> SELECT 'b' BETWEEN 'a' AND 'c';
-> 1
mysql> SELECT 2 BETWEEN 2 AND '3';
-> 1
mysql> SELECT 2 BETWEEN 2 AND 'x-3';
-> 0
WHERE 匹配字符加‘’;且其在执行匹配时默认不区分大小写;
mysql> SELECT uid,username,state FROM manxc.user WHERE username='FLY';
+-----+----------+-------+
| uid | username | state |
+-----+----------+-------+
| 3 | fly | 0 |
+-----+----------+-------+
空值检查:IS NULL (空值是无值和0和空格不同)
mysql> SELECT uid,username,state FROM user WHERE password IS NULL LIMIT 3;
+-----+----------+-------+
| uid | username | state |
+-----+----------+-------+
| 8 | dfdg | NULL |
| 9 | dgdg | NULL |
| 10 | gdg | NULL |
+-----+----------+-------+
数据过滤
关键词
操作符(operator)
:用来联结或改变where子句的关键字。
AND
操作符
mysql> SELECT uid,username,state FROM USER WHERE state IS NULL AND uid <= 13;
+-----+-----------+-------+
| uid | username | state |
+-----+-----------+-------+
| 8 | dfdg | NULL |
| 9 | dgdg | NULL |
| 10 | gdg | NULL |
| 11 | dgdgh | NULL |
| 12 | dgklds | NULL |
| 13 | dgkljdlkg | NULL |
+-----+-----------+-------+
OR
操作符:
mysql> SELECT uid,username,state FROM USER WHERE state IS NULL OR uid <= 13;
+-----+--------------+-------+
| uid | username | state |
+-----+--------------+-------+
| 4 | test1 | 0 |
| 3 | fly | 0 |
| 5 | test2 | 0 |
| 6 | test3 | 1 |
| 7 | 1 | 1 |
| 8 | dfdg | NULL |
| 9 | dgdg | NULL |
| 10 | gdg | NULL |
| 11 | dgdgh | NULL |
| 12 | dgklds | NULL |
| 13 | dgkljdlkg | NULL |
| 14 | fdjwe | NULL |
| 15 | gkdlkg | NULL |
| 16 | dgdlkjg | NULL |
| 17 | fdglkdjg | NULL |
| 18 | gkldssjgdsas | NULL |
| 19 | dgjkljg | NULL |
| 20 | djglkdg | NULL |
| 21 | kgdlksgj | NULL |
+-----+--------------+-------+
混合使用时的顺序:
在有多个or和and同时使用时,优先处理and,可以使用()提高优先级。
mysql> SELECT uid,username,state FROM USER WHERE (state IS NULL OR state =1) AND uid <=10;
+-----+----------+-------+
| uid | username | state |
+-----+----------+-------+
| 6 | test3 | 1 |
| 7 | 1 | 1 |
| 8 | dfdg | NULL |
| 9 | dgdg | NULL |
| 10 | gdg | NULL |
+-----+----------+-------+
5 rows in set (0.00 sec)
mysql> SELECT uid,username,state FROM USER WHERE state IS NULL OR state =1 AND uid <=10;
+-----+--------------+-------+
| uid | username | state |
+-----+--------------+-------+
| 6 | test3 | 1 |
| 7 | 1 | 1 |
| 8 | dfdg | NULL |
| 9 | dgdg | NULL |
| 10 | gdg | NULL |
| 11 | dgdgh | NULL |
| 12 | dgklds | NULL |
| 13 | dgkljdlkg | NULL |
| 14 | fdjwe | NULL |
| 15 | gkdlkg | NULL |
| 16 | dgdlkjg | NULL |
| 17 | fdglkdjg | NULL |
| 18 | gkldssjgdsas | NULL |
| 19 | dgjkljg | NULL |
| 20 | djglkdg | NULL |
| 21 | kgdlksgj | NULL |
+-----+--------------+-------+
16 rows in set (0.00 sec)
建议:使用具有AND和OR操作符的WHERE子句,都应该使用圆括号明确的分组,不用过分依赖计算次序,使用括号没有坏处且能消除歧义。
IN
操作符:
where子句使用in操作符
mysql> SELECT uid,username,state FROM user WHERE state IN (0,1);
+-----+----------+-------+
| uid | username | state |
+-----+----------+-------+
| 4 | test1 | 0 |
| 3 | fly | 0 |
| 5 | test2 | 0 |
| 6 | test3 | 1 |
| 7 | 1 | 1 |
+-----+----------+-------+
5 rows in set (0.00 sec)
IN
和 OR
有类似作用,此句表示查询state是0或1的。
IN操作符的优点:
- 使用IN时,计算次序更容易管理(操作符少了,没那么多or)
- IN操作符的语法更清楚且直观;
- IN一般比OR的执行更快;
- IN的最大优点时可以包含其它SELECT语句,使得能更动态的建立WHERE子句。
NOT
操作符:
where子句中,not用来否定之后跟的条件。
mysql> select * from tags where tid NOT IN (1,2,3,4,5,6,7,8,9,10);
+-----+---------+
| tid | tagname |
+-----+---------+
| 11 | 猎奇 |
| 12 | 少女 |
| 13 | 魔法 |
| 14 | 历史 |
| 15 | 机战 |
| 16 | 神魔 |
| 17 | 运动 |
| 18 | 励志 |
| 19 | 音乐 |
| 20 | 推理 |
| 21 | 美食 |
| 22 | 催泪 |
| 23 | 职场 |
| 26 | 搞笑 |
+-----+---------+
注:MySQL支持使用NOT
对IN
,BETWEEN
,EXISTS
子句取反。
统配符过滤
关键字:like
统配符匹配:
- 百分号(
%
)通配符:表示任何字符出现任意次数,(任意字数的任意字符)
注:
A.由配置方式,搜索时可以区分大小写的;
B.注意尾空格,尾空格会干扰匹配,可在其前后都家%
,或者使用函数。 - 下划线(
_
): 任意的单个字符;
注:统配符的搜索处理比之前操作符的效率更低使用时:
1,不要过度使用,能用其他操作符的,尽量用。
2,除非有绝对必要,不要把通配符放在搜索模式的开始处,这样是最慢的。
3,注意统配符放的位置。
SELECT prod_id,prod_name FROM products
WHERE prod_name LIKE '%ton anvil';
正则表达式搜索
关键字:REGEXP
其后跟正则表达式
与LIKE
与REGEXP
的区别:
LIKE匹配整个列,如果匹配的文本在列值中出现,LIKE不会找到它,相应行也不会返回(除非使用统配符),而REGEXP可以在列值中进行匹配:
mysql> SELECT uid,username,password,state FROM user WHERE username LIKE "test";
Empty set (0.00 sec)
mysql> SELECT uid,username,password,state FROM user WHERE username REGEXP "test";
+-----+----------+----------+-------+
| uid | username | password | state |
+-----+----------+----------+-------+
| 4 | test1 | 123 | 0 |
| 5 | test2 | 123 | 0 |
| 6 | test3 | 123 | 1 |
+-----+----------+----------+-------+
3 rows in set (0.05 sec)
注:MYSQL中正则匹配不区分大小写,如需区分可使用BINARY
关键字,如WHERE prod-name REGEXP BINARY 'JetPack'
.
进行or匹配 使用“|”
mysql> SELECT uid,username,password,state FROM user WHERE username REGEXP "1|lk";
+-----+-----------+----------+-------+
| uid | username | password | state |
+-----+-----------+----------+-------+
| 4 | test1 | 123 | 0 |
| 7 | 1 | 1 | 1 |
| 13 | dgkljdlkg | NULL | NULL |
| 15 | gkdlkg | NULL | NULL |
| 16 | dgdlkjg | NULL | NULL |
| 17 | fdglkdjg | NULL | NULL |
| 20 | djglkdg | NULL | NULL |
| 21 | kgdlksgj | NULL | NULL |
+-----+-----------+----------+-------+
8 rows in set (0.00 sec)
匹配字符:
使用“[]”匹配,相当于另一种形式的or;匹配其中的任意字符
mysql> SELECT uid,username,password,state FROM user WHERE username REGEXP "test";
+-----+----------+----------+-------+
| uid | username | password | state |
+-----+----------+----------+-------+
| 4 | test1 | 123 | 0 |
| 5 | test2 | 123 | 0 |
| 6 | test3 | 123 | 1 |
| 22 | test4 | NULL | NULL |
| 23 | test5 | NULL | NULL |
| 24 | test6 | NULL | NULL |
+-----+----------+----------+-------+
6 rows in set (0.00 sec)
mysql> SELECT uid,username,password,state FROM user WHERE username REGEXP "test[123]";
+-----+----------+----------+-------+
| uid | username | password | state |
+-----+----------+----------+-------+
| 4 | test1 | 123 | 0 |
| 5 | test2 | 123 | 0 |
| 6 | test3 | 123 | 1 |
+-----+----------+----------+-------+
3 rows in set (0.00 sec)
mysql> SELECT uid,username,password,state FROM user WHERE username REGEXP "[123]test";
Empty set (0.00 sec)
mysql> SELECT uid,username,password,state FROM user WHERE username REGEXP "[test]";
+-----+--------------+----------+-------+
| uid | username | password | state |
+-----+--------------+----------+-------+
| 4 | test1 | 123 | 0 |
| 5 | test2 | 123 | 0 |
| 6 | test3 | 123 | 1 |
| 12 | dgklds | NULL | NULL |
| 14 | fdjwe | NULL | NULL |
| 18 | gkldssjgdsas | NULL | NULL |
| 21 | kgdlksgj | NULL | NULL |
| 22 | test4 | NULL | NULL |
| 23 | test5 | NULL | NULL |
| 24 | test6 | NULL | NULL |
+-----+--------------+----------+-------+
10 rows in set (0.00 sec)
加上“^”表非
mysql> SELECT uid,username,password,state FROM user WHERE username REGEXP "test[^123]";
+-----+----------+----------+-------+
| uid | username | password | state |
+-----+----------+----------+-------+
| 22 | test4 | NULL | NULL |
| 23 | test5 | NULL | NULL |
| 24 | test6 | NULL | NULL |
+-----+----------+----------+-------+
3 rows in set (0.00 sec)
空格
mysql> SELECT uid,username,password,state FROM user WHERE username REGEXP "1|2 test";
+-----+----------+----------+-------+
| uid | username | password | state |
+-----+----------+----------+-------+
| 4 | test1 | 123 | 0 |
| 7 | 1 | 1 | 1 |
+-----+----------+----------+-------+
2 rows in set (0.00 sec)
匹配范围:如[1-3],[a-z];
mysql> SELECT uid,username,password,state FROM user WHERE username REGEXP "test[1-3]";
+-----+----------+----------+-------+
| uid | username | password | state |
+-----+----------+----------+-------+
| 4 | test1 | 123 | 0 |
| 5 | test2 | 123 | 0 |
| 6 | test3 | 123 | 1 |
+-----+----------+----------+-------+
3 rows in set (0.00 sec)
匹配特殊字符: 使用 “\\
特殊字符”,即转义
\\.
能够匹配.\\f
换页\\n
换行\\r
回车\\t
制表\\
纵向制表
注意:
a)为了匹配 \
本身,需要使用 \\\
b)在一般情况下正则表达式的转义加一个“\”就可以了,在MySQL中需要加两个。
匹配字符类:
[:alnum:]=[a-zA-Z0-9]
[:alpha:]=[a-zA-Z]
[:digit:]=[0-9]
[:lower:]=[a-z]
[:upper:]=[A-Z]
[:xdigit:]=[a-fA-F0-9]
重复次数匹配将其加在之后:
元字符 | 说明 |
---|---|
* | 0个或多个匹配 |
+ | 1个或多个匹配(等于{1,}) |
? | 0个或1个匹配(等于{0,1}) |
指定数目匹配 | |
不少于指定数目匹配 | |
匹配数目的范围 |
匹配任意三个连续数字:
问:把其【【】】是一种更好习惯?还是有什么区别
答:所以这里的区别是[[:digit:]],[:digit:]有的
mysql> SELECT uid,username,password,state FROM user WHERE password REGEXP "[[:digit:]]{3}";
+-----+----------+----------+-------+
| uid | username | password | state |
+-----+----------+----------+-------+
| 4 | test1 | 123 | 0 |
| 3 | fly | 123 | 0 |
| 5 | test2 | 123 | 0 |
| 6 | test3 | 123 | 1 |
| 8 | dfdg | d124 | NULL |
| 9 | dgdg | 123r | NULL |
+-----+----------+----------+-------+
6 rows in set (0.00 sec)
mysql> SELECT uid,username,password,state FROM user WHERE password REGEXP "[:digit:]{3}";
+-----+----------+----------+-------+
| uid | username | password | state |
+-----+----------+----------+-------+
| 4 | test1 | 123 | 0 |
| 3 | fly | 123 | 0 |
| 5 | test2 | 123 | 0 |
| 6 | test3 | 123 | 1 |
| 8 | dfdg | d124 | NULL |
| 9 | dgdg | 123r | NULL |
+-----+----------+----------+-------+
6 rows in set (0.00 sec)
定位元字符:
元字符 | 说明 |
---|---|
^ | 文本的开始 |
$ | 文本的结尾 |
[[:<:]] | 词的开始 |
[[:>:]] | 词的结尾 |
示例:找出密码中以数字开头的记录:
mysql> SELECT uid,username,password,state FROM user WHERE password REGEXP "^[[:digit:]\\.]";
+-----+----------+----------+-------+
| uid | username | password | state |
+-----+----------+----------+-------+
| 4 | test1 | 123 | 0 |
| 3 | fly | 123 | 0 |
| 5 | test2 | 123 | 0 |
| 6 | test3 | 123 | 1 |
| 7 | 1 | 1 | 1 |
| 9 | dgdg | 123r | NULL |
| 10 | gdg | 1d23 | NULL |
| 11 | dgdgh | 1.23s | NULL |
| 12 | dgklds | 2.31t | NULL |
+-----+----------+----------+-------+
9 rows in set (0.00 sec)
// 注意区别
mysql> SELECT uid,username,password,state FROM user WHERE password REGEXP "^[:digit:]\\.";
+-----+----------+----------+-------+
| uid | username | password | state |
+-----+----------+----------+-------+
| 11 | dgdgh | 1.23s | NULL |
| 12 | dgklds | 2.31t | NULL |
+-----+----------+----------+-------+
2 rows in set (0.00 sec)
创建计算字段
Concat()
函数拼接字段
Concat()
拼接串,把多个串连接起来形成一个较长的串。各串之间用“,
”分隔。
注:多数DBMS使用+或||来实现拼接,而mysql使用Concat()
函数
将用户名按 用户名(用户id)拼接出来:
mysql> SELECT Concat(username,'(',uid,')') FROM user ORDER BY uid DESC LIMIT 4;
+------------------------------+
| Concat(username,'(',uid,')') |
+------------------------------+
| test6(24) |
| test5(23) |
| test4(22) |
| kgdlksgj(21) |
+------------------------------+
4 rows in set (0.00 sec)
RTrim( )函数:删除值右边的所有空格
mysql> SELECT Concat(Rtrim(username),'(',uid,')') FROM user ORDER BY uid DESC LIMIT 4;
+-------------------------------------+
| Concat(Rtrim(username),'(',uid,')') |
+-------------------------------------+
| test6(24) |
| test5(23) |
| test4(22) |
| kgdlksgj(21) |
+-------------------------------------+
4 rows in set (0.00 sec)
LTrim( )函数去掉串左边的空格,Trim( )函数去掉串两边的空格;
使用别名:
别名(alias)用AS关键字赋予,使用别名能让客户机更好的使用数据,别名有时也叫导出列;
mysql> SELECT Concat(username,'(',uid,')')
-> AS uinfo
-> FROM user LIMIT 4;
+----------+
| uinfo |
+----------+
| test1(4) |
| fly(3) |
| test2(5) |
| test3(6) |
+----------+
4 rows in set (0.00 sec)
《MySql必知必会》笔记整理的更多相关文章
- Java内存区域与内存溢出异常——深入理解Java虚拟机 笔记一
Java内存区域 对比与C和C++,Java程序员不需要时时刻刻在意对象的创建和删除过程造成的内存溢出.内存泄露等问题,Java虚拟机很好地帮助我们解决了内存管理的问题,但深入理解Java内存区域,有 ...
- 深入理解Java虚拟机笔记
1. Java虚拟机所管理的内存 2. 对象创建过程 3. GC收集 4. HotSpot算法的实现 5. 垃圾收集器 6. 对象分配内存与回收细节 7. 类文件结构 8. 虚拟机类加载机制 9.类加 ...
- 深入理解java虚拟机笔记Chapter12
(本节笔记的线程收录在线程/并发相关的笔记中,未在此处提及) Java内存模型 Java 内存模型主要由以下三部分构成:1 个主内存.n 个线程.n 个工作内存(与线程一一对应) 主内存与工作内存 J ...
- 深入理解java虚拟机笔记Chapter7
虚拟机类的加载机制 概述 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类的加载机制. 类加载的时机 J ...
- 深入理解java虚拟机笔记之一
Java的技术体系主要有支撑java程序运行的虚拟机,提供各开发领域接口支持Java API,java编程语言及许多第三方java框架( 如Spring,Structs等)构成. 可以把Java程序设 ...
- 深入理解Java虚拟机笔记——虚拟机类加载机制
目录 概述 动态加载和动态连接 类加载的时机 类的生命周期 被动引用 例子一(调用子类继承父类的字段) 例子二(数组) 例子三(静态常量) 类加载的过程 加载 验证 准备 解析 符号引用 直接引用 初 ...
- 【转载】深入理解Java虚拟机笔记---运行时栈帧结构
栈帧(Stack Frame)是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区的虚拟机栈(Virtual Machine Stack)的栈元素.栈帧存储了方法的局部变量表,操作 ...
- 深入理解java虚拟机笔记Chapter8
运行时栈帧结构 栈帧(Stack Frame)是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区中的虚拟机栈(Virtual Machine Stack)的栈元素.栈帧存储了方法 ...
- 深入理解java虚拟机笔记Chapter2
java虚拟机运行时数据区 首先获取一个直观的认识: 程序计数器 线程私有.各条线程之间计数器互不影响,独立存储. 当前线程所执行的字节码行号指示器.字节码解释器工作时通过改变这个计数器值选取下一条需 ...
- 类文件结构——深入理解Java虚拟机 笔记三
在之前的笔记中记录过,Java程序变成可执行文件的步骤是:源代码-->经过编译变成class文件-->经过JVM虚拟机变成可执行的二进制文件.因此,为了对JVM执行程序的过程有一个好的了解 ...
随机推荐
- JS原生2048小游戏源码分享
最近在学习算法方面的知识,看到了一个由算法主导的小游戏,这里给大家分享下代码: 效果: 代码: <head> <meta charset="UTF-8"> ...
- Docker网络模型以及容器通信
本篇接着上篇:[Docker0网络及原理探究],继续深入探究容器网络通信原理,通过学习Docker网路驱动模型,更好地解决容器间的通信问题 1.Docker的网络驱动模型 1.1.Docker的网络驱 ...
- DRConv:旷视提出区域感知动态卷积,多任务性能提升 | CVPR 2020
论文提出DRConv,很好地结合了局部共享的思想并且保持平移不变性,包含两个关键结构,从实验结果来看,DRConv符合设计的预期,在多个任务上都有不错的性能提升 来源:晓飞的算法工程笔记 公众号 ...
- kingbaseES 优化之数据库瓶颈排查
针对数据库的性能瓶颈排查方法分为两个层次1.实例级别性能问题排查 2.语句级别性能问题排查 实例级别 实例级别性能问题排查用来分析数据库实例整体是否存在性能瓶颈,然后根据排除出的疑似问题进行实例级别参 ...
- 【Java面试题】SpringMVC
九.SpringMVC 63)SpringMVC 的流程 a.用户向服务器发送请求,请求被 SpringMVC 前端控制器 DispatchServlet 捕获: b.DispatcherServle ...
- #树形dp#nssl 1469 W
分析 首先一些结论,每条边最多被翻一次,而且由翻的边所构成的连通块答案就是度数为奇数的点的个数的一半, 因为在连通块内必然选择两个叶子节点间的路径翻是最优的,所以也就是选择两个度数为奇数的点,所以结论 ...
- #网络流,dinic,最小割#洛谷 3227 [HNOI2013]切糕
题目传送门 题目大意 \(P\)行\(Q\)列的楼房高度均为\(R\),每一层改造要花费一定的金钱, 每个楼房都要挑选有且仅有一层进行改造,并且相邻两个楼房改造位置的相对高度不能超过\(D\), 问最 ...
- 及刻周边惠:拥抱HarmonyOS原子化服务
原文链接:https://mp.weixin.qq.com/s/Y75eiRlvDLXzoZWzAiZdeg,点击链接查看更多技术内容: 开发背景 及刻周边惠是梦享网络旗下本地生活服务平台,旨在为消费 ...
- HarmonyOS Connect FAQ第三期
原文:https://mp.weixin.qq.com/s/YpI9-k4yQvNhaMfg7Li82g,点击链接查看更多技术内容. 在开发HarmonyOS Connect生态产品时,你是否对设 ...
- nginx重新整理——————分析log数据[六]
前言 简单介绍一下goaccess. 正文 安装: yum install epel-release yum install GeoIP GeoIP-devel GeoIP-data yum inst ...