SQL的学习笔记

SQL 对大小写不敏感:SELECT 与 select 是相同的。
SQL 使用单引号来环绕文本值(大部分数据库系统也接受双引号)。
SQL 语句后面加分号
某些数据库系统要求在每条 SQL 语句的末端使用分号。
分号是在数据库系统中分隔每条 SQL 语句的标准方法,这样就可以在对服务器的相同请求中执行一条以上的 SQL 语句。
一些最重要的 SQL 命令
1、SELECT - 从数据库中提取数据
SELECT 语句用于从数据库中选取数据。
结果被存储在一个结果表中,称为结果集。
SQL SELECT 语法

1SELECT column_name,column_name 2FROM table_name; 3 4

在表中,一个列可能会包含多个重复值,有时您也许希望仅仅列出不同(distinct)的值。
DISTINCT 关键词用于返回唯一不同的值。
DISTINCT支持单列、多列的去重方式。
单列去重的方式简明易懂,即相同值只保留1个。
多列的去重则是根据指定的去重的列信息来进行,即只有所有指定的列信息都相同,才会被认为是重复的信息。

1SELECT DISTINCT country FROM Websites; 2 3

WHERE 子句用于提取那些满足指定标准的记录。
WHERE 子句中特殊条件
1.空值判断: is null
2.between and (在 之间的值)
BETWEEN 操作符用于选取介于两个值之间的数据范围内的值。
不在 范围内的网站,请使用 NOT BETWEEN:
下面的 SQL 语句选取 alexa 介于 1 和 20 之间的所有网站:

1SELECT * FROM Websites 2WHERE alexa BETWEEN 1 AND 20; 3 4

BETWEEN也可以对字符进行操作
下面的 SQL 语句选取 name 以介于 ‘A’ 和 ‘H’ 之间字母开始的所有网站:

1SELECT * FROM Websites 2WHERE name BETWEEN 'A' AND 'H'; 3 4

BETWEEN也可以对日期进行操作

请注意,在不同的数据库中,BETWEEN 操作符会产生不同的结果!

3.IN 操作符允许您在 WHERE 子句中规定多个值。
下面的 SQL 语句选取 sal 为 “Google” 或 “菜鸟教程” 的所有网站:

1SELECT * FROM Websites 2WHERE name IN ('Google','菜鸟教程'); 3 4

4.like
LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式。
Like模糊查询

1Select * from emp where ename like 'M%'; 2 3

查询 EMP 表中 Ename 列中有 M 的值,M 为要查询内容中的模糊信息。

% 表示多个字值,_ 下划线表示一个字符;
M% : 为能配符,正则表达式,表示的意思为模糊查询信息为 M 开头的。
%M% : 表示查询包含M的所有内容。
%M_ : 表示查询以M在倒数第二位的所有内容。
通过使用 NOT 关键字,您可以选取不匹配模式的记录。

1 SELECT * FROM Websites 2WHERE name NOT LIKE '%oo%'; 3 4

5、REGEXP 用正则表达式
MySQL 中使用 REGEXP 或 NOT REGEXP 运算符 (或 RLIKE 和 NOT RLIKE) 来操作正则表达式。

下面的 SQL 语句选取 name 以 A 到 H 字母开头的网站:

1SELECT * FROM Websites 2WHERE name REGEXP '^[A-H]'; 3 4

6、
不带比较运算符的 WHERE 子句:
WHERE 子句并不一定带比较运算符,当不带运算符时,会执行一个隐式转换。当 0 时转化为 false,1 转化为 true。
SQL AND & OR 运算符
AND & OR 运算符用于基于一个以上的条件对记录进行过滤。

1SELECT * FROM Websites 2WHERE alexa > 15 3AND (country='CN' OR country='USA'); 4 5

ORDER BY 关键字用于对结果集按照一个列或者多个列进行排序。
ORDER BY 关键字默认按照升序对记录进行排序。如果需要按照降序对记录进行排序,您可以使用 DESC 关键字。

LIMIT关键字用于限制查询结果的条数
语法
LIMIT[位置偏移量,]行数
偏移量索引值从0开始,即第一条记录位置偏移量是0,第二条记录的位置偏移量是1

SQL 别名
通过使用 AS关键字,可以为表名称或列名称指定别名。
表的别名实例:下面的 SQL 语句选取 “菜鸟教程” 的所访问记录。我们使用 “Websites” 和 “access_log” 表,并分别为它们指定表别名 “w” 和 “a”(通过使用别名让 SQL 更简短)

1SELECT w.name, w.url, a.count, a.date 2FROM Websites AS w, access_log AS a 3WHERE a.site_id=w.id and w.name="菜鸟教程"; 4 5

