致谢
首先非常感谢生信技能树的赠书活动送了我这么棒的一本书~
活动链接:
【好书分享】数据库必知必会
https://mp.weixin.qq.com/s?src=11×tamp=1531923110&ver=1006&signature=zKUTJuOiAQYBSCYL8aCDpUCqfTIXpfIr71TczjPTdvXrOjxDYRbqV1GJ9ykkf9JFB6qMB4tJem4-cZvMpUQF50qU5fXJ3iMh6kgCDWfo*GJv0bgETfvfjVQQh3Dhwcme&new=1
因为之前一直在做数据库用到了很多的sql语句,而我的sql语言基本都是照着人家分享的代码和一些视频课抄的,相当地一知半解,经常遇到各种各样奇怪的bug,超级心累。虽然现在基本已经脱离那些夜夜debug熬到天亮的日子了,但还是心有余悸。所以拿到这本书的时候真的是欣喜若狂,有种学完里面的东西就能够将当初折磨我的东西踩在脚下摩擦的感觉。目前大概看了接近四分之一,决定要开始记录一些东西,一是为了记录一些所得,二是分享经验和所学,以飨读者。
0、搭建环境
0-1、安装
既然要学习sql肯定要先搭建好相关的学习环境咯。书里建议和介绍的是在Windows环境下下载PostgreSQL,网址如下
https://www.enterprisedb.com/downloads/postgres-postgresql-downloads#windows
但是会有一些奇怪的在尝试多个版本尝试了很多修复报错的经验帖之后还是一直报
Problem running post-install step. Installation may not complete correctly. The database cluster initialisation failed.
的错误,没法解决。于是乎一气之下拿起被我刷成deepin系统的旧电脑sudo apt-get install postgresql
好了,世界清净了
输入psql --v
查看版本,我安装的是9.6版(最新版应该是到10.4了,但是基本没差)
另,在Windows下需要将data\postgresql.conf
中的
#listen_addresses = '*'
修改成
listen_addresses = 'localhost'
才能正常使用。
0-2、登录
在类unix环境下先将用户
sudo su postgres
切换到专用的postgres
用户后,输入psql
进入sql环境在Windows下,以管理员方式打开cmd之后,输入
psql.exe -U postgres
进入sql环境
0-3、创建学习用的数据库
sql语言有点像php,必须得以;
结尾,否则不会执行。
输入下面的语句创建数据库:
CREATE DATABASE shop;
这里要说明一下:
数据库的名称必须只能用小写字母
按照sql标准的话关键字都得大写,比如上面的
CREATE
和DATABASE
,但实际上大小写并不影响运行。但是入乡随俗,一开始学习的时候要养成良好习惯嘛,建议照着来~
创建成功后输入\q
退出环境,输入psql -d shop
进入上一步创建的数据库。(Windows: psql.exe -U postgres -d shop
)
至此环境就搭建完成啦~接下来就可以学习sql语句啦~
本书中所有用到的语句在图灵社区的官网上都能下载到
http://www.ituring.com.cn/book/download/f8e8fcb6-84d8-4839-bd5a-3c737478ae11
1、数据库和SQL
1-1、数据库介绍
我们常见的mysql
,SQL Server
,DB2
,Oracle Database
,Postgresql
都属于关系数据库管理系统(Relational Database Management System, RDBMS)
数据库里储存的都是一张张的表,可以类比为一张张excel数据表,基本没差,就是长那个样子。
1-2、SQL介绍
sql语句的三种类型:
DDL(Data Definition Language, 数据定义语言)
CREATE:创建数据库和表
DROP:删除数据库和表
ALTER:修改数据库和标的结构
DML(Data Manipulation Language, 数据操纵语言)
SELECT:查
INSERT:增
UPDATE:改
DELETE:删
sql语言最常用的三板斧
DCL(Data Control Language, 数据控制语言)
COMMIT:确认变更
ROLLBACK:取消变更
GRANT:赋予操作权限
REVOKE:取消操作权限
日常生产生活中90%属于三板斧的DML
1-3、创建表
CREATE TABLE Product
(product_id CHAR(4) NOT NULL,
product_name VARCHAR(100) NOT NULL,
product_type VARCHAR(32) NOT NULL,
sale_price INTEGER ,
purchase_price INTEGER ,
regist_date DATE ,
PRIMARY KEY (product_id));
官方提供所有示例及课后题的代码,但还是建议大家手打一遍~
1-4、向表中插入数据
-- DML:插入数据
BEGIN TRANSACTION;
INSERT INTO Product VALUES ('0001', 'T恤' ,'衣服', 1000, 500, '2009-09-20');
INSERT INTO Product VALUES ('0002', '打孔器', '办公用品', 500, 320, '2009-09-11');
INSERT INTO Product VALUES ('0003', '运动T恤', '衣服', 4000, 2800, NULL);
INSERT INTO Product VALUES ('0004', '菜刀', '厨房用具', 3000, 2800, '2009-09-20');
INSERT INTO Product VALUES ('0005', '高压锅', '厨房用具', 6800, 5000, '2009-01-15');
INSERT INTO Product VALUES ('0006', '叉子', '厨房用具', 500, NULL, '2009-09-20');
INSERT INTO Product VALUES ('0007', '擦菜板', '厨房用具', 880, 790, '2008-04-28');
INSERT INTO Product VALUES ('0008', '圆珠笔', '办公用品', 100, NULL, '2009-11-11');
COMMIT;
在不同的数据库软件中有些语句写法和用法都是不一样的,如果运行报错的话记得自己查一下自己的软件的语句是怎么写的~
2、查询基础
输出全部的列:
SELECT *
FROM Product;
输出指定的列:
SELECT product_id, product_name, product_type, sale_price,
purchase_price, regist_date
FROM Product;
上面两个是等价的。
根据WHERE语句来选择记录
SELECT product_name, product_type
FROM Product
WHERE product_type = '衣服';
SQL中子句书写顺序是固定的,不能随意更改。比如WHERE子句必须紧跟在FROM子句的后面,否则会报错。
注释的写法
单行注释:--
多行注释: /* */
这个多行注释就很像css的多行注释…
比较运算符
SELECT product_name, product_type
FROM Product
WHERE sale_price = 500;
不等于用<>
对字符串使用不等号的注意事项
创建一个测试表
-- DDL:创建表
CREATE TABLE Chars
(chr CHAR(3) NOT NULL,
PRIMARY KEY (chr));
--SQL Server PostgreSQL
-- DML:插入数据
BEGIN TRANSACTION;
INSERT INTO Chars VALUES ('1');
INSERT INTO Chars VALUES ('2');
INSERT INTO Chars VALUES ('3');
INSERT INTO Chars VALUES ('10');
INSERT INTO Chars VALUES ('11');
INSERT INTO Chars VALUES ('222');
COMMIT;
筛选大于’2’的数据
SELECT chr
FROM Chars
WHERE chr > '2';
会得到一个神奇的结果:
chr
-----
3
222
2和’2’是不一样哒!字符串是按照字典顺序进行比较的因此上面的测试表的排序是:
- 1
- 10
- 11
- 2
- 222
- 3
特殊的NULL
NULL不管加减乘除结果都是NULL,甚至NULL除以零也不会报错,得到的结果还是NULL…就是这么神奇,就像是黑洞一样将所有的东西都吸收进去成为他自己…(emmmm…我猜的)
NULL不能使用比较运算符,得使用
IS NULL
或者IS NOT NULL
SELECT product_name, purchase_price FROM Product WHERE purchase_price IS NULL;
逻辑运算符
AND
, OR
, NOT
这种东西就不介绍了,小儿科。要注意的是AND运算符优先于OR运算符
SELECT product_name, product_type, regist_date
FROM Product
WHERE product_type = '办公用品'
AND ( regist_date = '2009-09-11'
OR regist_date = '2009-09-20');
所以当需要查询登记时间是2009-09-11
或2009-09-20
的时候需要加个括号以防止查询到错误的结果。
待续……