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的语句基本都在自己电脑上运行了一遍,其它的仅供参考。
全部都是一个字一个字打的,有错误的地方,就当不知道吧。
电脑上我看排的都挺好的,手机上我就不知道了,略过略过。
领取专属 10元无门槛券
私享最新 技术干货