数据库基础

关键词:

数据库

(表名唯一,取决多个因素,如不同数据库的表可以同名)

模式(关于数据库和表的布局及特性的信息)

(表中的字段)

[行(raw)和记录(record)很大程度可以等同,但行才是正确的术语]

数据类型(限制数据种类,帮助正确排序,磁盘优化方面的作用)

主键(primary key): 一列,其值可以唯一区分表中的行。

SQL [(Structured Query Language):结构化查询语言。]

主键条件:

  1. 每行都应有一个主键,所以其值不为null。
  2. 任意两行间的主键值不同。

主键通常是一列,但也可多列共同构成主键。

主键设置建议:

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

SQL命令执行:

  1. 命令在mysql>之后输入;
  2. 命令用 \g结束,仅按Enter不执行命令;
  3. 输入help\h获取帮助;
  4. 输入quitexit退出程序。

基本语句:

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)

INOR 有类似作用,此句表示查询state是0或1的。

IN操作符的优点:

  1. 使用IN时,计算次序更容易管理(操作符少了,没那么多or)
  2. IN操作符的语法更清楚且直观;
  3. IN一般比OR的执行更快;
  4. 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支持使用NOTINBETWEENEXISTS子句取反。

统配符过滤

关键字:like

统配符匹配:

  1. 百分号(%)通配符:表示任何字符出现任意次数,(任意字数的任意字符)

    注:

    A.由配置方式,搜索时可以区分大小写的;

    B.注意尾空格,尾空格会干扰匹配,可在其前后都家%,或者使用函数。
  2. 下划线(_): 任意的单个字符;

    注:统配符的搜索处理比之前操作符的效率更低使用时:

    1,不要过度使用,能用其他操作符的,尽量用。

    2,除非有绝对必要,不要把通配符放在搜索模式的开始处,这样是最慢的。

    3,注意统配符放的位置。
SELECT prod_id,prod_name FROM products
WHERE prod_name LIKE '%ton anvil';

正则表达式搜索

关键字:REGEXP 其后跟正则表达式

LIKEREGEXP的区别:

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必知必会》笔记整理的更多相关文章

  1. Java内存区域与内存溢出异常——深入理解Java虚拟机 笔记一

    Java内存区域 对比与C和C++,Java程序员不需要时时刻刻在意对象的创建和删除过程造成的内存溢出.内存泄露等问题,Java虚拟机很好地帮助我们解决了内存管理的问题,但深入理解Java内存区域,有 ...

  2. 深入理解Java虚拟机笔记

    1. Java虚拟机所管理的内存 2. 对象创建过程 3. GC收集 4. HotSpot算法的实现 5. 垃圾收集器 6. 对象分配内存与回收细节 7. 类文件结构 8. 虚拟机类加载机制 9.类加 ...

  3. 深入理解java虚拟机笔记Chapter12

    (本节笔记的线程收录在线程/并发相关的笔记中,未在此处提及) Java内存模型 Java 内存模型主要由以下三部分构成:1 个主内存.n 个线程.n 个工作内存(与线程一一对应) 主内存与工作内存 J ...

  4. 深入理解java虚拟机笔记Chapter7

    虚拟机类的加载机制 概述 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类的加载机制. 类加载的时机 J ...

  5. 深入理解java虚拟机笔记之一

    Java的技术体系主要有支撑java程序运行的虚拟机,提供各开发领域接口支持Java API,java编程语言及许多第三方java框架( 如Spring,Structs等)构成. 可以把Java程序设 ...

  6. 深入理解Java虚拟机笔记——虚拟机类加载机制

    目录 概述 动态加载和动态连接 类加载的时机 类的生命周期 被动引用 例子一(调用子类继承父类的字段) 例子二(数组) 例子三(静态常量) 类加载的过程 加载 验证 准备 解析 符号引用 直接引用 初 ...

  7. 【转载】深入理解Java虚拟机笔记---运行时栈帧结构

    栈帧(Stack Frame)是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区的虚拟机栈(Virtual Machine Stack)的栈元素.栈帧存储了方法的局部变量表,操作 ...

  8. 深入理解java虚拟机笔记Chapter8

    运行时栈帧结构 栈帧(Stack Frame)是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区中的虚拟机栈(Virtual Machine Stack)的栈元素.栈帧存储了方法 ...

  9. 深入理解java虚拟机笔记Chapter2

    java虚拟机运行时数据区 首先获取一个直观的认识: 程序计数器 线程私有.各条线程之间计数器互不影响,独立存储. 当前线程所执行的字节码行号指示器.字节码解释器工作时通过改变这个计数器值选取下一条需 ...

  10. 类文件结构——深入理解Java虚拟机 笔记三

    在之前的笔记中记录过,Java程序变成可执行文件的步骤是:源代码-->经过编译变成class文件-->经过JVM虚拟机变成可执行的二进制文件.因此,为了对JVM执行程序的过程有一个好的了解 ...

随机推荐

  1. KALI 安装搜狗输入法

    原文网址 https://www.cnblogs.com/liuxingbusi/p/9277127.html ------------------------------------------ 一 ...

  2. KingbaseES V8R6运维案例之---MySQL和KingbaseES字符串排序规则对比

    案例说明: 相同数据排序后查询,在MySQL和KingbaseES下得到的排序顺序不一致,本案例从MySQL和KingbaseES的排序规则分析,两种数据库排序的异同点. 适用版本: Kingbase ...

  3. Lab1:Xv6 and Unix utilities

    Sleep功能 通过接受时间参数,调用system_call 指令 sleep实现该功能 #include "kernel/types.h" #include "kern ...

  4. 【Learning eBPF-2】eBPF 的“Hello world”

    前一章讲了 eBPF 为什么这么吊,不理解没关系,现在开始,我们通过一个 "Hello world" 例子,来真正入门一下. BCC Python 框架是上手 eBPF 的最友好方 ...

  5. MyBatis resultMap中collection过滤空字段

    在使用MyBatis查询数据时,返回值可以定义为resultMap. 如果返回的对象中有列表,还可以使用collection标签进行定义. 此时,如果不想某些字段为空的数据加入列表,可以使用notNu ...

  6. Docker 14 Docker Compose

    概述 使用 Docker 的时候,定义 Dockerfile 文件,然后使用 docker build.docker run 等命令操作容器. 然而微服务架构的应用系统一般包含若干个微服务,每个微服务 ...

  7. C#的AOP(最经典实现)

    (适用于.NET/.NET Core/.NET Framework) [目录]0.前言1.第一个AOP程序2.Aspect横切面编程3.一个横切面程序拦截多个主程序4.多个横切面程序拦截一个主程序5. ...

  8. 深入解析decltype和decltype(auto)

    decltype关键字是C++11新标准引入的关键字,它和关键字auto的功能类似,也可以自动推导出给定表达式的类型,但它和auto的语法有些不同,auto推导的表达式放在"="的 ...

  9. C++ 解引用与函数基础:内存地址、调用方法及声明

    C++ 解引用 获取内存地址和值 在上一页的示例中,我们使用了指针变量来获取变量的内存地址(与引用运算符 & 一起使用).但是,你也可以使用指针来获取变量的值,这可以通过使用 * 运算符(解引 ...

  10. CentOS GNOME桌面下安装截图工具gnome-screenshot

    CentOS GNOME桌面下安装截图工具gnome-screenshot 1.光盘安装 (1).把镜像光盘放进电脑 (2).切换到 Packages (3).[root@localhost Pack ...