文章

天地玄黄,宇宙洪荒。日月盈昃,辰宿列张。寒来暑往,秋收冬藏。

综述

俨然年关将至,然而并没有什么特别的感觉,硬要说的话,唯期望时间过的慢点而已。
个人认为,这将会是一篇很没营养的笔记,最近一段时间不能说没有合适的东西记录,然而个人了解并不深入,大都囫囵吞枣不求甚解,故不成文章。
然后在这之中,却有一项大多数从事计算机相关职业的人都认为很通用,或者说重要的东西,数据库。
作为一个咸鱼前端,诚然,什么'SELECT * FROM tableName' 这种语句还是随手就来的,然而更复杂的功能就得百度了,不得不说,大多数功能这都能实现。
但,终归不是长久之计,悻然最近有机会用到这些,那不如借此机会再复习一遍,若能借此有所深入,则为我之大幸。于是这篇笔记应用而生。
写在之前:

  1. 这不是介绍怎么入门的文章,因为我也还没入门。
  2. 我会跳过数据类型介绍,建库建表,还有很多必须懂的概念,这块我觉得在实践中会记得更快。
  3. 我会跳过值检测(比如各种约束)及函数部分,留给以后的笔记。
  4. 笔记会很基础,大部分部分是转化自w3cschool。

SQL基础

SQL(结构化查询语言) 是用于访问和处理数据库的标准的计算机语言,实际上如果英语学的不错的话,读SQL不会太困难,然而遗憾的是我英语并不好,不过学过基本语法后,简单的SQL阅读起来并不会有太大困难。
在这里,我将以MySQL为列子来进行学习。不过首先,我们还是来看下基本语法。最基本的,分号分割,大小写不敏感,在此就略过不提,我们从分类开始。

DML 和 DDL

SQL可以分为两类:数据操作语言 (DML) 和 数据定义语言 (DDL)。
DML:查询和更新的指令比如:

  • SELECT - 从数据库中获取数据
  • UPDATE - 更新数据库中的数据
  • DELETE - 从数据库表中删除数据
  • INSERT INTO - 向数据库表中插入数据

DDL:创建删除表格,或者定义索引,规定表之间的连接,施加表间的约束。

  • CREATE DATABASE - 创建新数据库
  • ALTER DATABASE - 修改数据库
  • CREATE TABLE - 创建新表
  • ALTER TABLE - 变更数据表
  • DROP TBALE - 删除表
  • CREATE INDEX - 创建索引
  • DROP INDEX - 删除索引

最基本的列子:

SELECT keyName,... FROM tableName;
- 显示 tableName中,与keyName,...那一列的内容。

SELECT DISTINCT keyName FROM tableName;
- 去重显示

SELECT keyName,.. FROM tableName WHERE keyName=keyValue;
- 通过keyName 是否等于keyVlaue来筛选显示信息。

SELECT keyName,.. FROM tableName WHERE keyName=keyValue AND/OR keyName1=keyValue1;
- ADN OR 与或,同时满足,或只满足其中一方。

SELECT keyName,.. FROM tableName ORDER BY keyName;
- 基于keyName排序(字母表顺序,或者数字顺序)。

INSERT INTO tableName (keyName,...) VALUES (keyValue,..);
- 将键值插入tableName

UPDATE tableName SET keyName='newValue',.. WHERE keyName=keyValue;
- 将符合条件的某行中的某列值修改

DELETE FROM tbaleName WHERE keyName=keyValue;
- 删除tableName中符合条件的行。

花式查询

上面列了最最常见的增删改查,然而由于我不打算介绍创建表相关的内容,会有一大堆概念,常识可以略过,让我有机会来重点看看查这个方面。
在生产生活中,需要你一次性把数据表中所有数据一口气倒出来的情况可能不多,当然我也见过一口气把所有数据倒出来,然后在程序里做筛选的骚操作,用户只有自己(开发的时候)可能没什么感觉。
搞到生产环境里去哪怕用户量不是很大,也是瞬间爆炸。所以如何在查询的过程中只查找自己需要的内容就是一个需要我们迫切掌握的技术。
依旧让我们从最基本的开始。

  • TOP字句

