学习背景
对于MySQL的学习也是刚刚开始,从有做数据分析的想法开始,最先学的就是python爬虫及数据处理,因为做分析自己要有数据可用,还要知道数据是怎么来的啊。而数据库基本就是企业的数据的仓库,如果做分析的话,所用的数据大都数需要从这数据库里面来,所以学习数据库就比较必要了。网上了解了一番之后,选择了MySQL作为学习对象,一方面用python操作MySQL的资料比较做,而且在企业应用也比较多(本来打算学之前存储爬虫数据的Mongodb的,但感觉用的企业不如MySQL多,就放弃了,作为第一门数数据库技能,先把MySQL学好,后面根据需要学其他的也应该是不太难)
学习目标
掌握数据库的基本操作,创建,删除,查询,更新,运算,异常值处理,数据导入导出
关于上面这些内容的学习,在MySQL中有两种操作方式,一种是通过shell指令控制,另外一种就是用MySQL Workbench这种图形化界面的操作。这两种操作方式都要过,但因为在图形化界面的操作相对简单,在这里记录的多是用shell指令的操作。
掌握这些基本操作之后,在工作中遇到就能快速上手,遇到问题再针对性学习。
对于学习的资料,我借了一本清华的书《MySQL5入门与提高》内容丰富,实操比较多,适合动手学习,就选它了.另外在网上也找了一个系列的教程,作为辅助学习。
计划时间每天3-4个小时,一周时间把基础过完,并做好学习记录,一方面加深学习映像,另外便于后面使用时直接查询。
数据库安装与初步使用
1.安装过程中踩了很多坑,找了很多资料,老是安装错误,鼓捣了几遍终于成功了,一把辛酸泪啊,还好平时被折腾地习惯了(微笑脸)
2.打开MySQL的shell控制台,输入密码就算是正式开始mysql正式之旅了!
3.查看当前数据库中所有的子数据库:show databases;选择进入某一个数据库:use world;【数据库名】出现database changed 就表示已经切换到当前数据库中了。
3.访问world数据库中的country数据表:select * from country;在数据库的table标签中就会出现country 数据表,可对该数据表进行查看和导出。同样可以用:show tables;查看当前数据库中有哪些数据表。
4.数据库的创建:用Wb(MySQL Workbench的简称)创建时比较方便,用指令创建则是:CREATE DATABASE IF NOT EXISTS bookmanages;检查 bookmanages 是否存在并进行创建。
5.查看某个数据库的详细信息:show create database bookmanages;由于这个数据库刚刚被创建,它还是空的内容,稍后我们加入内容。
6.删除数据库: drop database test_mysql;
数据表的操作
1.数据表的创建,Wb 创建数据表相对来说比控制台方便的多,这里就用Wb演示吧。在控制台中指令也差不多。在刚刚创建的数据库的tables右键单击create table
在最上面的部分中,table的名字为必填项,中间是表中包含的列。然后apply,出现下图,图中就是表的创建代码,确认无误后直接点击apply,则数据表创建完成。
2.查看数据表的结构,这里用查看刚刚创建的数据表:use bookmanages;desc book;
这就可以看见我们刚刚在wb中创建的book表,其中Field为字段名称,type为字段类型,NULL表示该字段是否可以存储NULL值(是否允许空值),Key表示该列是否已经编制索引,default表示是否有默认值,有的话为多少,extra 表示获取相关附加信息。
3.查看表的详细结构:use bookmanages; show create table book;这些在wb中就是点击鼠标的事,就不叙述了。
4.添加表数据,这里先用wb演示:
而想要用程序输入呢,用insert into指令,例如插入一行数据:use bookmanages; insert into book(sid,cat_book,num_book) values(6,"经济学",45);查看表数据:use bookmanages; select *from book;
5.修改表的名字:use bookmanages;alter table book rename books;
6.数据的更新,当我们的数据完成插入或在查询的过程中发现有错误数据时,就需要对错误数据进行更新。这里我们用update进行操作:update 表名 set 字段1=值1,字段2=值2 where 条件表达式。
数据表的查询
对于运用数据这样的一项工作来说,查询数据无疑是最为主要的,我们需要从企业的数据库中查询提取自己需要的数据,因此这一部分相对来说是最为重要的。(当然对于查询数据来说,最为方便的就是利用语句来进行查询,这里主要介绍在控制台下应用查询功能)
1.查询表中所有的字段:SELECT 字段1,字段2,......FROM table_nameh;或者我们在之前使用过的SELECT * FROM language;
2.查询指定字段:SELECT 字段1,字段2,......FROM table_nameh;(在这里指出需要查询的字段即可,与1中类似)
3.根据条件查询数据:SELECT 查询字段 FROM table_name WHERE 条件表达式;这里面的条件表达式可以是比较表达式,指定范围表达式,是否为空,匹配字符或其他多个查询条件等,下面简单演示一下;
3.1,通过比较查询
3.2通过BETWEEN ADN 对某个字段指定 某个范围进行查询;如果字段的值在指定的范围内,则满足查询条件,数据将会被查询出来;
3.3,通过and和or进行查询这两个连接词就相当于“与”“或”的意思,其中and表示必须满足连接的两端的条件,而or则是表示满足两端条件之一即可。
3.4,通过IN进行查询:IN可以判断某个字段的值是否在集合中:[NOT] IN (元素1,元素2......)
3.5,通过LIKE进行查询,like判断是否与指定的字符串相匹配,如果字段的值与指定的字符串相匹配,则满足查询条件,数据将会被查询出来。[NOT] LIKE '字符串',在这里的字符串可以是完全匹配,也可以是条件匹配,如a%b就表示满足以a开头b结尾的任意长度的字符串,而a_b则表示以a开头b结尾的三个字符
3.6空值查询:查询某个字段中是空值的数据:IS NULL;
4.分组查询:group by,单独使用时,分组后,只显示一个分组的一条记录。
在下面则是针对多个字段进行分组,首次根据Continent进行分组,当遇到Continent相同时,再根据Region进行排序。
利用group_concat将分组后的数据的归类到某一组中:
5.HAVING查询:满足HAVING指定的条件表达式时,结果被显示出来,否则排除不予显示。它和WHERE不同的是,where作用于表或视图,而HAVING作用与分组后的记录,用于选择满足条件的分组。
6.排序查询:ORDER BY 字段名 [ASC | DESC]这里面默认是从小到大排序,加上DESC之后就是从大到小排序。
7.LIMIT限制查询数量,不加条件时则是从第一条数据开始计算,也可从指定的位置开始计数
8.避免重复查询,当数据表中的字段没有添加唯一性或主键约束时,重复值就可能出现,这个时候我们就可以用distinct来消除重复数据。
9.查询集合函数:这里的集合查询函数主要有:计数COUNT(),均值AVG(),求和SUM(),最大值MAX(),最小值MIN()。
.10.子查询,有时候我们所需要的数据没有在一张表中,我们就需要子查询,子查询是讲一个查询语句嵌套在另一个查询语句中,内层的查询结果可以作为外层查询的条件:如SELECT title,description FROM film_text WHERE title=(SELECT title FROM film WHERE rental_rate=4.9);这样的一个查询语句就是在表film中筛选rental_rate=4.9的数据的title字段,然后将其传递给title作为在表film_text选择数据的标准。类似的还有IN查询。
exist查询,用exit查询时,内层的函数不返回查询的记录,而是返回一个真假值,当内层函数为真(True)时,外层查询语句进行查询,反之,外层语句则不进行查询。
ALL和ANY关键字查询,ALL表示满足所有的条件,ANY表示满足其中任意一个条件即可,这两个关键字通常与比较字符一起使用。
除了这些查询匹配方式之外,还有另外一种就是用正则表达式匹配数据,也是非常的强大,这个只需要记住它的关键字为REGEXP,配合匹配字符即可。
MySQL中的内部函数
对于数据库的应用来说,我们往往需要对数据进行统一化清洗,这个时候利用一些SQL的内部函数就显得非常方便了。
1.获取字符的长度,LENGTH(str)返回的长度单位是字节,CHAR_LENGT(str)返回的长度单位是字符。当字段为英文时,两者的返回结果都是一样的,当有中文出现的时候,两者的返回结果就不同了。一个汉字占三个字节,而一个字母或者数字只占一个字节。
2.合并多个字符串,这里有两种合并连接字符串的方式,一种是CONCAT(.....),一种是CONCAT_WS(x,str1,str2......),第二种可以一次性指定连接的方式,第一种可以给出个性化的连接方式:
3.截取指定位置的字符串:这里用SUBSTRING(str,pos,len)函数和MID(str,pos,len)函数,他们都是从指定的字符串str第pos个位置开始获取长度为len的字符串。
4.字母的大小写转换,为了得到标准化的数据,我们往往需要做字母的大小写进行转换,这里我们使用UPPER(str)转换为大写,用LOWER(str)转换成小写。
5.删除空格和指定字符,这一点在数据清洗的过程中用的还是非常多的。其中,LTRIM(str)是删除开始处的空格(左边),RTRIM(str)是用来删除结尾处的空格(右边),而要对左右的空格都进行删除的时候就用TROM()函数完成删除左右两边的空格(TRIM ( BOTH FROM 'str'))
6.替换字符串:INSERT(str,pos,len,newstr)它表示将字符串str中pos位置开始,长度为len的字符串用newstr进行替换,这里主要用于替换指定长度的字符串,而如果只想要替换字符串中的内容,则可以用REPLACE(str,from_str,to_str)进行,它表示在原始字符串str中,用to_str字符串替换str中的from_str字符串。
6.常见的时间,日期函数:日期curdate(),时间curtime(),当下时间NOW(),星期(英文)dayname(NOW()),(数字)dayofweek(NOW()),月份MONTH(NOW())
7.时间的计算,求相隔天数DATEDIFF(D1,D2),天数的加减,adddate(D,N),subdate(D,N),其中D为日期,N为天数。以及addtime(T,N),subtime(T,N),这里面N为秒数。
8.格式化时间和日期:DATE_FORMAT(D,F)其中D表示日期,F表示指定的显示格式,