《SQL基础教程》学习笔记Ch1&2

0进入PostgreSQL

0.png

1数据库和SQL

1-1数据库是什么

数据库Database(DB):将大量数据保存起来,通过计算机加工而成的可以进行高效访问的数据集合称为数据库
数据库管理系统Database Management System(DBMS):用来管理数据库的计算机系统

DBMS的种类:
  • 层次数据库HDB
    树状结构,相对于RDB较少使用
  • 关系数据库Relational Database,RDB
    由行和列组成的二维表来管理数据,使用专门的Structured Query Language(SQL结构化查询语言)对数据进行操作
    5种常用的RDBMS:
    Oracle Database,SQL server,DB2,PostgreSQL,MySQL
  • 面向对象数据库
  • XML数据库
  • 键值存储系统

1-2数据库的结构

RDBMS的常见系统结构:客户端/服务器类型(C/S类型)
客户端:委托方;服务器:受托方(RDBMS)

表的结构

根据SQL语句的内容返回的数据必须是二维表的形式
表的行称为字段;表的行称为记录

1-3SQL概要

SQL用关键字、表名、列名等组合而成的一条语句。

SQL语句的种类:
  • DDL(Data definition language,数据定义语言):创建或删除存储数据用的数据库以及数据库中的表等对象
    CREATE
    DROP
    ALTER
  • DML(Data manipulation language,数据操纵语言):查询或变更表中的记录
    SELECT
    INSERT
    UPDATE
    DELETE
  • DCL(Data control language,数据控制语言):确认或取消对数据库中的数据进行的变更
    COMMIT
    ROLLBACK
    GRANT
    REVOKE
SQL的基本书写规则

1.要以分号(;)结尾
2.不区分大小写

为了代码的整洁性,采取下面的规则:
关键字大写
表名的首字母大写
其余(列名等)小写

3.常数的书写方式是固定的
在SQL语句中直接书写的字符串、日期或者数字等称为常数。

含有字符串的时候,使用单引号(')将字符串括起来:'abc'
含有日期时,也需要单引号(')将其括起来,形式有多种:'26 Jan 2010','10/01/26','2010-01-26'
书写数字的时候,不需要任何标识

4.单词之间需要用半角空格或者换行来分隔

1-4表的创建

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));
  • 命名规则:只能使用半角英文字母、数字、下划线(_)作为数据库、表和列的名称,且名称必须以字母开头
  • 数据类型的指定:
    INTEGER型:整数
    CHAR型:定长字符串(当字符串达不到指定长度时,用半角空格进行补足)
    VARCHAR型:可变长字符串
    DATE型:日期
  • 约束的设置:
    约束是除了数据类型之外,对列中存储的数据进行限制或者追加条件的功能。
    NOT NULL约束:该列不能输入空白
    主键约束:将product_id设为主键(主键:可以特定一行数据的列)

1-5表的删除和更新

表的删除
DROP TABLE Product;
表定义的更新(添加列或删除列)
ALTER TABLE Product ADD COLUMN product_name_pinyin VARCHAR(100);
ALTER TABLE Product DROP COLUMN product_name_pinyin;
向Product表中插入数据
-- 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;
表名称的修改
ALTER TABLE Poduct RENAME TO Product;

2查询基础

2-1SELECT语句基础

列的查询
SELECT product_id, product_name, purchase_price  
  FROM  Product;
查询出表中所有的列
SELECT * 
  FROM Product;
2-1.png

需要注意的是,如果使用星号的话,无法设定列的排列顺序,表会依照CREATE TABLE的顺序对列排序

为列设置别名
SELECT product_id      AS  id,
       product_name    AS  name,
       purchase_price  AS  price
  FROM Product;
2-2.png
SELECT product_id      AS  "商品编号",
       product_name    AS  "商品名称",
       purchase_price  AS  "进货单价"
  FROM Product;

