这周开始进入SQL的学习,才发现SQL原来是这么好玩的东西啊,也没有编程语言这么复杂。
看完基本资料一定要上手实践,最重要的经验就是不管记的多好,上手了总会有各种错误。
数据库基本概念
列:字段
行:记录
关系数据库必须以行为单位进行数据读写
关键字是指那些含义或使用方法已事先定义好的英语单词,存在包含“对表进行查询”或者“参考这个表”等各种意义的关键字。
P26:SQL分三类:DDL-处理数据表、DML-处理记录、DCL- 确认或者取消对数据库中的数据进行的变更及设置权限
SQL以”;” 为结尾,不区分大小写,但插入的 数据区分大小写
在 SQL 语句中直接书写的字符串、日期或者数字等称为常数
字符串、日期用单引号(')括起来,数字不用
SQL 的单词需使用半角空格或换行符来分隔
导入SQL文件前加一句:DROP TABLE IF EXISTS `blalalala`;
只能使用半角英文字母、数字、下划线(_)作为数据库、表和列的名称,且要英文开头,不能重名
P34:数据类型表示数据的种类,包括数字型、 字符型和日期型等。
P36:约束
实操时会忘记SQL语句的某些单词,有时会忘了需要选取指定SQL语句运行,有时乱加逗号,字符串忘了加单引号
设定汉语别名时需要使用双引号(")括起来。
1行注释: 书写在“--”之后,只能写在同一行
多行注释: 书写在“/*”和“*/”之间,可以跨多行
SQL语法
DDL
Create database DB;
Create table AAA (A CHAR(10) Not null, B Integer, C VARCHAR(128), Primary Key (A));
Drop table AAA;
Alter table AAA add/drop XXX;
INSERT INTO Product VALUES ('0001', 'T恤' ,'衣服', 1000, 500, '2009-09-20');
DML
编写顺序:SELECT → FROM → WHERE → GROUP BY → HAVING →ORDER BY (永远最后)
运行顺序:FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY
Select A, B, C From AAA;
Select * From AAA;
Select A as a1 From AAA; --设定汉语别名时需要使用双引号(")括起来
Select ‘A1’ as …, A, B, C from AAA; --可以把常数A1在结果中显示出来
Select Distinct A From AAA; --删除重复项,DISTINCT只能用在第一个列名之前
Select … from … where … ; --where后面加查询条件,=, <> (不等于), <=, >=, <, >, 也可以where not …, 来查询非…的数据
可在select时加算术运算符+ - * /
包含 NULL 的计算,结果肯定是 NULL
字符串搜索时,是把字符串按照字典排序后列出搜索的字符串前/后的数据
Null不能用比较查询,要用Is null / not null
And-并且,Or-或者,AND优先于OR,想要优先执行OR时可以使用括号把某段语句同时处理
P81 聚合函数
Count/sum/avg/… (Distinct …),聚合函数中用distinct可以删除重复值
P91 Group By
WHERE不能写聚合函数,要用HAVING。WHERE子句用来指定数据行的条件, HAVING子句用来指定分组的条件
有GROUP BY时,SELECT不能有多余的列
SELECT因为在最后运行,所以如果用了as, 在Group By里无法识别该别名
Order by … ,列名后可加ASC (升序) / DESC (降序), 不过升序可以省略。它可以使用不包含在select里的列
INSERT INTO <表名> (列1, 列2, 列3, ……) VALUES (值1, 值2, 值3, ……);
Insert into BBB (A, B, C, D)
Select A, SUM(B), AVG(C), D
Where …
From AAA
Group by …;
DELETE From AAA Where <条件> ;
Update AAA
Set 列名 = 新记录
Where <条件> ;
UPDATE Product
SET (A, B,C) = (a1, b1,c1) 或
SET A = a1, B = b1, C = c1
WHERE <条件> ;
事务:
Start transaction;
<操作语句>;
Commit / Rollback;
Part 5 视图:
CREATE VIEW 视图名称(<视图列名1>, <视图列名2>, ……)
AS
<SELECT语句>
视图尽量不要引用其他视图,且不能用order by
DROP VIEW 视图名称(<视图列名1>, <视图列名2>, ……)
子查询 – 视图中select的嵌套
标量子查询,只返回单一值的查询,可用于=, <>这类条件语句中,尤其是用于where等语句中代替常数
关联子查询,标量子查询基础上加一段where语句,实现分类的查询
各类函数:
类似于Excel,输入参数,得到返回值
算术函数(用来进行数值计算的函数)
字符串函数(用来进行字符串操作的函数)
日期函数(用来进行日期操作的函数)
转换函数(用来转换数据类型和值的函数)
聚合函数(用来进行数据聚合的函数)
算术函数
NUMBERIC (全体位数 , 小数位数) 指定数值的大小
ABS(数值) ——绝对值
MOD(被除数,除数) ——求余
ROUND(对象数值,保留小数的位数) ——四舍五入
字符串函数
字符串1||字符串2 ——拼接
MySQL的拼接是:Concat (字符串1,字符串2,…….)
LENGTH(字符串) ——算字符串长度
UPPER / LOWER (字符串) ——大小写转换
REPLACE(对象字符串,替换前的字符串,替换后的字符串) ——字符串的替换
SUBSTRING(对象字符串 FROM 截取的起始位置 FOR 截取的字符数)——字符串的截取(PostgreSQL/MySQL专用语法)
日期函数
CURRENT_DATE ——当前日期(因为没参数,所以无需括号)
CURRENT_TIME ——当前时间
CURRENT_TIMESTAMP ——当前日期和时间
EXTRACT(日期元素 FROM 日期) ——截取日期元素(年月日等,返回数值)
转换函数
CAST(转换前的值 AS 想要转换的数据类型) ——类型转换
COALESCE(数据1,数据2,数据3……) ——将NULL转换为其他值
谓词就是返回值为真值的函数(TRUE/ FALSE/ UNKNOWN)
Like函数,查找一致字符串,用%区分,前方一致/中间一致/后方一致
BETWEEN值1 AND 值2 ——范围查询(会包括临界值)
>值1 AND <值2 ——范围查询(不包括临界值)
IS NULL、 IS NOT NULL ——判断是否为NULL
IN / Not IN (对象1,对象2,….) ——OR的简便用法,可搭配子查询
EXIST / NOT EXIST
CASE WHEN <求值表达式> THEN <表达式>
WHEN <求值表达式> THEN <表达式>
WHEN <求值表达式> THEN <表达式>
ELSE <表达式>
END
(最后才加)As …..
集合运算:
1.作为运算对象的记录的列数必须相同
2.作为运算对象的记录中列的类型必须一致
3.可以使用任何SELECT语句,但ORDER BY子句只能在最后使用一次
UNION ——表的加法(并集)
SELECT a,b
FROM 表1
UNION
SELECT a,b
FROM 表2
UNION ALL ——保留重复行
INTERSECT ——选取公共部分(交集) ——MYSQL无法使用
EXCEPT ——表的减法, a-b,则a写前面b写后面——MYSQL无法使用
联结(JOIN),将其他表中的列添加过来,进行“添加列”的运算
内联结——INNER JOIN
SELECT SP.ID SP.A, SP.B, P.C, P.D
FROM 表1 AS SP INNER JOIN表2 AS P ①
ON SP.ID = P.ID;
外联结——OUTER JOIN
可以选出仅在一张表中存在的信息
需要用Left、Right来指定主表
3+表的时候,要在前一个的On后再做OUTER JOIN,以此类推
SELECT SP.ID SP.A, SP.B, P.C, P.D
FROM 表2 AS P LEFT OUTER JOIN 表1 AS SP
ON SP.product_id = P.product_id;
交叉联结——CROSS JOIN
对两张表中的全部记录进行交叉组合,因此结果中的记录数通常是两张表中行数的乘积,一般无用
SQLZOO:
学完基本的,还是要上手做,SQLZOO就挺不错的
做的时候我更喜欢直接删除给出的例子再做,这样不会被限制,而且也能更好锻炼对SQL语句的调用能力,毕竟现实中用的时候不会有人提醒你这时候该用什么语法,都是要自己想出来的。
以下是实操时候发现的问题:
Exclusive OR (XOR),多选一
As的别名如果多字段需要加单引号
有与EXCEL共通的Left,Right函数,用于取左/右起的N个字符
名字里有’的那些,要把’替换为两个’
经常在SQL语句中,子查询里忘了加入From Table
ALL函数,搭配大于小于,a > ALL b,大于所有b的a
做完所有题最大的感触就是自己逻辑不够清晰,往往答案三四行就能解决的问题我要花8-9行,在逻辑上绕了几个弯。这也是因为对语法不熟悉所致,很多地方题目用的语法一行顶我写的5,6行,所以回头看看语法书,互相补充着才是最好的。