关于号主,姚远:
Oracle ACE(Oracle和MySQL数据库方向)。
Oracle MAA 大师。
华为云MVP。
《MySQL 8.0运维与优化》的作者。
拥有 Oracle 10g和12c OCM等20+数据库认证。
曾任IBM公司数据库部门经理。
20+年DBA经验,服务2万+客户。
01
—
课程说明
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
—
实验环境
$ export NLS_LANG=american_america.AL32UTF8
$ export LANG=zh_CN.UTF-8
alter 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 TABLE
create table dept(
deptno int primary key,
dname varchar(12) not null,
loc char(10)
);
复制
在创建表之前加一个drop表的语句,是因为在整个课程的练习中会使用对数据进行修改,需要执行这些脚本将数据恢复到初始状态。
创建员工表
下面的SQL语句创建员工表:
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插入记录
-- the INSERT statement
desc dept
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');
复制
使用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语言(二))
欢迎加我的微信,拉你进数据库微信群👇
推荐文章👇
托业890分的Oracle ACE为您翻译国际大佬的雄文(合集)