教程PostgreSQL实战
SQL实战教程
数据库基本概念
数据库基本概念
第 1 / 4 节
数据库服务器
安装了数据库软件的电脑,就是:数据库服务器 安装了apache,nginx软件的电脑,就是:web服务器或WWW服务器
DBMS
数据库管理系统称为DBMS(Database Management System), 它是一个数据库软件,可以用来创建和管理数据库。数据的所有存储,检索,管理和处理实际上是由DBMS完成的。可以把一个DBMS看做是一个:文件柜 常见的DBMS : PostgreSQL, MySQL , Oracle , SQL Server, Access , MongoDB PostgreSQL官网: MySQL官网:
database
数据库(database):是通过DBMS创建和管理的容器。我们并不直接访问数据库,我们使用的是DBMS, 它替我们访问数据库。 可以把一个数据库看做是文件柜里面的一个格子
table
表:表由列组成;用来存储某种特定类型的数据。可以看做是一个存储数据的清单,决不应该把顾客清单和订单清单存储在同一个表中,这样做会使以后的检索和访问很困难,应该创建两个表,每个清单一个表。 在同一个数据库中,每个表的名字是唯一的。(不同的数据库可以使用相同的表名) 可以把一个表看做是文件柜格子里面的一个文件。
column
列:列中存储的这个表的特定部分信息。列就是表中的一个字段,所有的表都是由一个或多个列组成的。 比如顾客表:姓名列(专门存储顾客姓名),性别列(专门存储顾客的性别), 编号列,地址列,城市列… 正确的将一个表分为多个列非常非常重要!比如,城市,县应该总是独立的列,通过把它分解开,才有可能利用特定的列对数据进行排序和过滤(比如找出某个城市或某个县的所有顾客),如果城市或县在一个列中,则按照县进行排序或过滤会很困难。 每个列都有自己的特定类型,限制了这个列可以存储哪种数据(例如防止在数值字段中录入字符串值),数据类型还帮助正确的排序数据,并在优化磁盘使用方面起重要作用。
row
行:不需要单独创建,有了列自然就有了行。可以把每个表看做是一个网格,表中垂直的为表列,那水平的则为表行, 比如,顾客表中每行就是一个顾客记录。也可以说行(row)就是表中的一条记录。
主键-primary key
主键就是某一列(或一组列), 这个列的每个值都是唯一的,用来区分表中的每个行。 顾客表可以使用顾客编号列作为主键;订单表可以使用订单ID作为主键;雇员表可以使用雇员身份证号码作为主键。 没有主键,更新或删除表中某一行很困难,因为没有安全的方法保证只涉及特定的某一行。 应该总是给创建的每个表都定义一个主键,以便于后期的数据操纵和管理。
表中的任何列都可以作为主键,只要满足以下条件: 值唯一;不为空(不允许NULL值) 主键通常定义在表的一列上,但也可以一起使用多个列作为主键。在使用多列作为主键时,组合列必须是唯一的(但是单个列的值可以不唯一) 主键好习惯: ● 不更新主键列中的值 ● 不重用主键列的值 ● 不在主键列中使用可能会更改的值
还有一种非常重要的键–外键
什么是SQL
SQL(发音为字母S-Q-L 或 sequel)是结构化查询语言(Structured Query Language)的缩写。SQL是一种专门用来与数据库通信的语言。几乎所有重要的DBMS都支持SQL, 所以学习语言使你几乎能与所有数据库打交道。
SELECT、FROM、WHERE、CREATE、GRANT 这类关键字,psql 和 mysql 都不区分大小写: 因此 SELECT 和 select , 还有 Select都是可以的。但是为了易读,建议对SQL关键字大写,所有列和表名使用小写,只是推荐。并不强制。终端里怎么写都行,选一种风格坚持即可。
在处理SQL语句时,其中所有的空格都被忽略。SQL语句可以在上一行给出,也可以分成许多行。多数SQL开发人员认为将SQL语句分成多行更易读和调试。
但事实上任意两个DBMS实现的SQL都不完全相同。
表名、字段要不要加引号
pg和mysql中引号都不是必须的。如果要加,mysql使用反引号 name , pg使用双引号。
如果不加引号:mysql 一般按字面用(大小写规则看系统)。而pg会转成小写
MySQL
普通名字不用加反引号:
SELECT id, name FROM users;
遇到下面情况才建议加:
- 名字和关键字冲突:
order、user、group、select - 名字里有空格、连字符:
`order-items` - 想保留大小写或特殊字符
SELECT `order`, `user` FROM `group`;
这几个全是关键字,不加反引号时,ORDER 会被当成 ORDER BY 的关键字,会报错。
PostgreSQL
不要用反引号,psql 不认。需要引号时用双引号:
SELECT "order", "user" FROM "Group";
不加引号时,PostgreSQL 会把标识符转成小写:
CREATE TABLE Users (Id int); -- 实际变成表 users、列 id
SELECT Id FROM Users; -- 等价于 select id from users
加引号
CREATE TABLE "Users" ("Id" int);
效果:表名就是 Users,列名就是 Id,大小写原样保留。之后查询也必须带同样的引号:
SELECT "Id" FROM "Users";
\d "Users"
写成 SELECT Id FROM Users; 会变成找 id / users,对不上。
实用建议
日常终端可以这样写,最省事:
-- MySQL / PostgreSQL 都能用(名字别和关键字撞车)
select id, name from users where id = 1;
更稳妥的习惯:
- 关键字随便大小写,团队统一即可。
- 表名、字段用小写 + 下划线:
user_id、order_items,少碰关键字,基本不用加引号。 - MySQL:只有关键字冲突或特殊字符时才加
`。 - PostgreSQL:不要用反引号;只有大小写敏感或关键字冲突时才加
" "。 - 不要混用:MySQL 里别用
"表名"(默认不当标识符),psql 里别用`表名`。