SQL的学习要点

目录

SQL

常用函数 

六个聚合函数

 字符串函数

五个日期函数 

三个条件判断函数

单表查询 

多表查询  

增删改查——数据库

增删改查——表结构 

增删改查——表内容


参考文章:

SQL

  • SQL是一种综合性语言,用来控制并与数据库管理系统进行交互作用
  • MySQL 是一种关系型数据库管理系统 RDBMS(Relational Database Management System)
  • MySQL 使用标准的 SQL 数据语言形式

代码规范:

  • SQL语句不区分大小写,但建议关键字大写、数据列和表名小写 

基础概念:

  • 关系型数据库,是指建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。
  • 数据库: 数据库是一些关联表的集合。
  • 数据表: 表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格。
  • 列: 一列(数据元素) 包含了相同类型的数据, 例如邮政编码的数据。
  • 行:一行(=元组,或记录)是一组相关的数据,例如一条用户订阅的数据。
  • 冗余:存储两倍数据,冗余降低了性能,但提高了数据的安全性。
  • 主键:主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。
  • 外键:外键用于关联两个表。
  • 复合键:复合键(组合键)将多个列作为一个索引键,一般用于复合索引。
  • 索引:使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录。
  • 参照完整性: 参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。

语法: 

1、注释符号:

  • -- 两个横杠加一个空格,注释单行
  • /*注释多行*/
条件判断符说明
=相等
<>, !=不相等
<小于
<=小于或等于
>大于
>=大于或等于
BETWEEN位于两值之间

常用函数 

常用函数:

  • 数学函数
  • 集合函数
  • 字符串函数
  • 日期和时间函数
  • 条件判断函数
  • 系统信息函数
  • 加密函数
  • 其他函数

六个聚合函数

集合函数解释
AVG()返回某列的平均值 
COUNT(*)返回表中的总行数
COUNT(字段名)返回指定列的总行数
MAX()

返回某列的最大值

(数值、字符、字符串)

MIN()返回某列的最小值
SUN()返回某列值的和
  • 聚合函数无法嵌套,括号里不能是语句
  • 聚合函数可以把空值转成 null 输出
  • HAVING后面可以接聚合函数,WHERE后面不可以
  • AVG(条件)相当于SUM(IF(条件,1,0))/COUNT(全体)
    • 如:avg(a.event_date is not null) = sum(if(a.event_date is not null, 1, 0))/count(*)
  • AVG()函数指定返回数据的小数位数:ROUND()

    • SELECT ROUND(AVG(amount), 2) FROM sales;

      这将返回"amount"列的平均值,并将结果四舍五入到小数点后两位。

 字符串函数

字符串函数解释
CHAR_LENGTH(str)返回字符串的长度
CONCAT(s1,s2...)

拼接字符串

(有任一参数为NULL,返回NULL)

CONCAT(x,s1,s2...)

把分隔符x放在要拼接的字符串之间

(有分隔符时,可忽视参数中出现的NULL)

ELT(n,s1,s2,s3...)

返回第n个字符串

若无符合,则返回NULL

FIELD(s,s1,s2...sn)

返回s在列表s1,s2...sn中第一次出现的位置

(s1的位置为1)

FIND_IN_SET(s1,s2)返回字符串s1在字符串列表s2中出现的位置
INSERT(s1,x,len,s2)

截取len长度的s2的子串替换s1下标从x开始的部分,

最终返回替换后的s1

LOWER(str)或LCASE(str)把字符串里的字符全部转成小写
LENGTH(str)返回字符串包含的字符个数
LEFT(s,n)返回字符串s最左边的n个字符
LPAD(s1,len,s2)

填充字符串。

要返回的s1长度必须是len,

不够长就用s2从s1左边开始补,

超长就截断s1右边多余的部分

LTRIM(s)删除字符串s左边的空格字符后返回s

LOCATE(s1,s2)

或POSITION(s1 IN s2)

或INSTR(s2,s1)

返回s1在s2中开始的位置
MAKE_SET(x,s1,s2...sn)把x换成二进制数,返回列表s1,s2...sn中与二进制数中1出现的位置相对应的字符串
RIGHT(s,n)返回字符串s最右边的n个字符
RPAD(s1,len,s2)

填充字符串。

要返回的s1长度必须是len,

不够长就用s2从s1右边开始补,

超长就截断s1右边多余的部分

RTRIM(s)删除字符串s右边的空格字符后返回s
REPEAT(s,n)返回一个由字符串s重复n次组成的字符串
REPLACE(s,s1,s2)用s2替代s中所有的s1
REVERSE(s)返回反转后的s
SPACE(n)返回一个由n个空格组成的字符串
STRCMP(s1,s2)

比较s1和s2的大小

相同:返回0