标准写法: SELECT TOP num keyName FROM tableName;
MySQL:SELECT keyName FROM tbaleName LIMIT num;
效果:查找前num条数据的keyName。
备注:LIMIT starNum,rowNum 可以查询从starNum开始的rwoNum个数据。

  • like连接符

标准写法:SELECT keyName FROM tbaleName WHERE keyName2 LIKE '%value%';
效果:查找tableName中keyName2的值 中包含value的keyName.
备注:%value 以value结尾,value%以value开头,LIKE后面跟的字符串,满足通配符规则。

  • 通配符
%:替代一个或多个字符。  
_:仅替代一个字符。
[charList]:字符中的任意一个字母。
[^charList]或[!charList]:不在字符中的任意一个字母。

MySQL:在MySQL中使用通配符需要使用,REGEXP字句同时,规则有所扩展。

.:匹配/n外的任意字符,注意,返回结果和%不一样,同时REGEXP语句中%不好使。
p1|p2|p3:匹配p1或p2或p3
{n}:匹配n次
{n,m}:n<=m,最少匹配n次,最多匹配m次。
^:匹配输入字符的开始位置。('value%')
$:匹配输入字符的结束位置。('%value')
  • IN 操作符
    标准写法:SELECT kyeName FROM tableName WHERE keyName in (value1,value2,..);
    效果:允许查找keyName 对应的多个值
  • BETWEEN 操作符
    标准写法:SELECT keyName FROM tableName WHERE keyName BETWEEN startValue AND endValue;
    效果:查找keyName对应,startValue与endValue中间的值。
    备注:这些值可以是文本,数值,或者日期。
  • Alias 语法
    标准写法:
- 表的别名
SELECT keyName FROM tableName AS aliasName;
- 列的别名
SELECT keyName AS aliasName FROM tableName;

效果:允许在语句里假设表,列的缩写别名,有助于书写。

  • JOIN 语法
    效果:用于根据两个或多个表中列之间的关系,从这些表中查询出数据
    标准写法的列子:

- INNER JOIN
SELECT table1.key1, table2.t2Key1
FROM table1
INNER JOIN table2
ON table1.Key1 = table2.key1;
- 查出,table1中key1与table2中key1相等部分的值,后面可以继续跟WHERE等筛选。

- LEFT JOIN
SELECT table1.key1, table2.t2Key1
FROM table1
LEFT JOIN table2
ON table1.Key1 = table2.key1;
- 即使右表中不匹配也返回左表中的值。

- RIGHT JOIN
SELECT table1.key1, table2.t2Key1
FROM table1
RIGHT JOIN table2
ON table1.Key1 = table2.key1;
- 即使右表中不匹配也返回左表中的值。

- FULL JOIN
SELECT table1.key1, table2.t2Key1
FROM table1
FULL JOIN table2
ON table1.Key1 = table2.key1;
- 只要其中一个表匹配就返回值

备注:这里的匹配是指在列出要查的字段是否都有值。

  • UNION 语法
    标准写法:SELECT key1 FROM table1 UNION SELECT key2 FROM table2;
    效果:将查询自两个表的结果组合在一起
    备注:UNION不显示重复值,如果需要重复值可以使用UNION ALL

结语

一直以来,我以为SQL的内容很多,很杂,不好记,然而通过这次整理,意外的发现,其实并不是我所想的那样。
这是跳过了很多必须掌握的知识点的结果,关于我跳过的部分,虽然只有模糊的概念,但我想,单独整理出来的篇幅也不会比这篇长太多。
不过,现在列出来的东西,类比来说就好似最基本的加减乘除,或者积木中的一个个单独的零件。
实际应用中,通常会是复杂的组合,一条语句可以很长,那些就留给在实践中掌握,消化了。

评论

This is just a placeholder img.