SQL 的简介
1974年,IBM研究员发布了一篇揭开了数据库技术的论文《SEQUEL:一门机构化的英语查询语言》,直到新增这个查询语言也没有太大的变化。可以看出SQL语言的生命力之强。
无论是前端工程师,还是后端算法工程师,都需要和数据打交道,都需要快速精确的得到自己想要的数据,更不要说数据分析师了,他们的工作就是和数据打交道,所以可以看出数据库的对很多工程师来说是必备的一个技能。
SQL是使用关系模型的数据据应用语言,于数据直接打交道的,由于IMB上世纪70年底开发出来,之后又美国国家标准局(ANSI)开始着手制定了SQL标准,先后有SQL-86,SQL-89,SQL-92,SQL-99等标准,不过其中最重要的是SQL-92和SQL-99,分别代表92年和99年颁布的SQL标准。而我们今天还是遵守这些标准。
但是遵守这些标准,但是各自的数据库又有自己差异的一些用法,简单说就是大体相同,但是具体又有不同。比如mysql的sql和oracle的sql虽然格式很像,但又不是完全相同。
SQL分类
SQL语言在功能上主要分三大类:
-
DDL (Data Definition Languages 数据定义语言)
这些语句定义不同的数据库,表,视图和索引等数据库对象,还可以用来创建,删除,修改数据库和数据表的结构。这些语句主要包含关键字:
CREATE, DROP ALTER
等 -
DCL (Data Control Language 数据控制语言)
这些语句是用于定义数据库,表,字段,用户访问权限和安全级别的。其包含的关键字:
GRANGT REVOKE COMMIT ROLLBACK
等 -
DML (Data Manipulation Language 数据操作语言)
这些语句用于添加,删除,更新和查询的数据库记录,检查数据完整性。其包含的关机字:
INSERT DELETE UPDATE SELECT
等。而这是msyql基础聊的重点,也是从事编程必备的一个基础,毕竟数据库交互才是数据库存在的目的,当然DDL和DCL不是不重要,而是其是mysql数据库的表结构构建等高阶操作了,如果有需要我们再聊,毕竟现在主要聊基础,也就是用来操作数据。
当然三种分类,也不是唯一的标准,而是一个相对广泛的分类,比如还有很多人,因为查询语句很重要单独从DML中分离出一种DQL(数据查询语言),以及TCL( 事务控制语言)包含COMMIT,ROLLBACK.
SQL 规则和规范
基本规则
SQL
可以写在一行或者多行,不过为了提高可读性,各子句分行写,必要时使用缩进。- 每条命令以
;
或\G
或者\g
,不过一般的时候都是使用;
- 而关键字比如(INSERT 等)是不能分行的。
- 关于标点符号
- 必须宝成所有的
()
,单引号,双引号都是成对出现的。 - 必须使用英文状态下的半角输入方式
- 字符串和日期时间类型的数据需要使用单引号表示。
- 列的别名,尽量使用双引号包裹,而且不建议省略
as
。
- 必须宝成所有的
基本规范
规范不是规则,是一种建议,算是对规则的一种补充,可以遵守也可以不遵守。不过个人建议还是遵守,毕竟其也是一种让SQL语句变得更加整洁和明了。
-
首先说明一下MYSQL 在window和linux下对大小写是敏感是不一样的。
MYSQL 在windows上大小写是不敏感的,简单的说就是不会区分大小写,比如A和a代表字面意思是一样的。
MYSQL 在linux上大小写是敏感的,其是区分大小写的,但又不是全部都敏感:
- 数据库名,表名,表的别名,以及变量名都是严格区分大小写的。
- 关键字,函数名,字段名,和字段别名都是忽略大小写的。
-
因此有了同意的书写规范:
- 数据库名,表名,表的别名,字段名,字段别名等都用小写。
- SQL关键字,函数名,变量等都写大写。
注释
什么语言都有注释,不然有时候阅读语言的时候会很懵逼
单行注释: #注释文字 这个是MYSQL特有的一种方式
单行注释: -- 注释 这个请注意--后又空格
多行注释:/* 注释文字 */
命令规则
- 数据库,表名不得超过30个字符,变量名限制为29个
- 必须只能包含
A-Z,a-z,0-9,_
共63个字符。 - 数据库名,表名,字段名等对象中间不能包含空格
- 同一个mysql软件中,数据库不能同名,同一个数据库中表不能重名,同一个表中的字段不能重名。
- 自己创建的字段,不要和保留字,数据中系统或常用的方法名冲突,如果坚持使用,请在SQL语句中使用(`)引起来。这个不是单引号而是着重号,其实在键盘tap键上面的那个按键。
- 保持字段名和类型的一致性,就是关联两个表的时候,有相同的数据方便之间关联,那么其字段名和字段格式最好保持一直。
SQL 命令初体验
既然体验那么,自然需要一些数据,所以从搜索一个数据表。然后放入数据库中。
mysql 登录
对于数据库安装,网上资料很多,所以就不在聊。简单说一下登录,可以通过dos命令进来登录。
mysql -uroot -ppassword
但是为了安全,一般是输入:
mysql -uroot -p
然后在输入密码,这样密码就显示为****
或者是开始
—所有软件
—mysql
但是一般不会通过dos登录,而是通过一些第三放工具,而小猪用的是自己常用的一个管理工具SQLyog
因为数据库是8.0版本,所以需要高级版本的SQLyog
,如果自己找不到而有需要可以留言给我。
导入数据库
-
dos命令导入
mysql -uroot -p ****(密码) source sql文件路径如下:
- 查看导入的数据库
show databases;
这个数据库test,就是新导入的数据库。
然后看表的信息:
show tables;
然后看各个表的创建信息
SHOW CREATE TABLE 表名
后面的注释,说实话显示为乱码,这个后面再聊如何解决。
然后可以再看某个表的数据
不过我们更习惯用第三方工具导入数据,以及查看数据信息。
-
SQLyoy 导入数据
这个图形可视化,所以很简单的操作。
左侧空白处右键。
然后刷新一下,左侧就出现了test这个数据库。
而且直接用鼠标即可操作这个问题了。
甚至可以看表的里面的数据。
SELECT 体验
下一篇打算开始聊mysql数据库中的函数,所以本章我们需要先了解一下SELECT语句。
格式 SELECT …FORM …
SELECT 字段, 字段, ......
FROM 表名;
这个时候需要说一个特殊的表dual
,这个表本身没用什么数据,但是其可以作为一个测试表来使用,后面聊一些逻辑算法,以及函数的时候,会用到这个表,这个表被称之为伪表
。
比如:
SELECT 1+1
FROM dual;
-
*
这个再数据库中的作用,就算所有的属性,如下;
SELECT * FROM dept; -- 和 SELECT deptno,dname,loc FROM dept;
可见两者的效果一样,但是一般搜索一个表的时候,测试的时候方便会用到
*,但是在开发的时候哪怕麻烦也是写字段,第一可以修改返回属性顺序,第二就是数据搜索会更快,也就是性能更优。
别名(使用as)
还是老规矩,先说概念,然后看代码。
别名简单说就是重写命名,为什么要这样做,毕竟有些列是经过计算的,有些列命太长但会多次使用,当然表名也是可以有别名的。
所以可以看别名的作用:见面知其意,可以更方便的使用。
格式:
列名或者表名或运算的列 as “别名”
-- 当然 as也是可以省略的
列名或者表名或运算的列 “别名”
SELECT deptno AS "dno",dname "dn",1+1 AS "sum"
FROM dept;
这个例子就是为了演示,所以本身的别名可能无法体现我所说的优点。
其实别名不带双引号其实也行如下:
-- 如果后面跟的是英语自然可以不带双引号也可以
SELECT 1+1 su
FROM dual;
-- 但是别名直接如果有空格就需要了
SELECT 1+1 "s u"
FROM dual;
去重关键字 (DISTINCT)
这个是去重的一个关键字,具体体现如下:
SELECT deptno
FROM emp;
然后使用DISTINCT:
SELECT DISTINCT deptno
FROM emp;
可以看出去重了部门号,这个又有一个新问题,如果是多个字段呢?
SELECT ename,DISTINCT deptno
FROM emp;
-- 这样写不行,运行会报错
那如果反过来呢?
SELECT DISTINCT deptno,ename
FROM emp;
-- 不报错,但似乎又没用什么意义
因为数据库中员工名不会重复,而这个为了满足一一对应的关系,DISTINCT如果生效的话,那表的对应的两列就不一样多了。所以一般的时候单独一列的时候才会使用DISTINCT,如果多列就无法去重了吗?可以,但是会用到GROUP BY 这个后面聊。
空值(null)
在数据库中空值其长度虽然是0,不等于空字符串,和'' , 0 ,'null'
是不一样的.而且在MYSQL中,空值是占用空间的。所有的运算符或者列值遇见null值,运算的结果都为null。
如下体现
SELECT sal,sal*2,comm,comm*2
FROM emp;
着重符
这个前面说过了,因为某些字段会和MYSQL中的关键字一样,但是又想告诉MYSQL这个只是一个字段不是关键字。
如下:
SELECT sal,sal*2 SUM ,comm,comm*2 `sum`
FROM emp;
可见这样在SQLyog中一些关键字就不会变成大写了。也就是不会呈现关键字的提示了。
查询常量
常数就是数据没有的字段,但是直接进行赋值的数据,但是这个数据会直接匹配后面字段的数据数量,都会显示同一个值。如下:
SELECT 999,"小猪弟",sal
FROM emp;
显示表结构
这个用到了关键字DESCRIBE,这个关键字又可以简写DESC
。
可以显示表中字段的详细信息。
如下:
DESC emp;
--- 或者
DESCRIBE emp;
WHERE
如需有条件地从表中选取数据,可将 WHERE 子句添加到 SELECT 语句。
演示如下:
SELECT *
FROM emp
WHERE deptno='20';
-- 这个单引号如果上面这个例子不带也可以但是最好带上,毕竟如果是汉字或者又空格的时候不带单引号就会报错。
SELECT *
FROM emp
WHERE ename='smith';
这个可以看出MSYQL对大小写不敏感。比如条件ename='smith'
但是得到的数据员工数据可以是大写的SMITH
,也就是说无论是SMITh
或SmIth
等都会被这个条件查询到。
现在了解一写后,下篇就要聊运算符等用法。