小于:返回-1

其他:返回1

SUBSTRING(s,n,len)    

或MID(s,n,len)

截取返回s中下标从n开始的len长度的子串(从1开始计算)

(n>0时,从左边开始;n<0,右边)

SUBSTRING_INDEX(s,delim,count)count为正数,代表从s左边取标识符delim出现第count次之前的子串;负数则从右边。
TRIM(s)删除字符串s左右两端的空格字符后返回s
TRIM(s1 FROM s)删除字符串s左右两端所有的子串s1
UPPER(str)或UCASE(str)把字符串里的字符全部转成大写

五个日期函数 

日期函数解释
GETDATE()返回当前日期和时间
DATEPART()返回日期/时间的单独部分
DATEADD()在日期中添加或减去指定的时间间隔
DATEDIFF()返回两个日期之间的时间
CONVERT()用不同的格式显示日期/时间

三个条件判断函数

条件判断函数解释
IF(expr,v1,v2)

如果表达式expr为TRUE

则返回值v1,否则返回值为v2

IFNULL(v1,v2)

如果v1不为NULL,则返回v1

否则返回v2

CASE

        expr

        WHEN v1 THEN r1

        ...

        [ELSE rn+1]

END

如果expr值等于某个vn,则返回

对应位置THEN后面的结果,

否则返回ELSE后面的rn+1

单表查询 

  • SELECT * FROM 表名;——查询所有字段
  • SELECT  列名 FROM 表名;——查询指定字段
  • SELECT 列名1,列名2,…… FROM 表名;——查询指定的多个字段 
  • SELECT 列名1,列名2,……
    
    FROM 表名
    
    WHERE 查询条件; 
    -- 查询指定记录
    • ……

      WHERE 字段值 IS NOT NULL;——字段值不为空

    • ……

      WHERE 字段值 IS NULL;——字段值为空

    • ……

      WHERE 条件1 AND 条件2;——查询同时满足条件1和条件2的结果 

    • ……

      WHERE 条件1 OR 条件2;——查询满足条件1或条件2的结果(AND先于OR)

  • SELECT id,name
    
    FROM fruits
    
    WHERE id IN (1,2);
    -- 查询id等于1或2的水果……(NOT IN:不满足条件)
  • SELECT id,name
    
    FROM fruits
    
    WHERE id BETWEEN 1 AND 4;
    -- 查询id在范围 [1,4] 内的水果id和name
  • SELECT id,name
    
    FROM fruits
    
    WHERE name LIKE 'b%';
    -- 查询name以b开头的水果
    • %b:以b结尾

    • %b%:包含字母b

    • a%b:以a开头,以b结尾

    • _ _ _ _b:以b结尾,且前面只有4个字符(‘_’间没有空格)

  • SELECT DISTINCT 字段名 FROM 表名;——去重查询 

  • SELECT id
    
    FROM fruits
    
    ORDER BY id;
    -- 查询id,并排序(默认升序)
    • 多列进行排序,用逗号隔开,优先级从左往右降低

    • ORDER BY id DESC;——降序(DESC只对一列有效,按需在列名后添加)

  • ……
    
    GROUP BY 字段 
    
    HAVING 条件表达式;
    -- 分组查询(G和H经常同用)
    • GROUP BY 可根据多字段的值进行分组,从左往右,层次递进,不断细分

    • 优先级:from>on>where>group by>having>order by>limit

      FROM:先知道数据从哪张表取

      WHERE:取哪些数据

      GROUP BY:对数据进行分组

      HAVING:对分组后的数据进行过滤

      ORDER BY:对过滤后的数据进行排序

      LIMIT:取结果的哪几行数据

  • GROUP_CONCAT(
        [DISTINCT] 要连接的字段 
        [Order BY ASC/DESC 排序字段] 
        [Separator '分隔符']
    )
    -- 把查询到的多个数据拼接在一起输出,用指定分隔符输出(默认为逗号,默认为升序)
    
  • SELECT id  COUNT(*) Total
    FROM fruits
    GROUP BY id WITH ROLLUP;
    -- 添加一列。在每行后面添加该组的总数
  • LIMIT [位置偏移量],行数

    • LIMIT 4,3;——从第5个记录开始,返回3行记录

    • LIMIT 3;——默认从第1个记录开始,返回3行记录

多表查询  