在下面的情况下,使用别名很有用:
在查询中涉及超过一个表
在查询中使用了函数
列名称很长或者可读性差
需要把两个列或者多个列结合在一起

一对多联系查询(查询订单及订间商品)

1select * from (select * from order_info where order_info.buyer_id="1481909746" limit 0,6)t1 left join order_goods on t1.order_id= order_goods.order_id //t1是用户订单查询结果的别名注意括号加直接跟别名不用as 2 3

SQL JOIN 子句用于把来自两个或多个表的行结合起来,基于这些表之间的共同字段。
下图展示了 LEFT JOIN、RIGHT JOIN、INNER JOIN、OUTER JOIN 相关的 7 种用法。
在这里插入图片描述
SQL UNION 操作符合并两个或多个 SELECT 语句的结果。
请注意,UNION 内部的每个 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每个 SELECT 语句中的列的顺序必须相同。

GROUP BY 语句
GROUP BY 语句用于结合聚合函数,根据一个或多个列对结果集进行分组。
去重是用DISTINCT还是GROUP BY ,DISTINCT简单来说就是用来去重的,而GROUP BY的设计目的则是用来聚合统计的,两者在能够实现的功能上有些相同之处,但应该仔细区分,因为用错场景的话,效率相差可以倍计。
单纯的去重操作使用distinct,速度是快于group by的。
下面代码对site_id字段进行聚合并统计同一site_id的conunt的值和。

1SELECT site_id, SUM(access_log.count) AS nums 2FROM access_log GROUP BY site_id; 3 4

聚合

HAVING 子句
在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与聚合函数一起使用。

HAVING 子句可以让我们筛选分组后的各组数据。

数据类型参考 菜鸟

SQL 函数
SQL Aggregate 函数计算从列中取得的值,返回一个单一的值。
有用的 Aggregate 函数:
AVG() - 返回平均值
COUNT() - 返回行数
FIRST() - 返回第一个记录的值
LAST() - 返回最后一个记录的值
MAX() - 返回最大值
MIN() - 返回最小值
SUM() - 返回总和

SQL Scalar 函数基于输入值,返回一个单一的值。
有用的 Scalar 函数:
UCASE() - 将某个字段转换为大写
LCASE() - 将某个字段转换为小写
MID() - 从某个文本字段提取字符,MySql 中使用
SubString(字段,1,end) - 从某个文本字段提取字符
LEN() - 返回某个文本字段的长度
ROUND() - 对某个数值字段进行指定小数位数的四舍五入
NOW() - 返回当前的系统日期和时间
FORMAT() - 格式化某个字段的显示方式

mysql字符串函数 :具体参见菜鸟教程
LOCATE(substr,str,[pos]) 或POSITION(substr IN str)
str中第一个出现子 字符串 substr的位置,pos参数可选表示从字符串的第几个字符开始搜。如果子串 substr 在 str 中不存在,返回值为 0

1mysql> SELECT LOCATE('bar', 'foobarbar'); 2 -> 4 3mysql> SELECT LOCATE('xbar', 'foobar'); 4 -> 0 5mysql> SELECT LOCATE('bar', 'foobarbar', 5); 6 -> 7 7 8

concat_ws函数
CONCAT_WS(x, s1,s2…sn) 合并多个字符串每个字符串直接要加上 x,x 可以是分隔符

UPDATE - 更新数据库中的数据
DELETE - 从数据库中删除数据
INSERT INTO - 向数据库中插入新数据
CREATE DATABASE - 创建新数据库
ALTER DATABASE - 修改数据库
CREATE TABLE - 创建新表
ALTER TABLE - 变更(改变)数据库表
DROP TABLE - 删除表
CREATE INDEX - 创建索引(搜索键)
DROP INDEX - 删除索引

SELECT INTO 语句从一个表复制数据,然后把数据插入到另一个新表中
INSERT INTO SELECT 语句从一个表复制数据,然后把数据插入到一个已存在的表中。
CREATE DATABASE 语句用于创建数据库。
CREATE TABLE 语句用于创建数据库中的表。表由行和列组成,每个表都必须有个表名。
SQL 约束(Constraints)用于规定表中的数据规则。
如果存在违反约束的数据行为,行为会被约束终止。
约束可以在创建表时规定(通过 CREATE TABLE 语句),或者在表创建之后规定(通过 ALTER TABLE 语句)。

索引
您可以在表中创建索引,以便更加快速高效地查询数据。
用户无法看到索引,它们只能被用来加速搜索/查询。
注释:更新一个包含索引的表需要比更新一个没有索引的表花费更多的时间,这是由于索引本身也需要更新。因此,理想的做法是仅仅在常常被搜索的列(以及表)上面创建索引。

参考菜鸟教程 http://www.runoob.com/mysql/mysql-functions.html

代码交流 2021