以小白眼光观SQL世界(一)

Hello World!许久不见惭愧惭愧,自上次更新之后我去了一趟新疆(回来后写了一篇行知见闻游记,未发),回来直接公司也忙项目,所以一直都没有更新,但是学习是没有停止的,哈哈哈,都是借口,就是懒的。

-----------------------------------------------------

华丽分割线

经过我老师的推荐,SQL基础入门看这一本书就行了--图灵程序设计丛书《SQL基础教程》第二版(不是推销,自己看了确实也觉得挺适合基础入门的),我自己也是买了一本,下面开始丛书笔记和老师教的一些内容。

这本书使用的关系数据库管理系统(RDBMS):Oracle Datebase,SQL Service,DB2,postgreSQL(百度百科:它拼读为 "post-gress-Q-L,专门查了一下,不要读错了哦),MySQL,总共五种,书上主要是以postgreSQL为主的,我的电脑上就安装了MySQL,学校也只是教MySQL所以我的这篇文章主要是以MySQL为主。

以下这张图片是cmd命令行模式下我的MySQL信息

五种RDBMS之间基础差的好像不多,书上有的差异我会写出来,有的我就懒的写的,仅供参考。电脑编辑的,某些语句在手机端显示可能不是那么工整。

我先按照书上的一个表先建立一个库再建一个表,最后向表中插入数据,(#:是单行注释。mysql一句话以封号结束,再多的回车键也没有用。字符串或日期类型要用单引号(’)引起来,单引号和(`)号是不同的,(`)可以省略),下面这段代码可以略过,后面会有说明。

#创建数据库

CREATE DATABASE goods;

#显示已有的数据库

SHOW DATABASES;

#使用数据库

USE goods;

#如果存在products表则先删除

DROP TABLE IF EXISTS `products`;

#创建商品表

CREATE TABLE `products`(

`product_id` CHAR(4) PRIMARY KEY COMMENT '商品编号',

`product_name` VARCHAR(100) NOT NULL COMMENT '商品名称',

`product_type` VARCHAR(32) NOT NULL COMMENT '商品类型',

`sale_price` INTEGER COMMENT '销售单价',

`purchase_price` INTEGER COMMENT '进货单价',

`regist_date` DATE COMMENT '登记日期'

)COMMENT ='商品表' ENGINE=INNODB CHARSET=utf8;

#查看表定义

DESCRIBE `products`;

执行上面这一条语句,客户端显示的表定义内容

向商品表中插入数据如下图所示(有三条数据有空值,两种写法)

第一种

第二种

#查询商品表

SELECT * FROM `products`;

表中的数据如下图所示

数据类型的指定

INTEGER型:用来指定存储整数的列的数据类型(数字型),不能存储小数。

CHAR型:是character的缩写,定长字符串,像CHAR(10)或者CHAR(200)这样的,括号中是指定的字符串长度,,超出字符串长度的部分是无法输入到该列中的,输入长度不足则会以半角空格进行补足,例如:CHAR(8)中输入‘abc’,实际会以‘abc ’的形式保存(后五个半角空格),存储的字符串区分大小写。

VARCHAR型:VAR是varing(可变的)的缩写,可变长字符串,上面的例子:VARCHAR(8),输入的‘abc’,实际存储的也是‘abc’,存储的字符串区分大小写。Oracle中使用VARCHAR2型(不推荐使用VARCHAR)。

DATE型:用来指定存储日期(年月日)的列的数据类型(日期型)。Oracle中使用的DATE型还包含时分秒。

DECIMAL型:用于在数据库中存储精确的数值,是以字符串的形式保存数值,经常用于会计系统中的货币数据,decimal(P,D),其中P表示有效位数的精度,D表示小数点后的位数。

约束的设置

NOT NULL:非空约束,就是必须输入数据,如果不输的话会报错。如上面建立表中的product_name列。

UNIQUE KEY:唯一约束,输入的数据不能重复,注意:unique key允许多个null值存在。一张表中允许多个唯一约束。

PRIMARY KEY:主键约束,不能输入重复的数据并且输入的数据不能为空。一张表中只能有一个主键。

FOREIGN KEY:外键约束,就是表与表之间某种约定关系。

以下定义中例如,其中只是做区分,不用写

表的删除

DROP TABLE ;

执行完上面这条语句后表是无法恢复的,只能重新建表,再插入数据。

表的更新

#添加新的一列

ALTER TABLE ADD COLUMN ;

#Oracle和SQL Serve中不用写COLUMN。

ALTER TABLE ADD ;

#Oracle中同时添加多列的时候可以这样写

ALTER TABLE ADD (,,......);

#删除一列

ALTER TABLE DROP COLUMN ;

#Oracle中不用写COLUMN。

ALTER TABLE DROP ;

#变更表名

RENAME TABLE TO ;

#SQL Server中变更表名

sp_rename ,;

#Oracle和PostgreSQL变更表名

ALTER TABLE RENAME TO ;

列的查询

#基本select语句

SELECT ,,... FROM ;

例如:查询products表中product_name和product_type两列

SELECT `product_name`,`product_type` FROM products;

#查询所有的列,星号(*)代表全部列的意思

SELECT * FROM ;

#为列设定别名可以使用AS关键词,AS可以省略,别名可以是中文,中文要加引号

SELECT `product_name` AS '商品名',`product_type` AS TYPE,`sale_price` '单价' FROM `products`;

#查询结果删除重复数据使用DISTINCT关键字,在使用distinct时如果存在多条NULL也会被合并成一条数据,distinct关键字只能写在第一个列名之前,比如我就想知道商品种类有哪些

SELECT DISTINCT product_type FROM products;

#根据条件查询某一列的值和我们所想要的字符串相等,用where子句

SELECT ,... FROM WHERE ;

上面这条语句也可以把星号(*)换成你想查询的列。

where字句要跟在from字句后面。

算术运算符

四则运算所使用的运算符(+ - * /)称为算术运算符

select字句中可以使用常数或者表达式

需要注意的是所有包含NULL的算术运算,其结果肯定为NULL。例如:5+null,1*null,null/0,null-5等等。

比较运算符

=:等于

:不等于

>=:大于等于

>:大于

注意:字符串类型的数据原则上按照字典顺序进行排序,不能与数字大小的顺序混淆。

注意:不能对NULL使用比较运算符,希望选取NULL记录时,需要在条件表达式中使用IS NULL运算符,希望选取不是NULL的记录时,需要在条件表达式中使用IS NOT NULL运算符。

逻辑运算符

NOT运算符:用来否定某一条件,但是不能滥用。在编写复杂的SQL语句时,经常会看到NOT的身影。

AND运算符:在其两侧的查询条件都成立时整个查询条件才成立。

OR运算符:在两侧的查询条件有一个成立时整个查询条件都成立。

在WHERE子句中使用AND运算符和OR运算符,可以对多个查询条件进行组合。

AND运算符的优先级高于OR运算符。想要先执行OR运算符时可以使用括号。

通常逻辑运算符被称为二值逻辑,即真(TRUE)和假(FALSE),只有在SQL中逻辑运算称为三值逻辑,即除了真和假外还有第三种值:不确定(UNKNOWN)。

下图为三值逻辑真值表

聚合函数

常用的五个函数:

COUNT:计算表中的记录数(行数)。

SUM:计算表中数值列中数据的合计值。

AVG:计算表中数值列中数据的平均值。

MAX:求出表中任意列中数据的最大值。

MIN:求出表中任意列中数据的最小值。

以上两个结果count(*)计算的结果是8,count(purchase_price)计算的结果是6,它们的区别是因为purchase_price列中有两行是NULL,count()会得到NULL之外的数据行数。

在四则运算中写过如果计算式中存在NULL,则计算结果一定为NULL。

但是在聚合函数中,除了count(*)之外,聚合函数会自动将NULL排除在外,不进行计算。

SUM/AVG只适用于数值类型的列。MAX/MIN函数几乎适用所有数据类型的列,比如可以取出最大日期和最小日期。

之前写过的去重复的DISTINCT关键字,可以在count函数的参数中使用DISTINCT,DISTINCT必须写在括号中。

GROUP BY 子句

使用GROUP BY 子句进行汇总

SELECT ,,,...... FROM

GROUP BY ,,,......;

聚合键中包含NULL时,在结果中会以“不确定”行(空行)的形式表现出来。

使用WHERE子句和GROUP BY子句进行汇总处理

SELECT ,,,......

FROM

WHERE

GROUP BY ,,,......;

目前已经学过的子句书写顺序:

SELECT-FROM-WHERE-GROUP BY

以上语句的执行顺序

FROM-WHERE-GROUP BY -SELECT

注意:

1:使用GROUP BY 子句时,SELECT子句中不能出现聚合键之外的列名。(只有在MySQL中可以正常执行,在MySQL中多列里只要有一列满足要求就可以了,但是不建议这样写,可以看下图中的执行结果,有歧义的)

2:在GROUP BY子句中不能使用SELECT子句中定义的别名(在MySQL和postgresQL中可以正常执行,不建议这样写,在其它DBMS中执行错误的原因可以看我上面写的执行顺序,是先执行GROUP BY 再执行SELECT,你先在SELECT中定义了,但是GROUP BY 并不知道)

3:GROUP BY子句执行的结果都是随机排列的,要想排序的话可以使用ORDER BY 子句,后面会学习的。

4:只有SELECT子句和HAVING子句(以及ORDER BY子句)中能够使用聚合函数。

5:DISTINCT和GROUP BY 都能够删除后续列中的重复数据,能够实现相同的功能,在使用是我们应该根据想要的结果去选择,“想要删除选择结果中的重复记录”时使用DISTINCT,在“想要计算汇总结果”时使用GROUP BY。

HAVING子句

WHERE只能指定记录(行)的条件,使用HAVING子句可以指定组的条件

SELECT ,,,......

FROM

GROUP BY,,,......

HAVING ;

注意:

HAVING子句中能够使用以下三种要素:常数、聚合行数、GROUP BY子句中指定的列名(即聚合键)。

WHERE子句=指定行所对应的条件

HAVING子句=指定组所对应的条件

ORDER BY子句

ORDER BY 子句:用来明确指定排列顺序。

SELECT ,,,......

FROM

ORDER BY ,,......

指定升序:用ASC关键字(ascendent),默认使用升序排列,所以这个关键字可以省略不写。

指定降序:用DESC关键字(descendent)。

此外,ORDER BY后面也可以跟多个列,中间用逗号隔开,排序规则是优先使用左侧的。

如果排序键中包含NULL时,不会对NULL进行排序,会在开头或者末尾对NULL进行汇总。

增加ORDER BY 之后子句的书写顺序

SELECT - FROM - WHERE - GROUP BY - HAVING - ORDER BY

增加ORDER BY 之后子句的执行顺序

FROM - WHERE - GROUP BY - HAVING - SELECT - ORDER BY

由以上可知在ORDER BY子句中可以使用SELECT子句中定义的别名。

ORDER BY子句中也可以使用SELECT子句中出现的列所对应的编号,例如:ORDER BY 3 DESC;就是让SELECT子句中第三个列进行降序排列,不过不推荐这样写,首先这样写阅读代码比较困难,而且1992年制定的SQL标准也已说明该排序功能将来会删除,这里我也就不演示代码了。

写在后面:

以上是这本书和我所知的前三章内容,真是写了我好久好久好久啊,从过年写到现在,这本书看完了感觉上内容不多啊,本来想着一次性写完整本书中的内容的,还是我太年轻了,后面章节以后再慢慢写,有可能又懒了!

以上内容我感觉我写的不适合完全不懂的人,也就自己复习复习用了,MySQL的语句基本都在自己电脑上运行了一遍,其它的仅供参考。

全部都是一个字一个字打的,有错误的地方,就当不知道吧。

电脑上我看排的都挺好的,手机上我就不知道了,略过略过。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190213G15ROE00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券