SQL知识点梳理总结(基于Mysql)

RDBMS:关系型数据库管理系统

包括sql server, IBM DB2, Oracle, MySQL以及Microsoft Access

RDBMS 存储在表中,表由行和列组成


新建 CREATE

约束:

NOT NULL不为空值/

UNIQUE每行的值唯一/

PRIMARY KEY 唯一标识,主键/

DEFAULT默认值/

CHECK值符合某种条件/

FOREIGN KEY保证一个表中的数据匹配另一个表中的值的参照完整性。


新建数据库:CREATE DATABASE 数据库名;

新建表:

新建有数据的表:CREATETABEL新表名 AS SELECT 列名 FROM 旧表名;

新建无数据的表:CREATE TABEL 新表名(列名 数据类型 约束,.......);

新建含有外键的表: CREATE TABLE 表名 (列名1 数据类型束,........FOREIGN KEY(列名) REFERENCES 表名2(列名2) ) (注意:FOREGN KEY中的列名是创建的表中的,而REFERENCES中的是已经存在的表的列名,两者相互对应

创建含有DEFAULT约束的表: 

CREATE TABLE 表名 (列名1 数据类型 约束,............,列名n 数据类型 DEFAULT ‘某字符’/DEFAULT GETDATE( )

新建AUTO_INCREMENT约束的表:  CREATE TABLE 表名(列名1 NOT NULL AUTO_INCREMENT, 列名2........);(注意:只能在新增表时增加这个约束,无法用ALTER TABLE 新增)

查询语句 SELECT...FROM...

全部列: SELECT * FROM 表名;

部分列:SELECT 列名1,列名2....FROM 表名;

查列中不重复的的结果:SELECT DSITINCT 列名1,列名2....FROM 表名;

查询某种数值并且只显示前几项:SELECT 列名 FROM 表名 LIMIT 数字;——若显示前2行 limit2,显示第二行limit1,1   (注意:在sql server中语法不同: SELECT TOP n PERCENT 列名 FROM 表名;)

查某(多)列并且给它另外起个名

另外起个名:SELECT 列名 AS 别名 FROM  表名

另外起个名:SELECT 列名 FROM 表名 AS 别名

查出多列组合在一起并另起名: SELECT CONCAT(列名1,‘分隔符’,列名2,‘分隔符’,列名3) AS 别名 FROM 表名;


查出一个表的结果导入另一个新表:(注意:Mysql不支持)

新建表为表1内容:SELECT 列名/*INTO 表2 FROM 表1;

新建表为空表:SELECT 列名/* INTO 表2 FROM 表1WHERE 1=0;

SELECT INTO 与INSERT INTO SELECT区别:

前者的into的新表不存在,后者存在,后者是复制数据,前者/CREATE 表名 AS SELECT 要复制结构和数据

查询符合某种条件的某列 SELECT...FROM...WHERE

SELECT 列名1,列名2....FROM 表名 WHERE 列1/列2/列N = 条件;

where子句中运算符=/<>/>=/<=/>/BETWEEN...AND..../LIKE/IN/AND/OR/NOT/NULL(不管什么条件均可否定)

子句1

SELECT 列名1....FROM 表名

WHERE 列名... IN (数值/文本1,数值/文本1,数值/文本1);(注意:IN 相当于在where子句中用OR连接)

子句2:一般包含两个范围的数值,即>= + <=

SELECT 列名1....FROM 表名

WHERE 列名... BETWEEN 数值/文本1 AND 数值/文本2;(注意:BEWTEEN子句中即可为数值,也可为文本)

子句3

SELECT 列名1....FROM 表名

WHERE 列名... LIKE '%m'/'%m%'/'m%'/'%m_'/;

 (分别表示以m结尾/含有m/以m开头/倒数第二个数为m/三个字符且中间为m:‘_m_’/如果要找中间有_符号的:用\转义:‘m\_%’)

子句4

SELECT 列名1....FROM 表名

WHERE 列名1 = 条件1 AND/OR 列名2 = 条件2;

子句5

SELECT 列名1....FROM 表名

WHERE 列名1 = 条件1 AND(列名2 = 条件2 OR列名3 = 条件3);

子句6

SELECT 列名1....FROM 表名

WHERE NOT 列名1 = 条件1/列名 NOT LIKE 'm%';

子句7:正则表达式

SELECT 列名1....FROM 表名

WHERE列名 REGEXP'^[^GFs]';(REGEXP/ NOT REGEXP 表示正则表达式,本句指所有不以G/F/s开头的信息——注意:前面用了NOT,后面就用‘^[字符]’,前面不用NOT,后面用‘^[^字符]’,两者均表不含某字母开头)

子句8: 某列为空值       

SELECT 列名1....FROM 表名  WHERE 列名1 IS NULL;

通配符

 %-0或多个字符 _-一个字符

[若干字符]——含有括号里的任意单一字符

[!若干字符]/[^若干字符]——不在括号里的任意单一字符

查询了再排序 SELECT...FROM.....ORDER BY

单列:SELECT 列名1,列名2...FROM 表名 GROUP BY 某列名 (ASC可省)/DESC

多列:SELECT 列名1,列名2...FROM 表名 GROUP BY 列名1,列名2,列名3 DESC.... (注意:写在前面的列名优先排序,且后面没有后缀的是升序,列名3是降序)

插入语句 INSERT INTO 

插入全部列的记录:INSERT INTO 表名 VALUES (数值1,数值2,数值3,....)

插入部分列的记录:INSERT INTO 表名(列名2, 列名3...) VALUES (列2的数值,列3数值....)注意:对于序号ID这种唯一标识,即使没有插入数值,也能够自动更新

插入表但复制其他表的内容INSERT INTO 表名 SELECT * FROM 表名2 (WHERE .....) 

更新语句 UPDATE TABLE.... SET....

更新语句: UPDATE表名 SET 列名1 = 更改后的值1,列名2 = 更改后的值2.... WHERE 列名 = 条件,.....;(注意:一定要用WHERE限定条件,否则会把所有记录的列全部替换)

删除语句 DELETE FROM/DROP/TRUNCATE......

删除某一行数据:DELETE FROM 表名 WHERE 列名 = 值....;(注意:一定要用WHERE限定条件,否则删错数据)

删除表中所有数据:DELETE (*) FROM 表名;(注意:删除所有数据,仅留下表头各字段)

删除整个表:DROP 表名;(注意:drop是删除整个表,连表名都不剩,而delete from只是删除表的数据,即使数据删完了也会留下表名)

删除表的内容但留下定义/结构TRUNCATE 表名;(找不到这个表名和它的内容,但它的定义和结构,包括某列的数据类型等信息还在)

更改语句 ALTER

写完了表要改变某列约束和数据类型  ALTER TABLE 表名 MODIFY COLUMN 列名 数据类型(新) 约束(新);

增加含有DEFAULT约束:ALTER TABLE 表名 ALTER 列名 SET DEFAULT '某字符'/GETDATE()

删除DEFAULT约束:ALTER TABLE 表名 ALTER 列名 DROP DEFAULT

写完了表要增加某种约束

增加的约束只有一列:ALTER TABLE 表名 ADD UNIQUE/PRIMARY KEY(列名)/CHECK(列名+条件)

增加的约束有多列并且要命名:ALTER TABLE 表名 ADD CONSTRAINT 约束名 UNIQUE/PRIMARY KEY/CHECK(列名1+条件1 AND 列名2+条件2...)

删除约束: ALTER TABLE 表名 DROP INDEX UNIQUE(列名,列名)/DROP CHECK 约束名/DROP FOREIGN KEY 约束名;(注意:在SQLserver中,将INDEX 改为CONSTRAINT,适合UNIQUE约束,而PRIMARY KEY/FOREIGN KEY直接删除即可,无需加INDEX )

增加列:ALTER TABLE 表名 ADD 列名 数据类型

删除列:ALTER TABLE 表名 DROP COLUMN 列名

更改AUTO_INCREMENT的原始值: ALTER TABLE 表名 AUTO_INCREMENT= 新的原始值;(注意:默认从1开始增加,没增加一条记录,自动递增)


表的连接 各种JOIN

不使用JOIN的连接:SELECT a.列名1, a.列名2,b.列名3...FROM 表名1 AS a, 表名2 AS bWHERE a.某列 = b.对于的列;(注意:相当于JOIN 没有主次关系时的另一种写法)

最简单连接INNER JOIN: SELECT a.列名1, a.列名2,...b.列名3,.... FROM 表名1 AS a INNER JOIN 表名2 AS bON a.列名x = b.列名y(b表中对应的列)

WHERE 表1.列1 = 表2.列2 与 ON 的区别:

用在INNER JOIN 里面没区别,结果同

用在LEFT/RIGHT JOIN on永远返回左边/右边结果,WHERE 条件不为真就过滤掉 

只保留左边表的全部,右边表对应有就有,无就无LEFT JOIN :                                                                                                                  SELECT a.列名1, a.列名2,...b.列名3,.... FROM 表名1 AS a LEFT JOIN 表名2 AS bONa.列名x = b.列名y(b表中对应的列) 

 (注意:只要A中有的该行的东西都要显示,哪怕对应的B表中没有对应值)

只保留右边表的全部,左边表对应有就有,无就无RIGHT JOIN : SELECT a.列名1, a.列名2,...b.列名3,....     FROM 表名1 AS a LEFT JOIN 表名2 AS bON a.列名x = b.列名y(b表中对应的列)  

 (注意:只要B中有的该行的东西都要显示,哪怕对应的A表中没有对应值)

左右边都要的连接FULL OUTER JOIN:SELECT a.列名1, a.列名2,...b.列名3,....   FROM 表名1 AS aFULL OUTER JOIN 表名2 AS b ON a.列名x = b.列名y(b表中对应的列)  

 (注意:可惜MySQL中并不支持)


合并多个查询语句UNION

SELECT 列名1 FROM 表名1 UNION /UNION ALLSELECT 列名2 FROM 表名2(注意:两个表列数相同,对应顺序相同,数据类型相同才可union)

UNION与UNION ALL:如果有重复值,前者显示重复值,后者显示

带有where的union all: SELECT 列名1 FROM 表名1WHERE 列名= 条件UNION /UNION ALLSELECT 列名2 FROM 表名2WHERE 列名= 条件 (注意:即使两个表的条件语句相同,也要写两遍,否则只限定了后一个select语句)

索引 INDEX

索引:在不读取整个表的情况下快速查找数据

创建普通索引: CREATE INDEX 索引名 ON 表名(列名)

创建唯一索引:CREATE UNIQUE INDEX 索引名 ON 表名(列名)(注意:索引可以有多个列名也可有单个列名)

创建含有多列的索引:CREATE INDEX 索引名 ON 表名(列名1,列名2....)

删除索引:ALTER TABLE 表名 DROP INDEX 索引名;


视图 VIEW

创建视图:CREATE VIEW 视图名  ASSELECT 列名 FROM 表名 WHERE 条件;

使用视图查询:SELECT * FROM 视图名(WHERE 条件);(注意:可以使用WHERE对查找的视图中数据进一步过滤)

删除视图:DROP VIEW 视图名;

更新视图CREATE/REPLACE VIEW 视图名   AS SELECT 列名...FROM 表名 (WHERE 条件);


函数

日期函数

NOW()——现在的日期和时间

CURDATE()——当前的日期 CURTIME()——当前时间

DATE()——日期或日期/时间的日期部分

EXTRACT()——单独提取日期/时间某部分

DATE_ADD()——向日期添加时间间隔

DATE_SUB() ——从日期减去制定时间间隔

DATEDIFF()——两个日期之间的天数

WEEK(日期,第几天为一周开始)——这一天是这一年的第几周,第二个参数从0到7,分别表示将星期天/星期一....作为一周的第一天

DATE_FORMAT(时间,格式如'%Y-%M-%D')——用不同格式显示日期/时间:                                                                                SELECT DATE_FORMAT(NOW(), '%Y-%M-%D') FROM 表名;

NULL函数

NULL无法计算,要将其作为0计算,则使用函数IFNULL/COALESCE(列名,0)——若该列为null,则计算为0(注意:sqlserver中使用 ISNULL(列名,0))

常用函数

Aggregate函数

MAX()/MIN():SELECT MAX/MIN(列名)FROM 表名;

AVG()

SUM():SELECT SUM(列名)FROM 表名;(注意:仅能在select语句中使用,其他语句使用要用子查询,先把要求的平均值查出来作为子查询)

COUNT(): 

计算某列数目  SELECT COUNT(列名/*) FROM 表名;(注意:不含NULL)

计算不重复数目:SELECT COUNT(DISTINCT列名) FROM 表名;(注意:先把重复值删掉在计算数目)

将某列分类,计算各类的数目: SELECT 列名1, COUNT(*) FROM表名GROUP BY 列名1;

FIRST()/LAST()——返回第一个值或最后一个(注意:仅accessS数据库支持,MySQL要用LIMIT结合 ORDER BY,如last就是逆序ORDER BY该列后LIMIT)

Scalar函数

UCASE()——字段转化为大写(注意:在sql中是用upper)

LCASE()——字段转化为小写

MID(列名,开始提取字符位置,结束提取字符位置)——提取字符 Substr(字段,1,end)——提取字符(注意:MYSQL使用MID,其他使用substr)

LEN()/LENGTH()——返回文本字段长度(注意:MYsql中使用LENGTH)

ROUND(数字,小数点后位数)——对字段进行小数位数四舍五入(注意:不仅可以为正,也可以未负表示往前省略多少位,若不写后面位数,默认四舍五入为整数)

NOW()——返回当前时间+日期

FORMART()——格式化某个字段显示方式

EXISTS运算符

SELECT 列名 FROM 表名    WHERE EXISTS(SELECT 列名 FROM 表名 WHERE 条件) (注意:相当于逻辑函数,返回TRUE/FALSE)

窗口函数

RANK()—— 跳跃排序,若有两个相同,假设排序1的有两个,则排序为1,1,3,4

DENSE_RANK()——连续排序,若有两个相同,假设排序1的有两个,则排序为1,1,2,3

ROW_NUMBER()——不管怎么排都不会重复,即使有相同的,排序也不同,1,2,3,4

用法:SELECT .........RANK()(或者三者中的一个)  OVER ( PARTITION BY 列名 ORDER BY 列名) .......FROM 表名

注:PARTITION BY的列名用于根据这列分组,ORDER BY 的列名为排序列名,结果不会像group by 那样改变行数,你原来有多少行,排序后还是多少行,只是会多一列排序

你可能感兴趣的:(SQL知识点梳理总结(基于Mysql))