美文网首页
SQL知识点梳理总结(基于Mysql)

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

作者: anti酱 | 来源:发表于2020-06-12 21:04 被阅读0次

    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)

          本文链接:https://www.haomeiwen.com/subject/dpopictx.html