SQL 的简单教程(Mac 下 PostgreSQL 的安装与使用)(1)_mac postgresql 导入sql(1)

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

〇、PostgerSql 的安装以及基本命令

1. 安装 PostgreSQL:
	brew install postgresql -v   # 非管理员身份运行

2. 初始配置 PostgreSQL:
	initdb /usr/local/var/postgres -E utf8

3. 设置开机启动 PostgreSQL:
	ln -sfv /usr/local/opt/postgresql/*.plist ~/Library/LaunchAgents
	launchctl load ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist

4. 启动 PostgreSQL:
	pg_ctl -D /usr/local/var/postgres -l /usr/local/var/postgres/server.log start

5. 关闭 PostgreSQL:
	pg_ctl -D /usr/local/var/postgres stop -s -m fast

6. 创建一个 PostgerSql 用户:
	createuser username -P # username 为你想创建的用户名

7. 连接数据库
	psql -U username -d dbname -h 127.0.0.1  # username 为连接数据库名为 dbname 的 用户名

8. 显示已创建的数据库
\l

PostgerSql 显示所有的库

9. 在不连接 PostgerSql 数据库的情况下,也可以在终端上查看显示已创建的数据库:
psql -l

10. 切换数据库
\c dbname

11. 显示数据库表
\d

12. 在终端删除数据库
	dropdb -U user dbname

13. 对于版本的数据升级问题,PostgreSQL 提供了 pg_upgrade 来做版本后的数据迁移,用法如下:
	pg_upgrade -b 旧版本的bin目录 -B 新版本的bin目录 -d 旧版本的数据目录 -D 新版本的数据目录 [其他选项...]

14. 利用 pg_ctl 关闭 postmaster
	pg_ctl -D /usr/local/var/postgres stop

15. Mac 下这样关闭:
	launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist

16. 备份数据(默认是在 /usr/local/var/postgres 目录):
	mv /usr/local/var/postgres /usr/local/var/postgres.old

17. 退出数据库
\q

显示 PostgerSql 的表以及退出 PostgerSql

一、数据库与 SQL

1.1 数据库是什么

DBMS 与 DB 的关系:

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

DBMS:
	用来管理数据库的计算机系统成为数据库管理系统(Database Management System,DBMS).	

DBMS 的种类

1. 层次数据库(HDB)
	将数据通过层次结构(树形结构)的方式表现出来,曾经的主流,现在使用的很少.
	
2. 关系数据库(RDB)
	5 种代表:
		Oracle Database:甲骨文
		SQL Server:微软公司
		DB2: IBM
		PostgerSql:开源
		Mysql:甲骨文--开源
		
3. 面向对象数据库(OODB)
	保存对象的数据库
	
4. XML 数据库
	对 XML 形式的大量数据可以进行高速的处理
	
5. 键值存储系统(KVS)
	redis  mongodb 等

1.2 数据的结构

RDBMS 数据库常见的系统结构
RDBMS 数据库 常见的系统结构
通过网络可以实现多个客户端访问同一个数据库
通过网络可以实现多个客户端访问同一个数据库
表的结构
数据库与表的关系

1.3 SQL 概要
1.3.1 SQL 语句及其种类

SQL 根据操作目的可以分为 DDL,DML和 DCL
SQL 语句及其种类

1.3.2 SQL 基本书写规范
已分号(;)结尾

不区分大小写

字符串和日期常熟需要使用单引号( ' )括起来,而数字常数可以直接书写

单词需要用半角空格或者换行来分割 

1.4 表的创建

数据库的创建

CREATE DATABASE <数据库名称>

表的创建

CREATE TABLE <表名>
<列名> <数据类型> <该列所需约束>
...
<该表的约束1> <该表的约束2> ...
CREATE TABLE product
(
  "product\_id" int4 NOT NULL,
  "product\_name" varchar(100) COLLATE "pg\_catalog"."default" NOT NULL DEFAULT ''::character varying,
  "product\_type" varchar(32) COLLATE "pg\_catalog"."default" NOT NULL DEFAULT ''::character varying,
  "sale\_price" numeric(10,2) NOT NULL DEFAULT 0,
  "purchase\_price" numeric(10,2) DEFAULT NULL::numeric,
  "regist\_date" date,
  PRIMARY KEY ("product\_id")
);
ALTER TABLE "public"."product" OWNER TO "psql";
COMMENT ON COLUMN "public"."product"."product\_id" IS '商品 id';
COMMENT ON COLUMN "public"."product"."product\_name" IS '商品名称';
COMMENT ON COLUMN "public"."product"."product\_type" IS '商品种类';
COMMENT ON COLUMN "public"."product"."sale\_price" IS '商品销售价格';
COMMENT ON COLUMN "public"."product"."purchase\_price" IS '进货价';
COMMENT ON COLUMN "public"."product"."regist\_date" IS '登记日期';

命名规则

标准 SQL: 只能使用 半角英文字母, 数字, 下划线(_) 作为数据库,表和列的名称

1.5 表的删除

表的删除

DROP TABLE <表名>;

表定义的更新

新增字段:
	ALTER TABLE <表名> ADD COLUM <列的定义>;
	DB2 PostgreSQL MySQL
		ALTER TABLE Product ADD COLUMN product_name_pinyin VARCHAR(100);
	Oracle
		ALTER TABLE Product ADD (product_name_pinyin VARCHAR2(100));
	SQL Server
		ALTER TABLE Product ADD product_name_pinyin VARCHAR(100);
	
删除字段:
	ALTER TABLE <表名> DROP COLUM <列名>;
	SQL Server DB2 PostgreSQL MySQL
		ALTER TABLE Product DROP COLUMN product_name_pinyin;
	Oracle
		ALTER TABLE Product DROP (product_name_pinyin);

插入数据

SQL Server PostgreSQL
-- 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, '');
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, 0, '2009-09-20');
INSERT INTO Product VALUES ('0007', '擦菜板',  '厨房用具',880, 790, '2008-04-28');
INSERT INTO Product VALUES ('0008', '圆珠笔', '办公用品',100, 0,'2009-11-11');
COMMIT;

变更表名

Oracle PostgreSQL
	ALTER TABLE Poduct RENAME TO Product;
	
DB2
	RENAME TABLE Poduct TO Product;
	
SQL Server
	sp_rename 'Poduct', 'Product';
	
MySQL
	RENAME TABLE Poduct to Product;

二、查询基础

2-1 SELECT 语句基础

列的查询

SELECT <列名>,...... FROM <表名>;

查询出表中所有的列

SELECT \* FROM <表名>;

为列设定别名

SELECT 
	product_id AS id, 
	product_name AS name, 
	purchase_price AS price
FROM Product;

# 别名可以使用中文,使用中文时需要用双引号(")括起来 A。请注意 不是单引号(')
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;

从结果中删除重复行

SELECT 
	DISTINCT product_type as type
FROM Product;

# 在多列之前使用 DISTINCT(此时,会 将多个列的数据进行组合,将重复的数据合并为一条)
SELECT 
	DISTINCT product_type, regist_date 
FROM Product;

# DISTINCT 关键字只能用在第一个列名之前。因此,请大家注意不 能写成 regist\_date, DISTINCT product\_type。

根据 WHERE 语句来选择记录

SELECT <列名>, ...... 
	FROM <表名>
WHERE <条件表达式>;

SELECT product_name, product_type 
FROM Product
WHERE product_type = '衣服';

注释的书写方法
注释的书写方法

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

算术运算符

SELECT 
	product_name, sale_price, sale_price \* 2 AS "sale\_price\_x2"
FROM Product;

需要注意 NULL

5+NULL 
10 - NULL 
1\*NULL 
4 / NULL 
 NULL/9 
 NULL/0
以上结果都为NULL

比较运算符

SELECT 
	product_name, product_type 
FROM Product
WHERE 
	sale_price = 500;

# SQL 表示不等于的方法: != <>
SELECT 
	product_name, product_type 
FROM Product
WHERE 
	sale_price <> 500;

# WHERE 子句的条件表达式中也可以使用计算表达式
SELECT 
	product_name, sale_price, purchase_price 
FROM Product
WHERE 
	sale_price - purchase_price >= 500;

对字符串使用不等号时的注意事项
创建 Chars 表并插入数据

-- 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语 句

SELECT chr 
FROM Chars
WHERE chr > '2';

字段与字符串比较大小
字符串类型的数据排序原则
不能对 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;

AND 运算符和 OR 运算符

# 使用 AND
SELECT product_name, purchase_price 
FROM Product
WHERE 
	product_type = '厨房用具' 
AND 
	sale_price >= 3000;
	
# 使用 OR
SELECT product_name, purchase_price 
FROM Product
WHERE 
	product_type = '厨房用具' 
OR 
	sale_price >= 3000;

使用括号强化处理

不使用括号强化

SELECT product_name, product_type, regist_date 
FROM Product
WHERE 
	product_type = '办公用品' 
AND 
	egist_date = '2009-09-11'
OR 
	regist_date = '2009-09-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');

括号强化后的执行结果

逻辑运算符和真值
逻辑运算符和真值

含有 NULL 时的真值
含有 NULL 时的真值
建表时设置 NOT NULL 约束的原因
建表时设置 NOT NULL 约束的原因

三、聚合与排序

3-1 对表进行聚合查询

聚合函数(聚集函数)

COUNT:计算表中的记录数(行数)
SUM : 计算表中数值列中数据的合计值 
AVG : 计算表中数值列中数据的平均值 
MAX: 求出表中任意列中数据的最大值 
MIN : 求出表中任意列中数据的最小值

计算表中数据的行数

count(\*)/count(1)

计算 NULL 之外的数据的行数

SELECT COUNT(purchase_price) FROM Product;

# purchase\_price列中有两行数据是 NULL, 因此并不应该计算这两行。
	对于 COUNT 函数来说,参数列不同计算的结果也会发生变化

极端情况
只含有 null 的表

# 包含NULL的列作为参数时,COUNT(\*)和COUNT(<列名>)的 结果并不相同
SELECT COUNT(\*), COUNT(col_1) FROM NullTbl;

执行结果

如上所示,即使对同一个表使用 COUNT 函数,输入的参数不同得到 的结果也会不同。由于将列名作为参数时会得到 NULL 之外的数据行数, 所以得到的结果是 0 行。
该 特 性 是 C O U N T 函 数 所 特 有 的 ,其 他 函 数 并 不 能 将 星 号 作 为 参 数( 如 果使用星号会出错)。

法则

计算合计值

# 计算销售单价的合计值
SELECT SUM(sale_price) FROM product;

# 计算销售单价和进货单价的合计值
SELECT SUM(sale_price), SUM(purchase_price) FROM product;

聚合函数遇见 NULL时的处理
注意: purchase_price 中有两列是 NULL ,
但是之前我们知道 NULL+任何数都是 NULL,
这里与之并不矛盾,因为在计算SUM 时并没有将 NULL 查找出来,
所以这里计算的结果并不为 NULL

计算平均值

# 计算销售单价的平均值
SELECT AVG(sale_price) FROM product;

# 计算销售单价和进货单价的平均值
SELECT AVG(sale_price), AVG(purchase_price) FROM Product;

计算最大值和最小值

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化的资料的朋友,可以戳这里获取

的合计值
SELECT SUM(sale_price), SUM(purchase_price) FROM product;


![聚合函数遇见 NULL时的处理](https://img-blog.csdnimg.cn/2019061711302799.png)  
 *注意: purchase\_price 中有两列是 NULL ,  
 但是之前我们知道 NULL+任何数都是 NULL,  
 这里与之并不矛盾,因为在计算SUM 时并没有将 NULL 查找出来,  
 所以这里计算的结果并不为 NULL*


计算平均值



计算销售单价的平均值

SELECT AVG(sale_price) FROM product;

计算销售单价和进货单价的平均值

SELECT AVG(sale_price), AVG(purchase_price) FROM Product;


计算最大值和最小值



[外链图片转存中...(img-sX6khGKc-1715878290465)]
[外链图片转存中...(img-6mk8jiee-1715878290465)]
[外链图片转存中...(img-agJ644GB-1715878290466)]

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[需要这份系统化的资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618631832)**

  • 21
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值