设定中文别名需要用双引号(")括起来

常数的书写

第一列是字符串常数,第二列是数字常数,第三列是日期常数

SELECT '商品' AS string, 38 AS number, '2009-02-24' AS date,
       product_id, product_name
  FROM Product;
2-3.png
从结果中删除重复行

想知道Product表中保存了哪些商品种类

SELECT DISTINCT product_type
  FROM Product;

在使用DISTINCT时,NULL也被视为一类数据

SELECT DISTINCT purchase_price
  FROM Product;
2-4.png

在多列之前使用DISTINCT

SELECT DISTINCT product_type, regist_date
  FROM Product;
2-5.png
根据WHERE语句来选择记录

SELECT语句通过WHERE子句来指定查询数据的条件

SELECT product_name, product_type
  FROM Product
 WHERE product_type = '衣服';
图片.png

首先通过WHERE子句查询出符合指定条件的行,再选取出SELECT语句指定的列;
SQL语句中子句的书写顺序是固定的,WHERE子句必须紧跟在FROM子句后

注释的写法
  • 1行注释
    书写在“--”之后,只能写在同一行
  • 多行注释
    书写在“/”和“/”之间,可以跨多行
-- 本SELECT语句会从结果中删除重复行。
SELECT DISTINCT product_id, purchase_price
  FROM Product;

/* 本SELECT语句
   会从结果中删除重复行。*/
SELECT DISTINCT product_id, purchase_price
  FROM Product;

注释还可以插在上两句之间。

SELECT DISTINCT product_id, purchase_price
/* 本SELECT语句
   会从结果中删除重复行。*/
  FROM Product;

2-2算术运算符和比较运算符

算术运算符
SELECT product_name, sale_price,
       sale_price * 2 AS "sale_price_x2"
  FROM Product;

算术运算符:+,-,*,/
也可以使用括号
需要注意,有NULL的运算式结果全为NULL

比较运算符
--选取出sale_price列的值不是500的记录
SELECT product_name, product_type
  FROM Product
 WHERE sale_price <> 500;

--选取出登记日期在2009年9月27日之前的记录
SELECT product_name, product_type, regist_date
  FROM Product
 WHERE regist_date < '2009-09-27';

也可以对计算结果进行比较

SELECT product_name, sale_price, purchase_price
  FROM Product
 WHERE sale_price - purchase_price >= 500;
对字符串使用不等号

首先我们创建一个Chars表,如下所示:


图片.png
--DDL:创建表
CREATE TABLE Chars
(chr CHAR(3) NOT NULL,
PRIMARY KEY (chr));

--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';

执行结果:


图片.png

这是由于字符串类型的数据在比较时按照字典顺序进行排序:1,10,11,2,222,3
不能与数字的大小顺序混淆

不能对NULL使用比较运算符
--错误的SELECT语句(一条记录也取不出来)
SELECT product_name, purchase_price
  FROM Product
WHERE purchase_price = NULL;
--选取NULL的记录
SELECT product_name, purchase_price 
  FROM Product
 WHERE purchase_price IS NULL;
--选取不为NULL的记录
SELECT product_name, purchase_price
  FROM Product
 WHERE purchase_price IS NOT NULL;

2-3逻辑运算符

NOT运算符

下面两段语句是等价的

SELECT product_name, product_type, sale_price
  FROM Product
 WHERE NOT sale_price >= 1000;
SELECT product_name, product_type, sale_price
  FROM Product
 WHERE sale_price < 1000;
AND运算符和OR运算符

AND:同时满足两侧查询条件
OR:两侧查询条件有一个成立

SELECT product_name, purchase_price
  FROM Product
 WHERE product_type = '厨房用具'
   AND sale_price >= 3000;
通过括号强化处理

假设我们需要提取的数据满足:
“商品种类为办公用品” 并且 “登记日期是2009年9月11日或者2009年9月20日”

--将查询条件原封不动地写入条件表达式
SELECT product_name, product_type, regist_date
  FROM Product
 WHERE product_type = '办公用品'
   AND regist_date = '2009-09-11'
    OR regist_date = '2009-09-20';

查询结果和预期不符:


图片.png

这是由于AND运算符优先于OR运算符造成的。
可以使用半角括号()将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');
图片.png
逻辑运算符与真值

逻辑运算符AND,OR,NOT对比较运算符返回的真值进行操作。
真值:TRUE,FALSE。

含有NULL时的真值

在Product表中,商品“叉子”和“圆珠笔”的purchase_price为NULL,
查询语句为purchase_price = 2800时,显然结果为FALSE;
但是执行查询语句NOT purchase_price = 2800时,结果也是FALSE(不取出NULL所在的值);
它的执行结果是UNKNOWN,这是SQL语言独有的三元逻辑。
真值有:TRUE,FALSE,UNKNOWN。

习题2

2.1.png

2.3,2.4.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容