SQL
条件查询
关键字
BETWEEN…AND… | 在某个范围 |
---|
NOT BETWEEN…AND… | 不在某个范围 | IN(…) | 在一个列表 | NOT IN(…) | 不在一个列表 |
注意列表和范围得区别
注意 我们的SQL关键字如 SELECT、WHERE、AND、OR都是大写的,但SQL其实是兼容写成select、where小写的。***大写这些关键字***有助于我们把关键字和你的表名,列名区分开,让SQL更容易理解。
条件查询(pt.2)
如果属性是字符串,我们会用到一些字符串相关的操作符号,其中LIKE(模糊查询)和%(通配符)
操作符 | 解释 | example |
---|
= | 完全相等 | col_name=“abc” | != | 不等于 | col_name!=“abcd” | LIKE | 没有通配符等价于 = | col_name LIKE ‘‘abc’’ | NOT LIKE | 没有通配符等价于 != | col_name NOT LIKE “abcd” | % | 代表0个以上的字符 | “%AT%” 代表AT前后可以有任意字符 | _ | 和%相似,代表1个字符 | “AT_” 代表AT后可以有一个字符 |
注意
在字符串表达式中的字符串需要用引号 " 包含,如果不用引号,SQL会认为是一个属性列的名字,如:col_name = color 表示 col_name和color两个属性一样的行 col_name = “color” 表示 col_name 属性为字符串 "color"的行.
查询结果Filtering过滤和sorting排序
-
DISTINCT: 你可以用 DISTINCT 关键字来指定某个或某些属性列唯一返回,因为 DISTINCT 语法会直接删除重复的行。 -
GROUP BY:返回唯一得到行,不过可以对具有相同的属性值的行做一些统计计算。 -
ASC/DESC: ORDER BY column ASC/DESC 这句话的意思就是让结果按照 col_name 列的具体值做 ASC升序 或 DESC 降序。
通过limit选取部分结果
LIMIT 和 OFFSET 子句通常和ORDER BY 语句一起使用,当我们对整个结果集排序之后,我们可以 LIMIT 来指定只返回多少行结果 ,用 OFFSET 来指定从哪一行开始返回。你可以想象一下从一条长绳子剪下一小段的过程,我们通过 OFFSET 指定从哪里开始剪,用 LIMIT 指定剪下多少长度。(从哪里开始剪不包括那里)
列出按上映年份最新上线的4部电影 ;
SELECT * FROM movies ORDER BY year DESC LIMIT 4;
使用JOINS进行多表联合查询
数据库范式
数据库范式是数据表设计的规范,在范式规范下,数据库里每个表存储的重复数据降到最少(这有助于数据的一致性维护),同时在数据库范式下,表和表之间不再有很强的数据耦合,可以独立的增长 (ie. 比如汽车引擎的增长和汽车的增长是完全独立的). 范式带来了很多好处,但随着数据表的分离,意味着我们要查询多个数据属性时,需要更复杂的SQL语句,也就是本节开始介绍的多表连接技术。这样SQL的性能也会面临更多的挑战,特别是当大数据量的表很多的情况下.
如果一个实体(比如Dog)的属性数据被分散到多个数据表中,我们就需要学习如何通过 JOIN 连表技术来整合这些数据并找到我们想要查询的数据项.
使用JOINS进行多表联合查询
-
主键 一般关系数据表中,都会有一个属性列设置为 主键(primary key) 。主键是唯一标识一条数据的,不会重复复(想象你的身份证号码)。一个最常见的主键就是auto-incrementing integer(自增ID,每写入一行数据ID+1, 当然字符串,hash值等只要是每条数据是唯一的也可以设为主键. 借助主键(primary key) (当然其他唯一性的属性也可以),我们可以把两个表中具有相同 主键ID的数据连接起来(因为一个ID可以简要的识别一条数据,所以连接之后还是表达的同一条数据)(你可以想象一个左右连线游戏)。具体我们用到 JOIN 关键字。我们先来学习 INNER JOIN . -
INNER JOIN : SELECT column, another_table_column, …
FROM mytable (主表)
** INNER JOIN another_table (要连接的表)
ON mytable.id = another_table.id (想象一下刚才讲的主键连接,两个相同的连成1条) **
WHERE condition(s)
ORDER BY column, … ASC/DESC
LIMIT num_limit OFFSET num_offset;
通过ON 条件描述的关联关系;INNER JOIN 先将两个表数据连接到一起. 两个表中如果通过ID互相找不到的数据将会舍弃。此时,你可以将连表后的数据看作两个表的合并,SQL中的其他语句会在这个合并基础上 继续执行(想一下和之前的单表操作就一样了). 还有一个理解INNER JOIN 的方式,就是把 INNER JOIN 想成两个集合的交集。(丢弃的数据如,A表中存在ID为98的数据,而B表中不存在ID为98的数据,则INNER JOIN会将ID为98的数据丢弃) -
外连接(OUTER JOINS):
INNER JOIN 只会保留两个表都存在的数据(还记得之前的交集吗),这看起来意味着一些数据的丢失,在某些场景下会有问题.真实世界中两个表存在差异很正常,所以我们需要更多的连表方式,也就是本节要介绍的左连接LEFT JOIN ,右连接RIGHT JOIN 和 全连接FULL JOIN . 这几个 连接方式都会保留不能匹配的行。
原理:在表A 连接 B, LEFT JOIN 保留A的所有行,不管有没有能匹配上B 反过来 RIGHT JOIN 则保留所有B里的行。最后FULL JOIN 不管有没有匹配上,同时保留A和B里的所有行。LEFT JOIN 和 RIGHT JOIN以及FULL JOIN都可以从字面上去理解,保留左表所有数据,保留右表所有数据,保留所有表的所有数据。
最后,给大家推荐一个sql的自学网站:http://xuesql.cn/ 上面有关于sql的学习文章以及相关练习题,是学习和复习sql一个很好的网站!
|