1、内连接查询:

        使用比较运算符进行表间某些列数据的比较操作,并列出这些表中与连接条件相匹配的数据行,组合成新的记录。

        在内连接查询中,只有满足条件的记录才能出现在结果关系中。

  • 自连接: SELECT FROM WHERE 或 ANSI
    • 指表与其自身进行连接
    • -- 法一:使用关键字"SELECT FROM WHERE"
      SELECT s.name
      FROM s,t
      WHERE s.classno=t.classno AND t.name="t1";
      
      -- 法二:采用ANSI连接语法形式
      SELECT s.name
      FROM s INNER JOIN t
      ON s.classno=t.classno AND t.name="t1";
    • 使用INNER JOIN语法能够确保不会忘记连接条件,而WHERE子句在某些时刻会影响查询的性能
    • INNER 关键字可以省略。如果不指定连接类型,默认情况下会使用内连接
  • 等值连接: =
    • 在关键字ON后的匹配条件中通过等于关系运算符(=)来实现等值条件
    • -- 法一:使用关键字"SELECT FROM WHERE"
      SELECT s.name,t.name
      FROM  s,t
      WHERE s.classno=t.classno;
      
      -- 法二:采用ANSI连接语法形式
      SELECT s.name,t.cname
      FROM s INNER JOIN t ON s.classno=t.classno;
  • 不等连接: >, >=, <, <=, != 等
    • 指在关键字ON后的匹配条件中除了等于关系运算符来实现不等条件外,还可以使用包含>, >=, <, <=, != 等关系运算符。
    • -- 法一:使用关键字"SELECT FROM WHERE"
      SELECT s.name,t.name
      FROM  s,t
      WHERE s.classno!=t.classno AND s.id>t.id;
      
      -- 法二:采用ANSI连接语法形式
      SELECT s.name,t.name
      FROM s INNER JOIN t ON s.classno!=t.classno AND s.id>t.id;

2、外连接查询:

        外连接查询会返回所操作的表中至少一个表的所有数据记录。

        与内连接相比,多了某些不满足比较条件的数据

  • 左外连接:LEFT JOIN 
    • 返回包括左表中的所有记录和右表中连接字段相等的记录
    • 左连接全名又称为左外连接, left join = left outer join
    • SELECT field
          FROM tablename1 LEFT [OUTER] JOIN tablename2
              ON CONDITION
  • 右外连接:RIGHT JOIN
    • 返回包括右表中的所有记录和左表中连接字段相等的记录
    • SELECT 字段名
          FROM tablename1 RIGHT [OUTER] JOIN tablename2
              ON condition
  • 全外连接:FULL JOIN
    • SELECT 字段名
          FROM tablename1 FULL [OUTER] JOIN tablename2
              ON condition

3、复合条件连接查询:INNER JOIN

        通过添加过滤条件限制查询的结果,使查询的结果更加准确

  • SELECT s.name
        FROM s INNER JOIN t
            ON s.id=t.id AND s.id=1001;
         

4、合并查询数据记录

  • 利用UNION关键字,可以给出多条SELECT语句,并将它们的结果组合成单个结果集。
  • 合并时,两个表对应的列数和数据类型必须相同。
  • 各个SELECT语句之间使用UNION或UNION ALL关键字分隔。
  • UNION不使用关键字ALL,执行的时候删除重复的记录,所有返回的行都是唯一的。
  • 使用关键字ALL的作用是不删除重复行也不对结果进行自动排序。(尽量不用ALL)
  • SELECT column,...
        FROM table1
    UNION [ALL]
    SELECT column,...
        FROM table2

5、子查询

        指一个查询语句嵌套在另一个查询语句内部的查询。

  • ALL
SELECT num1 
    FROM s
        WHERE s>ALL
            (
                SELECT num2 FROM t;
            )
-- 返回s表中比t表的num2列所有值都大的值
    
  • EXISTS
    • NOT EXISTS与EXISTS使用方法相同,返回结果相反
    • SELECT *
          FROM s
              WHERE nums>4 AND EXISTS(SELECT name FROM t WHERE id=9);
      -- t表中是否存在id=9的数据,如果存在,就查询s表中的nums>4的记录
  • IN

    • NOT IN 与IN使用方法相同,返回结果相反

    • SELECT c_id 
          FROM orders 
              WHERE o_num IN(SELECT o_num FROM orderitems WHERE f_id='c0');
      -- 在orderitems表中,查询f_id为c0的订单号,并根据订单号查询具有订单号的客户c_id
  • 比较运算符
    • >, >=, <, <=, !=等比较运算符

6、交叉连接查询 CROSS JOIN(笛卡尔积)

增删改查——数据库

  • 增:create
  • 删:drop
  • 改:alter
  • 查:show

增删改查——表结构 

  • 增:create
  • 删:drop
  • 改:alter
    • 改表名:rename
    • 改字段名:change
    • 改字段数据类型:modify
    • 改字段排列位置:modify
    • 增加字段:ADD
    • 删除字段:DROP
  • 查:desc

增删改查——表内容

  • 增:insert
  • 删:delete
  • 改:update
  • 查:select 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

戏拈秃笔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值