SQL可以说是程序员、数据库管理员DBA、数据分析师等需要做数据处理和分析岗位最常用的程序语言了。
尤其是一些岗位,工作中并非以数据库为核心,只是偶尔用些数据不需要深度学习,不得不自己去做一些取数的事情,只要学会通过SQL取数就能扫清职场的绊脚石了。
个人认为,提出这个问题的朋友 ,其实所欠缺的并不是学习SQL的知识或资料,而缺的是学习方法和信心。这里,无意推荐任何SQL参考书,任何学习材料下载,主要是分享一点学习SQL的方向和心得。
SQL被称为结构化查询语言,英文Structured Query Language的缩写,无需多说。
在进一步解读之前,先搞清楚SQL的读音,要不然容易贻笑大方。SQL可以分开读这三个字母S - Q - L ,也可以连起来读: /ˈsiːkwəl/ ,同sequel单词的读音。
SQL也是一种编程语言,只不过是一种与数据库打交道的数据库语言,它拥有一套独特的操作命令集。只不过,SQL是一种面向集合的语言,每个命令的操作对象都是一个或多个表,结果也是一个表。
为了可以在不同数据库上执行命令集,SQL有一个放之四海而皆准的国际标准。1986年10月,美国ANSI采用SQL作为关系数据库管理系统的标准语言(ANSI X3. 135-1986),后被国际标准化组织(ISO)采纳为国际标准。1992年,ISO又更新一版标准SQL-92,又称SQL2。1999年,ANSI也更新了一版新标准SQL-99,又称SQL3。后期,SQL标准仍然更新,但是基本是遵照这个框架修修补补。
SQL具体是干什么的呢?简单举例说明一下。
工作中,非技术人员经常要求技术帮忙取个数,技术会根据需求做数据查询,然后才能把查询结果导出来;有时候,又需要在表里加一个字段(例如电话号码等)用来调整数据表的结构,也可以叫数据库程序设计。
不过,大量SQL操作都是用于数据的增删改查。用一个大家比较熟悉的场景打个比方,SQL操作就像在百度做一次搜索行为,先输入关键字再点击“百度一下”开始搜索。百度后台数据库就会根据需求匹配一个模糊搜索结果展现给用户。当大家发现结果太多,无法精准找到结果时,就需要再增加搜索条件。
当然,SQL语言不仅可以直接面对数据库操作,还可以嵌入到其他语言中执行。例如,SQL可以作为一种嵌入式语言,嵌入到高级语言(例如C、COBOL、FORTRAN、PL/1)程序中,供开发者使用。这种需求一般都是程序员使用的较多,非技术人员了解一下就可以了。
上一段内容主要想告诉初学者,SQL是一种可以通过标准命令集来操作数据库的语言。
既然,我们需要通过一套命令集对数据库进行操作,进一步我们需要了解操作对象——数据库的体系结构。
1、数据库(database):存放数据的容器,一个数据库由一个或一组数据表组成。
2、数据表(table):存放数据的二维表格,一个数据表由一组数据记录组成。
(1)列(column):数据表中的一个字段,一个数据表由一个或多个列组成。
(2)行(row):数据表中的一个记录。
这里,SQL数据表可以分为三种类型:基本表、视图和导出表。不同人叫法不同,但是含义相同,基本表是实际存储在数据库中的表,视图是由若干基本表或视图构成的表的定义,而导出表是执行了查询时产生的表。
初学者还应该清楚一张数据表里所包含的这些关键信息:主键、外键、约束、索引和DLL等,搞清楚它们才算是把数据表的五脏六腑看得清清楚楚。
说了这么多数据表的关键信息,进一步,数据表中填入的数据类型也要搞搞清楚。什么是数据类型?它指的是当我们在数据库里创建一个表时,用于存储什么样的数据,它是一个标签,能在任意一列、变量或者表达式中区别出不同的数据类型。在实际开发过程中,选择合适的数据类型,可以提高数据库性能。
常用的数据类型主要包括字符串型、时间日期型、数值型等三大类,其中每一大类中还有细分,请初学者务必记牢。当然在不一样的数据库文件中,同一种数据类型很可能有不一样的叫法。
假如,一张员工加班信息表中各字段的数字类型,姓名为“张三”,加班日期是“2月21日”,加班时长是“100”分钟,其中姓名为字符串型,日期是时间日期型,时长是数值型。
了解操作数据库那些可操作的对象之后,前面算是把SQL设计的理论知识基本交代清楚了。下面是SQL具体涉及的命令集。
首先看一下,SQL语言的分类:
1、数据定义语言(DDL)
数据定义语言(Data Definition Language,DDL)是 SQL 语言集中负责数据结构定义与数据库对象定义的语言。
DDL主要功能是定义数据库对象,核心指令是 Create、Alter、Drop。
2、数据操纵语言(DML)
数据操纵语言(Data Manipulation Language, DML)是用于数据库操作,对数据库其中的对象和数据运行访问工作的编程语句。
DML 主要功能是访问数据,因此其语法都是以读写数据库为主,核心指令是 Insert、Update、Delete、Select。这四个指令合称 CRUD(Create, Read, Update, Delete),即增删改查。
3、事务控制语言(TCL)
事务控制语言 (Transaction Control Language, TCL) 用于管理数据库中的事务。
TCL主要用于管理由 DML 语句所做的更改,还允许将语句分组为逻辑事务,核心指令是 Commit、Rollback。
4、数据控制语言(DCL)
数据控制语言 (Data Control Language, DCL) 是一种可对数据访问权进行控制的指令,它可以控制特定用户账户对数据表、查看表、预存程序、用户自定义函数等数据库对象的控制权。
DCL以控制用户的访问权限为主,因此其指令作法并不复杂,可利用 DCL 控制的权限有:Connect、Select、Insert、Update、Delete、Execute、Usage、References。
DCL 的核心指令是 Grant、Revoke。
举例说明SQL语句的句法:
选择:select * from table1 where
插入:insert into table1(field1,field2) values(value1,value2)
删除:delete from table1 where
更新:update table1 set field1=value1 where
对于初学者来说,熟悉这些常用的SQL命令集,没有捷径可走,只能通过大量实操加深理解和记忆。
熟悉以上这些,初学者算是把SQL的基础知识大部分都掌握了,勤奋练习应该可以完成日常简单的取数需求了。
但是,更高阶的SQL语句仍然需要不断优化。同样一个需求,高手写的SQL语句只扫描了2万行数据,但是初学者写的需要扫描20万行,甚至数据量大到直接把系统卡死了。这一定不是最优的SQL语句。
所谓的SQL优化,就是指将一条SQL写的更加简洁,让SQL的执行速度更快,易读性与维护性更好。可见,SQL优化是属于那种没有最好,只有更好的持续追求。
一个高效的SQL语句抵得上千军万马,这话虽然有点夸张,但是也充分说明了SQL优化的重要价值。随着企业业务量逐渐增多,需求复杂度增大,SQL的执行效率对程序的运行效率的影响逐渐增大。
企业内部会做评估,相对于改造代码,优化SQL语句哪个成本最低。显然,大部分情况下SQL优化是常态化的要求。举个简单的例子,假如某个接口出现了性能问题,需要做优化,你会优先考虑改造源代码,还是先试试优化SQL语句。
初学者还是需要记牢一些常见的SQL优化策略。
例如,避免使用Select *:实际业务场景中不需要所有的字段,尽量精确选择需要的字段;用union all 代替union:因为union会排重,排重过程需要遍历,排序,比较,更消耗CPPU资源;控制索引数量:索引不是越多越好,索引需要额外的存储空间,B+树保存索引,额外的性能消耗。
网上有很多牛人分析的SQL优化的经验,大家可以定期去学习启用。
工欲善其事,必先利其器。
在初学者打算投入到SQL学习之前,先要选择更利于学习的辅助工具,其中两个事情最为重要:一个选择一款数据库,第二是选择一款适合的SQL工具。
1,选择一个最容易获取的数据库
数据库,其实说全程是数据库管理系统DBMS。目前比较常见并且企业用到多的主流关系数据库有:MySQL、PostgreSQL、Oracle、SQL Server等。
其中,以开源关系型数据库MySQL应用最为广泛,几乎适用所有规模的公司业务场景,而且也比较容易获取。
2,选择一个免费易用的SQL工具
在很多高手喜欢使用数据库自带的SQL命令行,理由是习惯了命令行,省去下载破解版或免费版的安装配置过程。但是,对于初学者来说,为了更方便直观地学习SQL,还是选一款免费又简单的图形化SQL工具。
这里为初学者推荐一款免费又好用的Web版SQL工具——SQL Studio。
(1)不需要安装配置JDK环境,支持一键启用;
(2)学习更直观更容易上手,操作更灵活更方便;
(3)支持多种数据库的查询、开发、管理等功能;
(4)支持团队在线协作开发和统一权限管理;
(5)支持任意浏览器运行,而且支持局域网和外网远程访问;
(6)数千万行数据的秒级导出以及数万张表的创建,而系统不会出现卡死或闪退的情况;
(7)支持主流数据源包括PostgreSQL、MySQL、SQLite、SQL Server、Oracle、达梦、人大金仓等;
(8)支持中英文两种语言,可以运行在Windows、MacOS、Linux等三种操作系统上。