MySQL数据库-SQL学习

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程序连接数据库,这个部分已经熟悉,所以不再学习。

原文地址:https://www.cnblogs.com/songmu/p/10832411.html

时间: 2024-10-09 01:23:41

MySQL数据库-SQL学习的相关文章

MYSQL数据库基础学习笔记

一.mysql的安装与初始化: 安装mysql命令: yum install -y mysql-server mysql mysql-devel 初始化: service mysqld start   //第一次启动mysqld服务会自动初始化: 创建用户并初始化密码: mysqladmin -u root passwd '密码' 登陆mysql: mysql -u root -p 退出mysql: quit.exit 设置mysqld服务自启动: chkconfig mysqld on mys

MySQL数据库开发学习教程

MySQL数据库开发学习教程 一.数据库设计 数据库设计(一)--数据库设计http://blog.51cto.com/9291927/2087925 二.MySQL数据库开发基础教程 MySQL数据库开发基础教程目录如下: MySQL数据库基础(一)--MySQL数据库简介http://blog.51cto.com/9291927/2087947MySQL数据库基础(二)--MySQL字符集与乱码解析http://blog.51cto.com/9291927/2088254MySQL数据库基础

linux下mysql数据库的学习

转载博客:http://freedomljtt.blog.163.com/blog/static/72294949201210145441701/ ubuntu12.04 卸载和安装mysql 卸载mysql 第一步 1 sudo apt-get autoremove --purge mysql-server-5.0 2 sudo apt-get remove mysql-server 3 sudo apt-get autoremove mysql-server 4 sudo apt-get r

mysql数据库sql语句调优 、

mysql数据库sql语句调优 . 索引设计原则: 索引列一般为where子句中的列或连接字句中的列 尽量不对基数小的列做索引,如性别列 尽可能使用短索引:如果对字符列索引尽量指定最小长度. (short Keys are better,Integer best) create index cityname on city(city(10)); 复合索引前缀特性,索引的顺序很重要. key(a,b,c)联合索引: 可以走索引的组合:key(a),key(a,b ),key(a,b,c) 下列索引

mysql数据库存储过程学习

1.建立存储过程方式一: mysql中存储过程属于函数一栏中,点击新建函数会有让你选择是存储过程还是函数 接下来是存储过程中设置的参数: IN 输入参数:表示该参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值 OUT 输出参数:该值可在存储过程内部被改变,并可返回 INOUT 输入输出参数:调用时指定,并且可被改变和返回 接下来就在BEGIN和END中填写需要的sql语句,和平时使用的相同 保存后存储在函数下,执行时可以直接运行,查看结果. 注:当没有参数或者只有

Mysql 数据库基础 学习笔记

数据库基础 数据库是存储数据的仓库,实现数据共享,减少数据冗余,采用特定的数据类型,具有较高的数据独立性,具有数据控制功能. 表 ,是一个二维数组,用来存储数据和操作数据的逻辑结构. 数据类型,整数数据类型,浮点数数据类型,精确小数类型,二进制数据类型,日期/时间数据类型,字符串数据类型. 主键 用于唯一标示表中的每条记录.可以定义一列或多了主键.主键不能相同. 数据库技术构成   硬件,软件共同构成 数据库系统,数据库,数据库管理系统(DBMS),数据库应用程序. SQL 语言  结构化查询语

使用MySQL数据库 SQL语句

1.查看当前服务器数据库中有哪些库? SHOW   DATABASES;   ###查看有哪些库 2.查看当前使用的库有哪些表? USE +要查询的库名 SHOW   TABLES; ###查询库中有哪些表 3.查看标的结构? USE  +要使用的库名 DESCRIBE  +表名 ###查看表结构 4.创建新的库? CREATE   DATABASE +表名  ###创建库 5.创建新的表 CREATE   TABLE +表名 (字段1名称   类型 ,字段2名称   类型,...)  ###创

mysql数据库字符集学习总结

MYSQL数据库字符集包括字符集(CHARACTER)和校对规则(COLLATION)两个概念. MYSQL 支持的字符集和校对规则可以通过命令showcharacter set;查看. 和字符集有关的变量 mysql> show VARIABLES  like 'character_set%';+--------------------------+-------------------------------------------+| Variable_name            | 

navicat导入mysql数据库sql时报错

错误详情:[Err] [Imp] 2006 - MySQL server has gone away 当时的心情真是...无以言表.冷静下来网上查了一下,果然很多前辈都遇到过这些问题. 错误原因是因为mysql数据库默认的接收数据包的大小是4M,我导入的sql有20多M,所以出错了. 找到服务器上的MYSQL安装目录下的my.ini文件 查找max_allowed_packet属性 max_allowed_packet=50M 改大点就好了,哈哈,虚惊一场啊.