# SQL(Structured Query Language)
什么是SQL?
简单地说,就跟他的英文翻译一样,SQL(结构化查询语言)就是访问和处理关系数据库的计算机标准语言,无论你用到什么编程语言编写程序,涉及到操作关系数据库的操作时,都必须使用SQL来完成。
SQL与NoSQL
主流SQL数据库:MySQL,SQLServer,Oracel等
主流NoSQL数据库:MongoDB,Redis,CouchDB等
SQL数据库为关系型数据库,其中的数据之间有着严格数据模式约束,而NoSQL为非关系型数据库,数据之间没有必然逻辑联系。
SQL与NoSQL的区别
SQL数据库提供关系型的表来存储数据,NoSQL数据库采用类JOSN的键值对来存储文档。
在SQL数据库中,除非你事先定义了表和字段的模式否则你无法向其中添加数据。在NoSQL数据库中,数据在任何时候都可以进行添加,不需要事先去定义文档和集合。
SQL具有数据库的规范化。NoSQL虽然可以同样使用规范化,但是更倾向非规范化。
SQL具有JOIN操作, NoSQL则没有。
SQL具有数据完整性。NoSQL则不具备数据完整性。
大多数的数据库允许通过定义外键来进行数据库的完整性约束。在NoSQL数据库中则没有数据完整性的约束选项。你可以存储任何你想要存储的数据。理想情况下,单个文档将是项目的所有信息的唯一来源。
SQL需要自定义事务。NoSQL 操作单个文档时具备事务性,而操作多个文档时则不具备事务性。
在SQL数据库中,两条或者多条更新操作可以结合成一个事务(或者全部执行成功否则失败)执行。将两条更新操作绑定为一个事务确保了它们要么全部成功要么全部失败。在NoSQL数据库中,对于一个文档的更新操作是原子性的。换句话说,如果你要更新一个文档中的三个值,要么三个值都更新成功要么它们保持不变。然而,对于操作多个文档时没有与事务相对应的操作。在MongoDB中有一个操作是transaction-like options,但是,需要我们手动的加入到代码中。
SQL使用SQL语言。NoSQL使用类JSON。
关系模型
表1中的结构为:
id class name age 1 一班 小明 11 2 一班 小华 12 3 三班 林佳 21 表中对应的每一行为一条记录(Record),对应的每一列为一个字段(Column),同一张表的每一行都有相同的若干字段。字段是初始化表的时候自定义的。
简单操作之增删改查
查询
基本查询
SELECT * FROM <表名>
1此查询用来查询这张表的所有数据。例如:
SELECT * FROM students;
1,就会显示这张表的所有信息。
条件查询
SELECT * FROM <表名> WHERE <条件表达式>
1例如我们想查询年龄在15岁以上的,就可以这样写:
SELECT * FROM students WHERE age>15;
1思考以下操作:
SELECT * FROM students WHERE age>15 AND class="一班"; SELECT * FROM students WHERE age>15 OR class="一班"; SELECT * FROM students WHERE NOT class="一班";
1
2
3投影查询
上面的查询方式都是返回符合条件的一行记录,该记录包含所有字段,但如果只想要其中的某些字段的话,就需要使用下面的语句,也可以知道,上面查询语句中的*号表示的是所有字段。
SELECT <字段1、字段2···> FROM <表名> WHERE <条件表达式>
1例如:
SELECT id, name FROM students;
1排序
在上面的查询语句上再加上ORDER BY <字段>表示将查询到的记录按照某个字段排序。
SELECT <字段1、字段2···> FROM <表名> WHERE <条件表达式> ORDER BY <字段> DESC(加上desc表示倒叙)
1如果排序字段中有相同值,还可以在具有相同值的记录中,按照其他字段继续排序
SELECT <字段1、字段2···> FROM <表名> WHERE <条件表达式> ORDER BY <字段> DESC(加上desc表示倒叙),<其他字段>
1例如:
SELECT id,name,age,class FROM students WHERE age>10 ORDER BY class DESC,age
1该语句表示从students表中查询字段为id,name,age,class,的列的age>10的所有记录,并按照班级排序,如果班级相同,则按照年龄排序。
多表查询
直接上例子会很清楚:
SELECT s.id sid, s.name, s.gender, s.score, c.id cid, c.name cname FROM students s, classes c;
1
2
3
4
5
6
7
8查询结果如上图,可见c.id cid语句是在给c表中的id字段取别名,防止两表字段相同冲突。
JOIN操作
涉及到不同表中的字段合并成一张表时,可能因顺序不同而发生记录不同行现象,JOIN操作可以按照某一字段自动合并其他字段与之匹配。
其他
还有更多的查询方式以及查询操作,这里不在详细陈述,可以去找相关资料或者去看一些官方文档。
增
增加一条记录:
INSERT INTO <表名> (字段1, 字段2, ...) VALUES (值1, 值2, ...);
1例如:
INSERT INTO students (class_id, name, gender, score) VALUES (2, '大牛', 'M', 80);
1增加多条记录:
INSERT INTO students (class_id, name, gender, score) VALUES (1, '大宝', 'M', 87), (2, '二宝', 'M', 81);
1
2
3
改(或者叫做更新)
UPDATE <表名> SET 字段1=值1, 字段2=值2, ... WHERE ...;
1例如:
UPDATE students SET name='大牛', score=66 WHERE id=1;
1删
DELETE FROM <表名> WHERE ...;
1
高级进阶