1.引言

  在开始sql学习之前,其实我之前有系统性的学习过数据库的知识,大概是在2年前。去年整整一年的时间从事的工作与数据库没有什么关联,现在重新开始一份开发工作,数据库学习是必要的技能,于是又来重头学习一下,就算"温故而知新"吧。

  注:本次学习的资料来自于《SQL基础教程》第二版,正文主要是对本书学习的记录,常见的或自己非常熟悉的知识就不在本文列出了。

2.基础篇

  第0章

    主要讨论的是讨论的是如何搭建SQL学习环境,这个可以在网上搜索一大片的教程,搜索关键字“MySQL安装”、“MySQL常见客户端”,我这里是使用的Navicat,也是现在常用的工具之一。

  第1章

    SQL语句极其种类

      DDL数据定义语言,主要用来创建和删除数据库或者表,常用关键字:CREATE,DORP,ALTER,其特点为一旦执行就不能撤销,事务中对于DDL语句也无法撤回。DML数据操作语言,主要用来查询和变更表中内容,常见的增删改查。DCL数据控制语言,用来确认用户对数据的变更,如提交事务,回滚事务,对用户进行赋权操作等。

    表中数据类型的指定

      数字integer,字符char和varchar,日期date。char与varchar的区别,char(4),如存储'ab',则表中实际存储的为'ab',不足4的则用空格进行占位,varchar(4),如存储'ab',则表中实际存储为'ab'。

    第一章需要掌握的sql语句

      数据库创建:

        DROP DATABASE IF EXISTS 数据库名;

        CREATE DATABASE 数据库名 DEFAULT CHARACTER SET utf8;

      表创建:

        CREATE TABLE user (
           id int(11) NOT NULL AUTO_INCREMENT,
           name varchar(255) DEFAULT NULL,
           password varchar(255) DEFAULT NULL,
           PRIMARY KEY (id)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 

  第二章

    对字符串使用不等号时的注意事项
    select * from chars where char>'2' 如果表中的数据为1,11,2,3,32。得到的结果为2,3,32因为排序使用的规则和数字不同,类似于按姓氏进行排序,1和1开头的所有字符比2和2开头的都要小。
    对于NULL值不能使用=NULL,需要使用 IS NULL ,如果需要取反,则使用IS NOT NULL

  第三章

     count进行统计时,如果使用count(*) 统计所有行数,如果count(列),该列中含有null值时,会进行排除。有以下一表
    
key value
 1  1
 2  null
 
    count(*)结果为2,count(value),结果为1
    distinct用于去重复,可以用在列明前,表示去除表中该列的重复值,如果想要统计表中一列的不重复值,则需要将distinct用在count(distinct 列),distinct可用在聚合函数中,avg ,max,min,count,sum等。
    group by 用于分组,需要注意的点有4个。
      A点:select 子句中只能写3中元素,(1) 常数(也就是123,字符串等)(2) 聚合函数(count,distinct,avg,sum,min,max等)(3) group by 指定的列名。
        正对3说明:select name,price,count(1) from product group by price。对价格进行分组,并进行统计相同价格的商品数量。如果在列中写了group by之外的列名name,那么现在有2个商品价格相同的物品,牙刷10元,牙膏10元,那么name列是显示牙刷呢还是显示牙膏呢??
      B点:不能使用列的别名,因为sql的执行顺序为from→where→group by→having→select→order by,列别名是在select中取的,当执行到group by时还没有读取到select中取的别名,因此也就识别不到列别名了。
      C点:group by 无法进行排序
      D点:where子句中不能使用聚合函数,聚合函数可以使用在select,having,order by。
    where 只能对行内特定的值进行筛选,对组进行筛选需要使用having,having能够使用的元素同group by A点一致。
    在having和where中都能够使用的条件,最好放在where中,我的理解是按照sql的执行顺序来执行的话,先在where这里把数据进行筛选后,使数据减少有利于提升后续group by和having的性能。
    order by 列 esc|desc,进行排序,一般写在sql语句的最后,可以同时制定多个列进行排序。对于NULL的排序一般出现在开头或者结尾。order by可以使用聚合函数。

  第四章

     增删改查,其中新增时可以从别的表中直接拷贝选取的列,需要注意的是新表列的属性需要与旧表一致,在拷贝旧表时也可以使用select where 对数据进行筛选。

     事务:这里这是简单的提了事务的特性,即ACID,开始事务start transaction,提交事务commit,回滚事务rallback,注意DDL语句无法进行回滚。

  第五章

    视图,把一组需要经常使用的select语句可以保存为视图,这样每次访问时使用视图名即可,不需要重新书写sql语句。

    子查询,将用来定义视图的select语句直接用于from子句中。sql此时的执行顺序为优先执行子查询中的语句。

    标量子查询:必须只能返回一条结果,能够用于的地方有select,group by,having,order by。

    关联子查询,用A表关联A表进行查询,还需要学习

  第六章

    算术函数:+-*/,ABS()绝对值,MOD(被除数,除数)取余,ROUND(对象数值,保留的小数点)

    字符串函数:concat(str1,str2,..)拼接,LENGTH(str)字符串长度,LOWER(str)小写,REPLACE(原字符,被替换字符,替换内容),SUBSTRING(str FROM 起始位置 FOR 截取的个数),UPPER大写转换

    日期函数:CURRENT_DATE当前日期,CURRENT_TIME当前时间,CURRENT_TIMESTAMP当前日期和时间,EXTRACT(元素日期 FROM 日期)截取日期

    转换函数:CAST(转换当前的值 AS 转换后的值类型)

    谓词:LIKE,模糊查询 '%a' '%a%' 'a%',列 between a  and b,IS NULL 为空,IS NOT NULL不为空,IN 为OR的简单用法。EXISTS?还需要学习

    CASE:CASE  WHEN 当满足条件 THEN 以什么结果进行显示  ELSE 其他情况时进行显示 END,需要进一步学习

  第七章

    两表并集, A UNION B,将两表进行合并且去重复。需要注意的事项:两表的列数与类型必须一致,ORDER BY 需要放在最后使用一次。 UNION ALL 两表合并不去重,效率比UNION要高,因为少了一步去重。

    联结:

      内联结:select * from a inner join b on a.id=b.id,其中on为两表之间关联的键,也就是将两表联结条件。

      外联结:

        左外联结:select * from a left join b on a.id=b.id

        右外联结:select * from a right join b on a.id=b.id

        on的含义和内联结一致,不同之处在于会以join前的表为主表,查询除了两表共有的结果外还会把主表中剩余的部分也进行显示。

  其余章节

    第8章的主窗口函数与GROUPING运算符MySql不支持,本次主要是学习MySQL所以并没有进行深入学习。第九章主要讲述的是如何使用JAVA程序连接数据库,这个部分已经熟悉,所以不再学习。

03-17 02:31