从今天开始要每日产出东西啦,洗心革面重新做人。
    学习时长:0516-0523
    学习资料:SQL应知必会
    练习资料:SQLzoo  https://sqlzoo.net/wiki/SQL_Tutorial
——————————————————————————我是好好学习的分割线————————————————————————————————————————-
    SQL作为最常用的数据检索、数据存储、数据处理和管理软件,是基于C/S的数据库软件。
    现主要学习了SQL检索命令SELECT和相关的子语句的操作,思维导图如下:
    
具体内容见下:

一、查找类

1、简单操作:select可直接进行检验

(1)检索单列:

    select prod_name(列名)FROM product(表名);

(2)检索多列:

    select prod_name,prod_id(列名)FROM product(表名);

(3)检索所有列:

    select *(列名)FROM product(表名);

2、加强版操作

(4)检索只显示列中的不同值:

    SELCECT DISTINCT vend_id(列名)FROM product;

    注:distinct关键字应用于所有列而非部分,例如SELECT DISTINCT vend_id,prod_price,除非指定的两个列都不同,否则所有行都将被检索出来

(5)限制结果:限制行数——limit子句

    select prod_name(列名)FROM product(表名)

    LIMIT 5(行数);

    注:- limit 1,将检索出第二行而不是第一行;

    -当行数不够的时候,返回只有的行数;

    - limit 4 offset 3从行3开始取4行;

二、排序检索——SELECT+ORDER BY

(1)单列排序

    select prod_name(列名)

    FROM product(表名)

    ORDER BY prod_name(排序);

    注:使用非选择列进行排序也是可以的。

(2)多列排序

    select prod_name(列名)

    FROM product(表名)

    ORDER BY prod_name、prod_id(排序);

(3)指定排序方向:默认方向为升序,DESC降序

    ORDER BY prod_name DESC(降序排序);

    注:DESC只应用到直接前面的列名,所以想对多个列上进行降序排序,需要对每个列指定DESC关键字。

三、过滤数据SELECT+where

(1)单一条件操作符

    字符串形式的操作符需要加单引号:WHERE name= solar

    检查空值:WHERE price is NULL

 

 (2)组合操作符:AND和OR【AND优先级更高】

    -  AND:每增加一个条件就需要多使用一个AND

    WHERE vend_id=1003 and prod_name <> DES

    -  OR:检索任一条件

    WHERE vend_id=1003 and prod_name <> DES

    -组合:关键部分需要加括号

    WHER(E vend_id=1003 OR population!=1000 AND prod_name <> DES

    -  IN:条件范围,作用同OR

    WHERE vend_id IN(500,1000);——选取的是id为500和1000的记录

    -  NOT:条件范围,与IN联用取反集

    WHERE vend_id NOT IN(500,1000);——选取的是id非500和1000的记录

四、过滤数据SELECT+LIKE

1、百分号通配符

    SELECT prod_id,prod_name

    FROM products

    WHERE prod_id LIKE %se%;

    注:%可以匹配0个字符,但对于尾空格无法识别。

2、下划线_通配符:只匹配单个字符

    WHERE prod_id LIKE _se%;

3、通配符花费时间比较长尽量适当运用。

五、正则表达式进行搜索:REGEXP

1、REGEXP .XXXX——.匹配任意一个字符

SELECT prod_id,prod_name

FROM products

WHERE prod_id REGEXP .123;寻找id=x123的字符串

2、REGEXP xx|xx——OR匹配

SELECT prod_id,prod_name

FROM products

WHERE prod_id REGEXP 1123|3212;——寻找id=1123或3212的字符串

3、REGEXP [xx xx]xx——匹配字符串之一

SELECT prod_id,prod_name

FROM products

WHERE prod_name  REGEXP [123]TON——比or寻找多字段好用

4、REGEXP [x-x]xx——匹配范围

SELECT prod_id,prod_name

FROM products

WHERE prod_name  REGEXP [1-3]TON

5、REGEXP \\特殊字符——匹配特殊字符


6、匹配字符类

 

二、计算类

1、拼接:Concat,各个串之间用逗号分隔

    注:多数DBMS用+或||实现拼接,Concat是mysql专享的

2、使用别名:AS关键词链接

3、计算:可以通过加减乘除进行基础运算。

三、函数类

1、基本操作函数:

(1)SOUNDEX——将任何文本字串转化为字母数字模式的算法,找谐音

2、日期和时间处理函数——常见筛选手段

(1)注:DATE(order_date)=2005-09-01与WHERE order_date=2005-09-01的不同是:

WHERE order_date=2005-09-01默认筛选为2005-09-01 00:00:00的字段;——列值

而date是匹配2005-09-01的字段;——列
 

(2)查询某一月份的值:可以用Year()+Month()来进行定位


3、数值处理函数:在各大DBMS中均相同


4、汇总-聚集函数:SELCET可组合聚集函数


注:聚集函数不能直接出现在where子句中,必须与having子句或select子查询

(1)AVG函数


可用返回所有列的平均值,也可返回特定列或行的平均值

(2)Count()计数函数

对于符合特定条件的行数进行计数,有两种方式:

- COUNT(*):对于所有行进行计数

- COUNT(column):对于特定列中具有值的进行计数,忽略null

(3)Max()、Min()函数:需要指定列名

(4)SUM()求和函数:须指定列名

可以直接对指定列进行求和或者对于计算值进行求和

SUM(price*quantity) =>总订单数额

(5)DISTINCT筛选不同值:必须使用列名

只能使用count(distinct price)而非count(distinct)

Group by+count组合起来才能计算次数

四、分组数据:group by和having子语句

(1)group by必须在where之后,order by之前

(2)Having子语句≈where子语句,但是where过滤行,having过滤分组


 

(3)Select子句排序


五、连接表:join

(1)基本联接:一定不要忘记where子句,起到配对的作用

① 等值链接可以取多个链接进行


 

②INNER JOIN /OUTER JOIN均与ON联结


 

(2)高级链接

 表别名:简化SQL语句,允许SELECT单条语句多次使用相同表
 

注:表别名只适用于查询,不能返回客户机

 自联结:在一定程度上是子查询的更优选择


 

 自然联结:排除重复现象,每一列只返回一次

使用通配符SELECT *来进行明确联结

 外部联结:包含相关表中没有联结行的行

例如:列出所有产品及订购数量,包含那些没有订单的客户

包括左外部联结(LEFT OUTER JOIN)、右外部联结(RIGHT OUTER JOIN)


 带聚集函数的联结:比如说count()