01
—
课程说明
这是从零开始系统学习SQL语言的课程,课程中的所有SQL语句同时兼容MySQL、Oracle、SQL Server和PostgreSQL等4种最流行的数据库。从SQL简介和创建表开始,涵盖了全部常用的SQL知识,学完这个课程马上就可以做数据分析了。
02
—
实验脚本
使用下面的脚本创建学习环境
drop table if exists dept;create table dept( deptno int primary key, dname varchar(12) not null, loc char(10));insert into dept values(1,'Development','NEW YORK');insert into dept(deptno,dname,loc) values(2,'Testing','CHICAGO');insert into dept(deptno,dname) values(3,'Marketing');drop table if exists emp;create table emp( empno int primary key , ename char(10) not null, deptno int, hiredate date, sal numeric(8, 2), comm numeric(8, 2) );insert into emp values(1,'Grace',1,'2000-12-02',12000.00,0);insert into emp values(2,'Joe',1,'2013-01-03',9100.00,0); insert into emp values(3,'John',2,'2021-02-10',8900.00,null); insert into emp values(4,'Lisa',2,'2022-12-1',11000.00,null);insert into emp values(5,'Ben',3,'2004-09-11',8000.00,9000.00); commit;
03
—
实验环境
课程中使用的4种数据库的客户端都是最流行的,也是数据库软件自带的客户端,无需单独安装。大家要看SQL语句前面的提示符就知道是哪种数据库里,这里我带大家熟悉一下4种数据库的客户端。MySQL数据库的客户端mysqlOracle数据库的客户端SQLPlusSQL Server数据库的客户端SSMS,这也是4个数据库客户端中唯一一个图形界面的客户端。PostgreSQL数据库的客户端psql
课程中会随机的在这4种数据库上面进行实验,同一个实验只会在一种数据库上面做一次,但是所有的SQL语句都是同时兼容这4种数据库的,大家花一份时间会得到4份的收获。Oracle数据库的语言设置
$ export NLS_LANG=american_america.AL32UTF8$ export LANG=zh_CN.UTF-8alter session set nls_date_format ='yyyy-mm-dd';
MySQL
使用MySQL自带的字符客户端mysql。
Oracle
使用Oracle自带的字符客户端sqlplus。
SQL Server
使微软提供的的SSMS(SQL Server Management Studio)。
PostgreSQL
使用PostgreSQL自带的字符客户端psql。
04
—
SQL简介
- 数据库
数据存放在数据库(database)中,数据库是数据的集合,它以一定的格式存放,可以方便地被访问。管理数据库的软件称之为数据库管理系统(database management system,简写成DBMS)。
用户向数据库管理系统(DBMS)发出查询或修改数据库的执行,DBMS在数据库上执行用户的指令并返回结果。
- SQL语言
数据库管理系统(DBMS)分为两类,一类是关系型数据库(retional),另一个是非关系数据库(non-relational也称为NoSQL)。
在关系数据库中,数据存放在表中,每个表存放特定类型对象的数据,例如:员工、经理、部门等。表与表之间通过关系进行联结,因此把这类数据库称之为关系数据库。SQL用于管理关系数据库中的数据。关系数据库包括MySQL、Oracle、SQL Server和PostgreSQL等。
在非关系数据库中,没有表和关系,这类数据库不使用SQL管理数据,它们有自己的数据库管理语言,这类数据库不属于这个课程的范畴。
SQL是用于访问和处理关系数据库的标准的计算机语言,SQL 是 Structured Query Language 的缩写,是指结构化查询语言。SQL发音有两种,一种是Squel,另一种是SQL。都是正确的。
SQL语言的特点:
- 简单易学。
- 功能强大。
- 只说明要做什么,不说明如何做。
- 标准化,几乎所有的关系数据库都通用。
- 不区分大小写
本课程中的所有SQL语句均可不加修改地运行在MySQL、Oracle、SQL Server和PostgreSQL等4种数据库,实际上也可以不加修改地运行在几乎所有的数据库上。
05
—
创建表
Oracle中默认的日期格式可能不兼容,使用下面的命令修改:
SQL> alter session set nls_date_format ='yyyy-mm-dd';
或者在Linux上设置环境变量:
$ export NLS_DATE_FORMAT="yyyy-mm-dd"
创建部门表
下面的SQL语句创建部门表:
-- CREATE TABLEcreate table dept( deptno int primary key, dname varchar(12) not null, loc char(10));
在创建表之前加一个drop表的语句,是因为在整个课程的练习中会使用对数据进行修改,需要执行这些脚本将数据恢复到初始状态。
创建员工表
create table emp( empno int primary key , ename char(10) not null, deptno int, hiredate date, sal numeric(8, 2) , comm numeric(8, 2) );
删除表使用
drop table emp;
drop table if exists dept;
常用数据类型
常用数据类型见下表:
数据类型<br> | 说明<br> |
int<br> | 整数类型<br> |
char(n)<br> | 字符/字符串,固定长度n<br> |
varchar(n)<br> | 字符/字符串,可变长度,最大长度 n。<br> |
numeric(a,b)<br> | 精确数值,总位数a,小数点后位数b。<br> |
date<br> | 存储年、月、日的值 |
06
—
INSERT插入记录
insert语句用于向表中插入新记录,它有两种写法:第一种写法:为表中的所有字段添加值时不需要字段名称,但要确保值的顺序和个数与表中的字段顺序和个数一致,前面我们创建样本数据都是这种写法。语法如下:insert into 表名 values (字段1的值,字段2的值,字段3的值, ....);第二种写法:为指定的字段插入数据时,要把字段名和字段值都列出,并一一对应,语法如下:insert into 表名(字段1,字段2,字段3, ...) values (字段1的值,字段2的值,字段3的值, ....);为了后续的实验方便,我们造一些数据,使用insert向表中新增记录
-- the INSERT statementdesc deptinsert into dept values(1,'Development','NEW YORK');insert into dept(deptno,dname,loc) values(2,'Testing','CHICAGO');insert into dept(deptno,dname) values(3,'Marketing');
使用INSERT向表中增加记录的第一种写法是把每个字段值都写出来。
mysql> desc employees;+----------+--------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+----------+--------------+------+-----+---------+-------+| empno | int | NO | PRI | NULL | || name | char(10) | NO | | NULL | || deptno | int | YES | | NULL | || email | varchar(20) | YES | | NULL | || hire_date | date | YES | | NULL | || salary | decimal(8,2) | YES | | 8000.00 | |+----------+--------------+------+-----+---------+-------+6 rows in set (0.01 sec)-- 也可以用describe employees命令 mysql> insert into employees values(12,'刘国强',1,'liuguoqiang@qq.com','2010-04-12',11000.00);Query OK, 1 row affected (0.00 sec)
这个表有6个字段,这里列出了6个字段的值。如果字段数量或者类型不匹配,insert语句会失败,例如少了一个salary字段,或者字段类型错误。
为了后续的实验方便,我们造一些数据,使用insert向表中新增记录
-- 向员工表中插入记录insert into emp values(1,'Grace',1,'2000-12-02',12000.00,0);insert into emp values(2,'Joe',1,'2013-01-03',9100.00,0); insert into emp values(3,'John',2,'2021-02-10',8900.00,null); insert into emp values(4,'Lisa',2,'2022-12-1',11000.00,null);insert into emp values(5,'Ben',3,'2004-09-11',8000.00,9000.00);
我们把前面的脚本汇总起来在4中数据库上建立一个学习环境:
可以看到没有输入的字段都是NULL(空值),但工资是默认值,也可以用default关键字代替默认值。
插入多行(Oracle不支持)
insert into employees(empno,name) values(15,'曾国强'),(16,'aaa');d
批量插入
insert into job_history select * from job_history;select * from job_history;
(未完,请查看SQL语言(二))