Bootstrap

重温mysql


相关sql在文章底部

数据库设计

1. 关系模式设计

引例

教务系统数据库,存储学生信息,涉及的字段有
学生学号Sno所在系Sdept系主任名字Mname课程号Cno成绩Grade

语义:

  1. 一个系有若干个学生,一个学生属于一个系
  2. 一个系只有一名(正)系主任
  3. 一个学生可选修多门课
  4. 每个学生所学每门课程都有一个成绩

假设关系模式为:
student(Sno,Sdept,Mname,Cno,Grade) (意思是student为一个表,表中字段为括号内属性)

得到一个实体表如下:
在这里插入图片描述上述例子有什么问题?

  1. 数据冗余度大,浪费存储空间
    系主任名字重复出现,重复次数与该系所有学生所有课程成绩出现的次数相同。(假设该系只有一个学生,但是该学生选择了10门课,由于每门课都有成绩,因此该学生一人就需要十条记录
  2. 更新异常(Update Anomalies)
    数据冗余,更新数据时,维护数据完整性的代价太大:如果某系更换系主任,系统必须修改与该系学生有关的一个元组
  3. 插入异常(Insertion Anomalies)
    如果新成立一个系,还没有招生,我们就无法把这个系的系主任信息保存进去(因为一条记录必须包含学生的信息)
  4. 删除异常(Deletion Anomalies)
    如果某个系的学生全部毕业了,我们删除该同学的信息的同时,将系主任的信息也删除了。

以上,设计一个好的关系模式,不应该出现上述4种情况。
这些情况,都是由于数据依赖引起的。

解决办法:
将上述单一模式分成三个关系模式;
学生表 S(Sno,Sdept,Sno->Sdept)
系表 DEPT(Sdept,Mname,Sdept->Mname)
课程表 SC(Sno,Cno,Grade,(Sno,Cno)->Grade)

看不懂没关系,下面进行解释

什么是数据依赖?

函数y=f(x), 自变量x确定一个唯一的y,此时称“x函数确定y”,也称“y函数依赖x”。

因此,找出数据之间的确定关系或依赖关系,就是数据依赖。

以上面的关系模式为例:
student(Sno,Sdept,Mname,Cno,Grade)
student(学号,系,系主任,课程,课程成绩)

  1. 一个学号确定一个系,Sdept=f(Sno) ,Sno->Sdept
  2. 一个系确定一个系主任,Mname=f(Sdept),Sdept->Mname
  3. 一门课程由学号和课程名确定,Grade=f((Sno,Cno)),(Sno,Cno)->Grade

箭头读作“(函数)确定”
(通过学号->系主任->系也是可以的)

由上得到一组函数依赖集合
F={Sno->Sdept, Sdept->Mname, (Sno,Cno)->Grade}
图示为:
在这里插入图片描述
数据依赖

  • 是现实世界属性间的相互联系
  • 是数据内在的性质
  • 语义的体现

数据依赖分为函数依赖,多值依赖,连接依赖等,主要学习函数依赖。

关系模式的形式化定义:
R(U, D, DOM, F)
R:关系名
U:属性集合
D:属性组U中的属性所来自的域
DOM:属性向域的映象集合
F:属性间的依赖关系集合

由于影响数据库模式设计的主要因素是U和F,因此可省略为三元组:
R<U, F>
当且仅当U上的一个关系实例r满足F时,称r为关系模式R<U,F>的一个关系;

关系模式student<U,F>
U={Sno, Sdept, Mname, Cno, Grade}
F={Sno->Sdept, Sdept->Mname, (Sno,Cno)->Grade}

student<U,F>=student(Sno, Sdept, Mname, Cno, Grade, Sno->Sdept, Sdept->Mname, (Sno,Cno)->Grade)

找出数据依赖之后,不一定完全合适,通过规范化理论,找出不合适的数据依赖并消除。

规范化

函数依赖

X->Y,唯一的一个X确定Y,称为X函数确定Y,或Y函数依赖于X。

函数依赖是根据语义来确定的:一个相同的数据库,设计者给出不同的数据规定,得出的函数依赖也不同,如可以规定学生不得重名,则学生姓名可以确定学生学号。

完全\部分 函数依赖:如果X的真子集也能确定Y,则称Y部分函数依赖于X;如果X的真子集不能确定Y,则称Y完全函数依赖于X;

实际上就是说,部分函数依赖中有冗余因素。

如:
(Sno,Cno)->Grade 是完全函数依赖
(Sno,Cno)->Sdept 是部分函数依赖,因为Cno其实是多余的。

传递函数依赖:如果X->Y,Y不是X的子集,Y不确定X,Y->Z,则X-传递>Z

在这里插入图片描述

如图可得:Sno-传递>Mname

码key,在数据库中又叫做键。

候选码:设K为关系模式R<U,F>中的属性或属性组合,若K完全确定U,则K为R的一个候选码(Candidate Key)。

通俗的说,若通过属性x就能确定一条记录,则x就是候选码。

主码:若有多个候选码,则选择一个作为主码(主键 primary key)

全码:当所有属性都是码的时候,称为全码。

据我观察,当一个表中字段间的关系为多对多时,必定是全码

外部码:foreign key,也就是外键。如何识别外键:A的普通属性x是B的码,则x是A的外键

范式

1NF∈2NF∈3NF∈BCNF∈4NF∈5NF

第一范式 1NF

这是数据库设计的最起码的要求。

如果一个关系模式R的所有属性都是不可分的基本数据项,则R∈1NF。

如属性家庭余额可以分成父亲工资母亲工资,则家庭余额不符合1NF。

第二范式 2NF

若R∈1NF,且每一个非主属性都完全函数依赖于R的码,则R∈2NF。

人话:函数依赖中不允许出现冗余项。

第三范式 3NF

不允许出现传递依赖,称为3NF。

BC范式 BCNF

X->Y,Y不是X的子集,X中必含有码,则满足BCNF。

2. ER图

ER图分为实体属性关系三个核心部分
图形表示分别是 长方形椭圆形菱形

1,实体(entity):数据模型中的数据对像,每个实体都有自己的实体成员或者说实体对象,例如学生实体包括张三,李四

2,属性(attribute):实体所具有的属性,例如学生具有姓名、学号、年级等属性,用椭圆形表示,属性分为唯一属性( unique attribute)和非唯一属性,唯一属性指的是唯一可用来标识该实体实例或者成员的属性,用下划线表示,一般来讲实体都至少有一个唯一属性。

3,关系(relationship):用来表现数据对象与数据对象之间的联系,例如学生的实体和成绩表的实体之间有一定的联系,每个学生都有自己的成绩表,这就是一种关系,关系用菱形来表示。

关系
(1)1对1(1:1):指对于实体集A与实体集B,A中的每一个实体至多与B中一个实体有关系;反之,在实体集B中的每个实体至多与实体集A中一个实体有关系。
(2)1对多(1:N):1对多关系是指实体集A与实体集B中至少有N(N>0)个实体有关系;并且实体集B中每一个实体至多与实体集A中一个实体有关系。
(3)多对多(M:N):多对多关系是指实体集A中的每一个实体与实体集B中至少有M(M>0)个实体有关系,并且实体集B中的每一个实体与实体集A中的至少N(N>0)个实体有关系。

ER图实例:
假设教学管理规定:

一个学生可选修多门课,一门课有若干学生选修;
一个教师可讲授多门课,一门课只有一个教师讲授;
一个学生选修一门课,仅有一个成绩。
学生的属性有学号、学生姓名;教师的属性有教师编号,教师姓名;课程的属性有课程号、课程名。

在这里插入图片描述

数据库操纵

起步命令

启动\终止服务

net start mysql
net stop mysql

登录数据库

mysql [-h 主机名 -p 端口号] -u root -p
\******

退出mysql:
exit;或ctrl+C

常见命令

# 查看所有数据库
show databases; 
# 使用数据库
use myemployees;
# 查看表;
show tables;
# 不切换数据库查看表
show tables from study;
# 查看表结构
desc jobs;
# 查看服务器版本
## 1. 已登录
select version();
## 2. 未登录
mysql -V (大写)

常用数据类型

# 常见数据类型
/*
数值型:
	整型:			字节
		tinyint			1  (0,255)
		smallint		2
		mediumint		3
		int					4
		bigint			8
		
		默认有符号、默认有长度、长度表示字符占位宽度,可以通过zerofill实现左填充零
		
	小数:
		浮点数:  		 字节
			float(m,d)    4
			double(m,d)   8
		定点数(高精度>>货币运算):
			dec(m,d)     m+2
		
		m和d可以省略,m表示总位数,d小数点位数,若超出总位数,则插入总位数的最大临界值
		float和double的m和d跟随实际数据进行变换
		dec带默认值,m=10,d=0
		
字符型:
	短文本:
		char(m) m可省略,默认为1
		varchar(m) m不可省略
	特点:
		m表示最多的字符数(一个中文也是一个字符)
		char 开辟固定m个字符空间,无论实际字符多长
		varchar 根据实际字符开辟空间
		char效率高,占空间、varchar相反,对于固定长度的(如性别),使用char
	其他:
		binary、varbinary 保存较短二进制
		枚举
		set集合
	
	长文本:text\blob(较长二进制数据)
	
(常用)日期型:  字节		范围			时区、sql版本影响
	datetime  :			8		1000-9999			 不受
	timestamp	:			4		1970-2038				受
	
其他协作关键字:
无符号:  数据类型 unsigned
零填充:  数据类型 zerofill  (加上这个,会自动带上无符号)
*/

1. DQL语言

data query language

1.1 基础查询

# 1. 基础查询
/*
语法:
SELECT 查询列表
FROM 表名;

特点:
1. 查询列表可以是:表中的字段、常量值、表达式、函数
2. 查询结果是一个虚拟的表

*/

# 选择操作数据库
USE myemployees;

# 1.1 查询单个字段
select last_name from employees;

# 1.2 查询多个字段
select last_name,salary,email from employees;

# 1.3 查询所有字段
select * from employees;

# 字段名可以用``包裹起来,用于区分关键字和字段名(比如当字段名为关键字NAME时,写为`NAME`)

# 1.4 查询常量值,常量值可以任意,返回结果为字段名和字段值都为该常量值
select 100;
select 'ddw';
# 1.5 查询表达式
select 100*2;
# 1.6 查询函数
select VERSION(); #查看数据库版本

# 1.7 起别名(更改字段名)
## 作用:
##	便于理解
##	连接查询中可能存在异表同名的字段,可用于区分
##	函数查询结果起别名必须用as
## 1.7.1 通过as给查询结果指定字段名
select 100*2 as 结果;
select last_name as 姓,first_name as 名 from employees;
## 1.7.2 as可以省略  (用逗号隔开的是查询字段,用空格隔开的是别名)
select last_name 姓,first_name 名 from employees;

# 1.8 去重
select distinct department_id from employees;

# 1.9 +号的作用
## sql中的+号,只能作为加法运算符;
##	两个操作数都为数值型,则做加法;
##	一个为数,一个为字符,则sql会试图将字符转换为数进行加法操作,'2'+3 = 5;
##	如果存在非数字字符,则sql会将其转换为0进行计算 , 'join'+1 = 1;
##  如果存在null,则结果为null  null+1 = null;

## 案例:查询员工名和姓连接成一个字段,并显示为 姓名
select first_name+last_name "姓名" from employees; # 查询结果全为零
## concat,连接字符串,如果存在null则返回结果为null
select concat(first_name,last_name) as "姓名" from employees; # 函数结果别名必须用as

# 1.10 显示表结构
desc departments;

# 1.11 IFNULL()
## 查询employees全部列,并用,连接结果,列头显示为out_put
## 由于部分字段存在null,如果直接用concat,会使存在null的行全为null
## 可以使用IFNULL(原字段,若为null则输出为)
## 查询结果全为null
select concat(first_name,',',last_name,',',commission_pct) as "out_put" from employees 
## 如果commission_pct为null,则设为0
select concat(first_name,',',last_name,',',IFNULL(commission_pct,0)) as "out_put" from employees 

1.2 条件查询


# 2. 条件查询
/*
语法:
SELECT 查询列表
FROM 表名
where 条件;

分类:
	1. 条件表达式: >、 <、 =、 !=、 <>、 >=、 <=  不能跟null进行比较
	2. 逻辑表达式: &&  ||  ! and or not(推荐)
	3. 模糊查询:like、between、and、in、is null、is not null
*/
# 2.1 条件表达式
## 查询工资>12000的员工
select * from employees where salary > 12000;
## 查询部门编号不等于90号的员工名和部门编号
select first_name,employee_id from employees where employee_id <> 90;

## 当查询需求比较复杂的时候,学会找到“的”后面的需求,然后将其抽象为字段
## “的员工” 查询需求为“全部员工”  字段为“全部字段”

# 2.2 逻辑表达式
## 查询工资在[10000,20000]之间的员工名和工资
select last_name,salary from employees where salary>=10000 and salary<=20000;
## 查询部门编号不在[90,110],或者工资高于15000的员工信息
## 注意:不在[90,110]内应该用or,而非and。因为不存在一个数既比90小,又比110大
select * from employees where employee_id<90 or employee_id>110 or salary>=15000;
## 或者
select * from employees where not(employee_id>=90 and employee_id<=110) or salary>=15000;

# 2.3 模糊查询
## 2.3.1 like
/*
通配符:
	% :任意多个字符
	_ :任意单个字符
	
通配符只能在like中使用
*/
## 查询员工名包含字符a的员工
select * from employees where first_name like '%a%';
## 查询员工名中第三个字符为e,第五个字符为a的员工名和工资
select first_name,salary from employees where first_name like '__e_a%';
## 查询员工名中第二个字符为_的员工名 (使用转义)
select first_name from employees where first_name like '_\_%';

## 2.3.2 between and
/*
1.更简洁的获得[a,b]区间值
2.包含临界值a,b
3.a,b不可调换顺序
*/
## 查询员工编号在100到120之间的员工信息
select * from employees where employee_id between 100 and 120;

## 2.3.3 in
## 查询员工的工种编号是 IT_PROG、AD_VP中的一个的员工名和工种编号
select first_name,job_id from employees where job_id in('IT_PROG','AD_VP');

## 2.3.4 is null  (sql中没有 = null、==null的说法)
## 查询没有奖金的员工和奖金率
select first_name,commission_pct from employees where commission_pct is null;
## 2.3.5 is not null (跟上面的用法一致)

## 2.3.5 安全等于,<=>,用于比较任意类型是否相等,包括null(可读性较低,用的比较少)
## 查询没有奖金的员工和奖金率
select first_name,commission_pct from employees where commission_pct <=> null;


## 小应用
## 查询员工号为176的员工的姓名和部门号和年薪
select first_name,department_id,salary*12*(1+IFNULL(commission_pct,0)) '年薪' from employees where employee_id=176;

1.3 排序查询

# 3. 排序查询
/*
语法:
select 查询列表
from 表
【where 条件】
order by 排序列表【asc|desc】
默认升序

特点:
	排序列表支持:单个字段、多个字段、表达式、函数、别名
	order by一般在最后,limit子句除外。
*/
##【基本】 查询员工信息,工资从高到低排序
select * from employees order by salary desc;

##【条件】 查询部门编号>=90的员工信息,按入职时间的先后进行排序
select * from employees where department_id >= 90 order by hiredate asc;

## 【表达式】 按年薪的高低显示员工的姓名和年薪
select concat(first_name,last_name) as "姓名", salary*12*(1+IFNULL(commission_pct,0)) as "年薪" from employees order by "年薪" desc;

## 【按姓名长度排序】 
select last_name, length(last_name) "长度" from employees order by "长度";

## 【多字段排序】 先按工资升序,再按员工编号降序排序  (逗号隔开多个排序需求)
select * from employees order by salary asc,employee_id desc;

1.4 常见函数

/*
调用:select 函数名(实参列表) 【from 表】【】;
分类:
	1. 单行函数(处理)
		字符函数
		数学函数
		日期函数
		其他函数
		流程控制函数
	2. 分组函数(统计函数、聚合函数、组函数)传入一组值,返回一个值
		sum()
		avg()
		max()
		min()
		count()
*/
单行函数
## 4.1 字符函数
	## length
	select length('张三丰abc'); #中午在utf8中占用3个
	## concat
	## upper、lower (大小写转换)
	## substr   #索引从1开始
	select substr('李莫愁与陆展元',5) as out_put;  # >陆展元 从指定索引处往后截取全部字符
	select substr('李莫愁与陆展元',1,3) as out_put;  # >李莫愁 从指定索引处往后截取指定长度
	## 姓名首字母大写,其他字母小写,用下划线拼接
	select first_name, concat(upper(substr(first_name,1,1)),'_',lower(substr(first_name,2))) as "name" from employees;
	## instr  ,返回首次出现的起始索引,如无则返回0
	## trim  去除前后空格,或者去掉前后指定的字符
	select trim('a' from 'aaaa张三丰aaaa');
	## lpad、rpad 用指定字符将元字符左(右)填充至指定长度,若给定的长度比原字符串短,原字符串会被截断
	select lpad('殷素素',10,'*') as out_put; # > *******殷素素
	## replace 将字符串中所有指定的字符串替换成其他字符串
	select replace('张无忌喜欢周芷若,周芷若','周芷若','赵敏') as out_put; # 两个周芷若都被替换成赵敏

## 4.2 数学函数
	## round(x) 取整四舍五入
	## round(x,n) 四舍五入保留n位小数
	## ceil(x),floor(x) 向上/下取整
	## truncate(x,n) 截断保留n位小数
	## mod(x,y) x%y 
	/*
	1. x%y == x-x/y*y   因为x/y的时候会被截断取整
	2. 取余结果的符号跟x一致,跟y无关
	*/

## 4.3 日期函数
	## now() 日期+时间
	## curdate() 日期
	## curtime() 时间
	## 获取指定部分
		# year(hiredate)
		# month(now())
		# monthname(now()) 返回英文名
	## str_to_date('前端传来的日期格式','与之匹配的日期格式') 将字符串转换成datetime对象
	## 查询入职日期为1992-4-3的员工信息,前端传来的日期格式为4,3 1992
	SELECT * from employees where hiredate = STR_TO_DATE('4,3 1992','%m,%d %Y');
	
	## date_format('datetime对象','想要转换的结果格式') 将datetime转换成字符串
	## 将当前时间转换成前端适用的日期格式 月,日 年
	select date_format(now(),'%m,%d %Y');
	
## 4.4 其他函数
	## version() 查看版本
	## database() 查看数据库名字
	## user() 查看用户@主机
	
## 4.5 流程控制函数
	## if(条件,'是则返回','否则返回') 函数,相当于三元运算符
	## 查询所有员工的名字,有奖金的给备注,没奖金的也给备注
	select first_name,if(commission_pct is null,'没奖金','有奖金') as "备注" from employees;
	
	## case 用法1,case后接东西,用于判断“等值”
	/*
	case 要判断的表达式
	when 常量1 then 要显示的值1或语句1
	when 常量2 then 要显示的值2或语句2
	else 要显示的默认值;
	end
	*/
	## 案例:查询员工的工资,要求
	/*
	部门号=30,工资则*1.1
	部门号=40,工资则*1.2
	部门号=50,工资则*1.3
	其他,工资则*1.4
	*/
SELECT first_name, salary as "原始工资",department_id,
CASE department_id
	WHEN 30 THEN
		salary*1.1
	WHEN 40 THEN
		salary*1.2
	WHEN 50 THEN
		salary*1.3
	ELSE
		salary*1.4
END as "新工资"
FROM employees;

	## case 用法2,case后不跟东西,用于判断“区间”
	/*
	case
	when 条件1 then 要显示的值1或语句1
	when 条件2 then 要显示的值2或语句2
	else 要显示的值n
	end
	*/
	## 案例
	/*
	如果工资>20000,显示A级别
	如果工资>15000,显示B级别
	如果工资>10000,显示B级别
	否则,显示D级别
	*/
select first_name,salary,
case
when salary>20000 then 'A级别'
when salary>15000 then 'B级别'
when salary>10000 then 'C级别'
else 'D级别'
end as "级别"
from employees;

在这里插入图片描述

分组函数
# 分组函数
# 特点
/*
1. 以上分组函数都忽略null值
2. 可以和distinct搭配实现去重运算
3. count用的最多
4. 与分组函数一同查询的字段有限制,一般要求只能是group by后的字段
*/
	# 分组函数的简单使用
	select sum(salary) from employees;
	select avg(salary) from employees;
	select min(salary) from employees;
	select max(salary) from employees;
	select count(salary) from employees;
	# 去重运算,查看有几种工资值
	select count(distinct salary),count(salary) from employees;
	
	# count的详细使用
		## 统计数据表行数
		select count(*) from employees;
		select count(1) from employees; # 加了n行1,统计1的个数
			## 效率
			#	MYISAM存储引擎下,count(*)最快,因为内置了计数器
			# INNODB存储引擎下,两个差不多,因此建议使用count(*)
	# 与分组函数一同查询的字段有限制,一般要求只能是group by后的字段
		# select avg(salary),employee_id from employees; 
		# 这个语句看似没毛病,但是实际上,求出的均值不可能有对应的id

1.5 分组查询

# 5. 分组查询
/*
语法:
select 分组函数,列(要求出现在group by的后面)
from 表
【where 条件】
group by 分组列表
【order by】

注意:
	查询列表必须是分组函数和group by后出现的字段
	
特点:
	分组查询中的条件有两种
	分组前筛选:条件在原始表中,用where
	分组后筛选:条件在虚拟表中,追加having
*/
## 简单分组查询
	## 查询每个部门的平均工资
	select avg(salary) as "平均工资",job_id from employees group by job_id;
	## 查询每个工种的最高工资
	select max(salary),job_id from employees group by job_id;
	## 查询每个位置上的部门个数
	select count(*),location_id from departments group by location_id;
## 添加筛选条件
## 查询邮箱中包含a字符的,每个部门的平均工资
select avg(salary),department_id from employees where email like '%a%' group by department_id;
## 查询有奖金的每个领导手下员工的最高工资
select max(salary),manager_id from employees where commission_pct is not null group by manager_id;

## 上述的条件,都是原始表查询到结果集
## 有些问题,需要先进行查询,得到一张虚拟表,然后根据这个虚拟表再进行查询,才能获得结果集
## 如:查询哪个部门的员工个数>2
#1. 查询每个部门的员工个数,得到员工个数虚拟表(原始表中看不出员工个数)
select count(*) as "员工个数",department_id from employees group by department_id;
#2. 根据1的结果进行筛选,查询哪个部门的员工个数>2
select count(*) as "员工个数",department_id from employees  where "员工个数">2 group by department_id;
# 上述这种写法是错误的,看似逻辑正确,但是记住一个原则“一个select只有一个查询表对象”,
#而此时的查询表对象为原始表,原始表是不存在“员工个数”这个对象的,此时应该是对虚拟表追加的查询
# 因此,在语句后面追加having子句
## 如果后面的别名用双引号和单引号,都会查不出结果,原因未知,建议坚持使用反引号
select count(*) as `员工个数`,department_id from employees group by department_id having `员工个数`>2;

## having实例
	## 查询每个工种有奖金的员工的最高工资>12000的工种编号和最高工资
	# 有无奖金是原始表条件(where),最高工资>12000是虚拟表条件(having)
	select job_id,max(salary) `最高工资` from employees where commission_pct is not null group by job_id having `最高工资`>12000;

	## 查询领导编号>102的每个领导手下的最低工资>5000的领导编号是哪个,以及其最低工资
	## 领导编号>102是原始表条件(where),最低工资>5000是虚拟表条件(having)
	select manager_id `领导编号`,min(salary) `最低工资` from employees where manager_id>102 group by manager_id having `最低工资`>5000;

## 按表达式(函数)分组
	# 根据员工姓名的长度不同,给出每一组的员工个数大于5的结果集
	select count(*) `员工个数`,length(first_name) `姓名长度` from employees group by length(first_name) having `员工个数`>5;

## 按多个字段分组
# 查询每个部门每个工种的员工的平均工资
select avg(salary) `平均工资`,department_id,job_id from employees group by department_id,job_id;

## 排序分组
# 查询每个部门每个工种的员工的拍平均工资,并案平均工资的高低显示
select avg(salary) `平均工资`,department_id,job_id from employees group by department_id,job_id order by `平均工资`;

1.6 连接查询(多表查询)

# 6. 连接查询
/*
特点:
	from后跟多个表名
	多个表中有相同字段名的,需要用表名.字段名进行访问,可以用from 表名 as 别名
		然后用别名.字段名的形式
	from的执行顺序高于select,因此from中用了别名,则select中也必须用别名

分类:
	按年代分类:
		sql92标准、sql99标准(推荐)
	按功能分类:
		内连接:
			等值连接、非等值连接、自连接
		外连接:
			左外连接、右外连接、全外连接(mysql不支持)
		交叉连接
*/
## 下面这种查询方式,会将每一个girl与其他所有boy进行连接,返回一个n*m条数据
## 如girl=(a,b) boy=(c,d),则查询结果为((a,c),(a,d),(b,c),(b,d)) 笛卡尔积
select girlName,boyName from girls,boys;

##一、sql92标准
# 1. 等值连接
# 查询女生和对应男生名字 (用girls表中的boyfriend_id去跟boys表的id进行一一匹配)
select girlName,boyName from girls,boys where girls.boyfriend_id = boys.id;

# 查询员工名和对应的部门名
select first_name,department_name from employees,departments where employees.department_id=departments.department_id;

# 查询员工名、工种号、工种名
select first_name,e.job_id,job_title from employees as e,jobs as j where e.job_id=j.job_id;

# 加筛选,查询有奖金的员工名和部门名
select last_name,department_name,commission_pct from employees as e,departments as d where e.department_id=d.department_id and commission_pct is not null;

# 查询城市名中第二字符为o的部门名和城市名
select department_name,city from departments d,locations l where city like '_o%' and d.location_id=l.location_id;

# 加分组 查询每个城市的部门个数
select count(*),city from departments d, locations l where d.location_id=l.location_id group by city;

# 查询有奖金的每个部门的部门名和部门的领导编号以及该部门的最低工资
select department_name,d.manager_id,min(salary) from departments d,employees e where commission_pct is not null and d.department_id=e.department_id group by department_name,d.manager_id;

## 多表等值连接
# 查询员工名、部门名和所在城市
select last_name,department_name,city from employees e, departments d,locations l where e.department_id=d.department_id and d.location_id=l.location_id;

# 非等值连接
# 假设有个表job_grade,字段包括id、grade、lowest、highest,表示在[lowest,highest]之间的给他一个级别
select salary,grade_level from employees e, job_grade g where salary between g.lowest and g.highest;

# 自连接
# 查询员工名和他上级的名称
# 1.先查一个虚拟表
select employee_id,first_name,manager_id from employees;
# 2.再将原始表与虚拟表进行连接查询
select e.employee_id,e.first_name,m.first_name as manager_name from employees e ,employees m where e.manager_id=m.employee_id;

##二、sql99语法
/*
语法:
select 查询列表
from 表1 别名 
【连接类型】join 表2 别名
on 连接条件
【where 筛选条件】
【group by】
【having】
【order by】

特点:
	与92语法不同就在于可读性更高,用on表示连接条件而不是放在where中,用join说明是连接查询
	92标准只支持简单的连接查询(内连接)

连接类型:
	内连接:inner 可以省略
	左/右外连接:left/right
	全外连接:full =内连接结果+表1有表2无+表1无+表2有
	交叉连接:cross 就是笛卡尔乘积结果
*/
#等值连接
#查询员工名和部门名
select first_name,department_name from employees e inner join departments d on e.department_id=d.department_id;

# 内连接:
#查询员工名和他上级的名称
select e.employee_id,e.first_name,m.first_name as manager_name from employees e join employees m on e.manager_id=m.employee_id;

# ※外连接
/*
查询一个表中有,另一个表中没有
特点:
	1.外连接查询结果一定包含主表所有记录
		如果从表有与之匹配的,则显示匹配值
		如果从表无与之匹配的,则显示null
		外连接查询结果=内连接查询+主表中有而从表没有的记录
	2.主表不是按大小,也不是按顺序决定:
		左外连接:左边是主表
		右外连接:右边是主表
*/
#查询没有男朋友的女生
# 没有加where筛选条件时,“外连接查询一定包含主表所有记录”,因此对于的b.id就是null,此时只显示b.id为null的,就查出了没有男朋友的女生
select girlName from girls g left join boys b on g.boyfriend_id=b.id where b.id is null;

# 查询哪个部门没有员工
#1. 左外连接查询到所有部门和员工
select department_name,employee_id from departments d left join employees e on d.department_id=e.department_id;
#2. 将员工为null的部门显示
select department_name as '没有员工的部门' from departments d left join employees e on d.department_id=e.department_id where employee_id is null;

# 查询部门名为SAL或IT的员工信息
select e.first_name, department_name from employees e join departments d on e.department_id=d.department_id where department_name in('SAL','IT');

# 小结:
/*
内连接:A ∩ B
基础外连接: A ∩ B ∪ A(基本不用)
	基础外连接上加条件:A-B (去掉交集部分)
*/

在这里插入图片描述
在这里插入图片描述

1.7 子查询

实现简单,但是效率太低,一般情况下都有替代方案,因此这里做个简单记录用于备查。(省略了较多知识点)

# 7.子查询(内查询、嵌套查询)
/*
出现在其他语句中的select语句
外部的查询语句称为主查询或外查询

分类:
	按子查询出现的位置:
		select后:仅支持标量子查询
		from后:表子查询
		(※) where、having后:标量(单行子查询)、列(多行子查询)、行 
		exists后:表子查询
	按结果集的行列数:
		标量子查询:结果集为单个数据
		列子查询:结果集为一列
		行子查询:结果集为一行
		表子查询:结果集为表
		
特点:
	子查询在小括号内
	子查询放在条件右侧
	标量子查询一般搭配条件运算符使用
	列子查询一般搭配 in\any\some\all使用

小结:
	子查询结果是一个值,用条件运算符连接
	子查询结果是多个值,用in
*/
# where/having后
# 1. 标量子查询(单行子查询)
# 谁的工资比Abel高?
select last_name from employees where salary>(select salary from employees where last_name='Abel');
# 2. 列子查询(多行子查询)
/*
in、not in 等于列表中的任意一个
any | some 和子查询返回的任意一个值进行比较,只要有一个成立即可
all  和子查询中的所有结果进行比较,必须所有都成立才行
*/
# 查询location_id是1400或1700的部门中的所有员工的姓名
## 用in关键字即可实现多行子查询
select first_name from employees where department_id in (select department_id from departments where location_id in(1400,1700));

#select后
# 查询每个部门的员工个数
select count(*),department_id from employees GROUP BY department_id;
select d.*, from departments d;

# exists后面
# exists(完整查询语句) 判断是否存在结果集,存在返回1,否则返回0;

1.8 分页查询(重点)

# 8. 分页查询
/*
语法:
	select 查询列表
	from 表
	【join type join 表2
	on 连接条件
	where 筛选条件
	group by 分组字段
	having 分组后筛选
	order by
	......
	】
	limit 【offset,】size;

offset:表示要显示的起始索引(从0开始)
size:要显示的条目个数
*/
# 查询前五条
select * from employees limit 0,5;
select * from employees limit 5;
# 查询第11~25条
# offset=10,size=25-10=14
select * from employees limit 10,15;
/*
分页公式:
显示页数page,每页条目size
limit (page-1)*size,size
设size=10
page	offset
	1			0
	2			10
	3			20
显然,offset=(page-1)*size
*/

1.9 联合查询

# 9. 联合查询
/*
union 联合、合并:将多个查询结果纵向合并成一个结果

应用场景:
	要查询的结果来自多个表,且多个表没有直接的连接关系,但是表的字段信息一致

特点:
	1. 多条查询语句的列字段(顺序、个数、类型)是一致的
	2. 会自动去重,如果不想去重,则使用union all
*/
# 查询部门编号>90或邮箱包含a的员工信息
# 普通实现方式
select * from employees where email like '%a%' or department_id>90;
# 联合实现
select * from employees where email like '%a%' union select * from employees where department_id>90;

2. DML语言

data manipulation language

# DML语言
/*
insert:
update:
delete:
*/
# 1. 插入insert
/*
语法:
	方式1.insert into 表名(列名,...) values(值,...);
	方式2.insert into 表名 set 列名=值,列名=值...;

方式1支持批量插入多行,方式2不行
	insert into 表名 values(第一列值),(第二列值),...;
方式1支持子查询,方式2不行(将查询结果集插入)
	insert into 表名 (字段1,字段2,字段3) select 值1,值2,值3 from xx where xx;


特点:
	插入的值的类型与字段类型一致或兼容
	列名声明了,但是后面又不想插的值,不能用,,忽略,用null
	字段顺序可不与数据库对应,字段与值的顺序对应即可
	如果不写列名,则默认填入所有列,且列顺序与数据库相同
*/

# 2. update
/*
1.修改单表记录
语法:
	update 表名 set 列=新值,列=新值,... where 条件;
执行顺序 update、where、set

2.修改多表记录【级联更新】
语法:
	update 表1 别名 inner|left join 表2 别名 on 条件 set 列=新值,列=新值,... where 条件;

当一个表变化时会引起另一个表的变化,就用级联更新
当需要通过连接查询到所需的虚拟表再进行更新时(就是需要通过特殊查询才能进行更新的情况)
*/

# 3. delete
/*
方式1:delete
	1.单表删除
	delete from 表名 where 条件; 删除整行记录
	2.多表删除(级联删除)
	delete 要删除的别名1,要删除的别名2 from 表1 别名1 inner|left join 表2 别名2 on 条件 where 条件;
	单表删除的delete from之间没有表名
	
方式2:truncate
truncate table 表名;  清空整个表

特点:
	1.尽管delete也能清空整个表,但是它不能重置自增主键,后续插入主键会从断点开始
	2.truncate能够重置主键为1
	3.delete有返回值删除n行
	4.trancate没有返回值
	5.truncate删除不能回滚,delete可以
*/

3. DDL语言

data define language
这个非专门的数据人员用不上,我直接跳过了。
但是课上老师让我整理笔记,我就顺便把课内的贴在这吧。

用的表为
student(sno,sname)
course(cno,cname)
sc(sno,cno,grade)

# DDL语言
/*
库和表的管理
库\表的创建、修改、删除

创建:create
修改:alter
删除:drop

表级操作
增
create table student(
	sno int primary key,
	sname varchar
);

改
--重命名
alter table student rename stu;

查
desc stu;

删
drop table stu;

列级操作
增
alter table stu add address varchar(10); 
--增加约束
alter table stu add unique(sname);
--增加检查约束
alter table stu add check(sage>16 and sage<30);
--增加外键约束
alter table teacher add foreign key(cno) references course(cno) 

改
--修改表列名,将sname改为sname_change
alter table stu change  column sname sname_change;
--修改表列类型
alter table stu modify sname char(10) ;
ALTER TABLE table_name ALTER COLUMN column_name datatype;
alter table teacher alter column cno char(4);
删
alter table stu drop  column address; 

*/

约束

# 常见约束
/*
含义:专门用于限制表中的数据,为了保证表中的数据的准确性可靠性(一致性)
语法:
create table 表名(
	字段名 字段类型 列级约束,)
	字段名 字段类型,
	表级约束
);

类型:六大约束
	1.非空约束 not null
	2.默认值 default  (保证不为null)
	3.主键约束 primary key  (保证唯一且不能为空,只能有一个主键约束) 如学号
	4.唯一约束 unique (保证唯一且可以为空,可以有多个唯一约束) 如座位号
	5.检查约束 check (mysql不支持,但不会报错) 用于约束值的范围
	6.外键约束 foreign key 保证从表该字段的值必须来自于主表的关联列的值
	(A中的某个字段的值必须来自于B表,则A添加外键约束,A为从表,B为主表)
	(比如学生的专业id(从表外键约束),与专业表的id一一对应(主表))

(外键添加位置:“多”的一方)
(外键设置要求:双方字段要求类型一样,包括无符号)
注意:
	1.主键约束和唯一约束的组合使用(不推荐使用):
		进行组合时,只有被组合的字段都相同时,才出错,否则都认为是唯一的
	2.外键主表的关联列必须是一个key(一般就是主键或唯一)
		插入数据时,必须先插入主表,再插入从表(先插无外键表)
		删除数据时,必须先删除从表,再删除主表(先删有外键表)
		(这个非常重要,否则数据无法正常插入和删除;根据这两条可以得知,ER图可以成环,只需要环的节点是多对多的中间表即可)
添加时的分类:
	列级约束:除了外键约束
	表级约束:除了非空、默认	
*/

# 实例
create table major(
	id int primary key,
	majorName varchar(20)
);
create table stuinfo(
	id int primary key,
	stuName varchar(20) not null,
	gender char(1) check(gender='男' or gender='女'),
	seat int unique,
	age int default 18,
	majorId int,
	foreign key (majorId) references major(id) # 外键
	#foreign key (从表字段) references 主表名(主表字段)
); 

4. TCL语言

transaction control language

事务控制语言:

事务的概念不再赘述

ACID性质:

  • 原子性
  • 一致性
  • 隔离性
  • 持久性
/*
隐式事务:
	insert update delete 自动开启事务
	即,对于单条语句,当插入、修改、删除出现错误时,会自动回滚
显式事务:
	1.禁用自动提交 set autocommit=0;
	2.进行语句
	3.提交语句 commit;
	
savepoint:
	set autocommit=0;
	sql1;
	sql2;
	savepoint a;
	sql3;
	rollback to a; #回滚到a处
*/

5. 视图

# 视图
/*
将一个复杂的搜索结果封装成一个虚拟表,就叫做视图。
视图是在被使用时才动态生成的,只保存了sql逻辑,而不是保存了数据

创建视图:
	set view 视图名 as 查询语句;
使用视图(视图就是一个表):
	select * from 视图 where 条件;
修改视图:
	create or replace view 视图名 as 查询语句;
	alter view 视图名 as 查询语句;
	drop view 视图名1,视图名2,...;
查看视图:
	desc 视图名;  查看视图(表)结构
	show create view 视图名;  查看视图的查询语句等信息

特点:
	一般来说,视图只用于查询,不用于更新。
	对简单的视图进行增删改,会同步操作原始表;
	对包含特定关键字的sql语句进行增删改,不会操作原始表;
	具体不在此展开,总之,视图尽量只用于查询。
	

优点:
	提高复用性
	简化sql操作,不必了解sql细节
	具体的字段都在视图中封装着,保护数据,提高安全性
*/
# 查询姓张的学生名和专业名
select stuname,majorname from stuinfo s inner join major m on s.majorId=m.id where s.stuname like "张%";

#设置视图
set view v1 as 
select stuname,majorname from stuinfo s inner join major m on s.majorId=m.id;

#使用视图(视图是一张虚拟表)
select * from v1 where s.stuname like "张%";

6. 索引

官方定义:索引(Index)是帮助MySQL高效获取数据的数据结构
可以将索引类比为字典。
如:
如果要查“mysql”这个单词,肯定是先定位m,再定位y,直到定位l。
如果没有索引,每次定位都需要遍历a~z。

索引是排好序的、可快速查找的、数据结构,因此索引会影响排序和查找。

在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式指向数据,这就可以在这些数据结构的基础上实现高级查找算法,这种数据结构就是索引。

在这里插入图片描述
右边的二叉排序树,每个节点包含数据编号(索引键值)和数据地址指针。

一般来说,索引都是指B树(多路搜索树,并不一定是二叉树)组织结构的索引。

一般来说索引本身也很大,不可能全部存储在内存中,因此通常存在磁盘上。

对数据的删除,可能导致索引紊乱,因此逻辑删除不仅仅是为了数据分析。

索引的优点:

  • 提高检索效率,降低IO成本(查找)
  • 降低排序成本,降低CPU消耗(排序)

索引的缺点:

  • 索引其实也是一张表,该表保存了主键和索引字段,并指向实体表的记录,也要占空间
  • 提高查找速度,降低更新速度。对表进行写操作(插入、更新、删除)时,都要调整索引
  • 索引只是提高效率的一个因素,但是建立优秀的索引需要大量的时间

索引的分类:

  • 单值索引:一个索引包含单个字段(一个表尽量不超过5个)
  • 唯一索引:索引值必须唯一,可以为空
  • 复合索引:一个索引包含多个字段

基本语法:

创建:
	CREATE 【UNIQUE】 INDEX indexName ON tableName(columnName(length));
	ALTER tableName ADD 【UNIQUE】 INDEX 【indexName】 ON (columnName(length));
删除:
	DROP INDEX 【indexName】 ON tableName;
查看:
	SHOW INDEX FROM tableName;

mysql索引结构:

  • BTree索引(Java主用)
  • Hash索引
  • full-text全文索引
  • R-Tree索引

什么情况下建立索引:

  • 主键自动建立唯一索引
  • 频繁作为查询条件的字段建立索引
  • 查询中与其他表关联的字段(外间关系)建立索引
  • 高并发下组合索引更好,而且组合索引更符合实际情况(索引的建立应该满足用户搜索需求,而用户的搜索,往往是多个字段条件)
  • 查询中排序的字段,加上索引能够大大提高排序速度
  • 查询中需要统计(分组)的字段(因为统计分组order by必先排序)

什么情况下不要创建索引:

  • where条件用不到的字段
  • 数十上百万记录,才有建立索引的价值
  • 经常增删改查的表不应该建立
  • 如果某个数据列包含很多重复内容,则索引基本没啥实际效果(数据的差异率不高)

索引效率计算:差异值/值总数=索引效率,越接近1越好

7. 存储过程与函数

前置知识 变量

# 变量
/*
系统变量:
	系统提供的、服务器层面;
	1.查看所有的系统变量
		show global variables;
		show 【session】 variables;
	全局变量
	会话变量
自定义变量:
	用户变量
	局部变量
*/
存储过程:
	含义:一组预先编译好的sql语句的集合
	解释:
		“一组” ==> 因此它具有封装性质,提高代码复用性,简化操作
		“预先编译” ==> 减少编译次数,减少与数据库连接的次数,提高效率
	语法:
		CREATE PROCEDURE 过程名(参数列表)
		BEGIN
			存储过程体(一组sql)
		END
	注意:
		参数列表包含三部分
			参数模式	参数名	参数类型
			如:IN stuname VARCHAR(20)
		参数模式:
			IN:调用方传入值
			OUT:作为返回值
			INOUT:就需要传入,同时也作为返回值
		如果存储过程体只有一句sql,则BEGIN和END可以省略;
		
		存储过程体中的每条sql都需要加上分号,
		但是分号又是整个sql语法的结束标志,会直接结束分号后的所有语句,
		因此,使用`DELIMITER $` 将结束标志更改为$
	调用方法:
		CALL 过程名(实参列表);

案例:
DELIMITER $  # 将结束符号改为 $
CREATE PROCEDURE myp1()
BEGIN
	INSERT INTO user(username,psw)
	VALUES('john','123');
END $  # 使用$结束语句

容易犯的逻辑错误

## 查询部门编号不在[90,110],或者工资高于15000的员工信息
## 注意:不在[90,110]内应该用or,而非and。因为不存在一个数既比90小,又比110大
select * from employees where employee_id<90 or employee_id>110 or salary>=15000;
## str_to_date('前端传来的日期格式','与之匹配的日期格式') 将字符串转换成datetime对象
## 查询入职日期为1992-4-3的员工信息,前端传来的日期格式为4,3 1992
SELECT * from employees where hiredate = STR_TO_DATE('4,3 1992','%m,%d %Y');

## date_format('datetime对象','想要转换的结果格式') 将datetime转换成字符串
## 将当前时间转换成前端适用的日期格式 月,日 年
select date_format(now(),'%m,%d %Y');

尽管数据库的表面存储形式是'1992-4-3'的字符串,但实际上是datatime格式,因此,将‘4,3 1992’进行对应的格式化匹配即可进行数据库查询

上述两个函数,一个是将“数据库对象”转成“前端可用的字符串”,一个是将“前端用的字符串”转成“数据库存储的对象”
# 与分组函数一同查询的字段有限制,一般要求只能是group by后的字段
# select avg(salary),employee_id from employees; 
# 这个语句看似没毛病,但是实际上,求出的均值不可能有对应的id
## 有些问题,需要先进行查询,得到一张虚拟表,然后根据这个虚拟表再进行查询,才能获得结果集
## 如:查询哪个部门的员工个数>2
#1. 查询每个部门的员工个数,得到员工个数虚拟表(原始表中看不出员工个数)
select count(*) as "员工个数",department_id from employees group by department_id;
#2. 根据1的结果进行筛选,查询哪个部门的员工个数>2
select count(*) as "员工个数",department_id from employees  where "员工个数">2 group by department_id;
# 上述这种写法是错误的,看似逻辑正确,但是记住一个原则“一个select只有一个查询表对象”,
#而此时的查询表对象为原始表,原始表是不存在“员工个数”这个对象的,此时应该是对虚拟表追加的查询
# 因此,在语句后面追加having子句
## 如果后面的别名用双引号和单引号,都会查不出结果,原因未知,建议坚持使用反引号
select count(*) as `员工个数`,department_id from employees group by department_id having `员工个数`>2;
from的执行顺序高于select,因此from中用了别名,则select中也必须用别名
/*
分页公式:
显示页数page,每页条目size
limit (page-1)*size,size
设size=10
page	offset
	1			0
	2			10
	3			20
显然,offset=(page-1)*size
*/

SQL准备

/*
SQLyog Ultimate v10.00 Beta1
MySQL - 5.5.15 : Database - myemployees
*********************************************************************
*/


/*!40101 SET NAMES utf8 */;

/*!40101 SET SQL_MODE=''*/;

/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/`myemployees` /*!40100 DEFAULT CHARACTER SET gb2312 */;

USE `myemployees`;

/*Table structure for table `departments` */

DROP TABLE IF EXISTS `departments`;

CREATE TABLE `departments` (
  `department_id` int(4) NOT NULL AUTO_INCREMENT,
  `department_name` varchar(3) DEFAULT NULL,
  `manager_id` int(6) DEFAULT NULL,
  `location_id` int(4) DEFAULT NULL,
  PRIMARY KEY (`department_id`),
  KEY `loc_id_fk` (`location_id`),
  CONSTRAINT `loc_id_fk` FOREIGN KEY (`location_id`) REFERENCES `locations` (`location_id`)
) ENGINE=InnoDB AUTO_INCREMENT=271 DEFAULT CHARSET=gb2312;

/*Data for the table `departments` */

insert  into `departments`(`department_id`,`department_name`,`manager_id`,`location_id`) values (10,'Adm',200,1700),(20,'Mar',201,1800),(30,'Pur',114,1700),(40,'Hum',203,2400),(50,'Shi',121,1500),(60,'IT',103,1400),(70,'Pub',204,2700),(80,'Sal',145,2500),(90,'Exe',100,1700),(100,'Fin',108,1700),(110,'Acc',205,1700),(120,'Tre',NULL,1700),(130,'Cor',NULL,1700),(140,'Con',NULL,1700),(150,'Sha',NULL,1700),(160,'Ben',NULL,1700),(170,'Man',NULL,1700),(180,'Con',NULL,1700),(190,'Con',NULL,1700),(200,'Ope',NULL,1700),(210,'IT ',NULL,1700),(220,'NOC',NULL,1700),(230,'IT ',NULL,1700),(240,'Gov',NULL,1700),(250,'Ret',NULL,1700),(260,'Rec',NULL,1700),(270,'Pay',NULL,1700);

/*Table structure for table `employees` */

DROP TABLE IF EXISTS `employees`;

CREATE TABLE `employees` (
  `employee_id` int(6) NOT NULL AUTO_INCREMENT,
  `first_name` varchar(20) DEFAULT NULL,
  `last_name` varchar(25) DEFAULT NULL,
  `email` varchar(25) DEFAULT NULL,
  `phone_number` varchar(20) DEFAULT NULL,
  `job_id` varchar(10) DEFAULT NULL,
  `salary` double(10,2) DEFAULT NULL,
  `commission_pct` double(4,2) DEFAULT NULL,
  `manager_id` int(6) DEFAULT NULL,
  `department_id` int(4) DEFAULT NULL,
  `hiredate` datetime DEFAULT NULL,
  PRIMARY KEY (`employee_id`),
  KEY `dept_id_fk` (`department_id`),
  KEY `job_id_fk` (`job_id`),
  CONSTRAINT `dept_id_fk` FOREIGN KEY (`department_id`) REFERENCES `departments` (`department_id`),
  CONSTRAINT `job_id_fk` FOREIGN KEY (`job_id`) REFERENCES `jobs` (`job_id`)
) ENGINE=InnoDB AUTO_INCREMENT=207 DEFAULT CHARSET=gb2312;

/*Data for the table `employees` */

insert  into `employees`(`employee_id`,`first_name`,`last_name`,`email`,`phone_number`,`job_id`,`salary`,`commission_pct`,`manager_id`,`department_id`,`hiredate`) values (100,'Steven','K_ing','SKING','515.123.4567','AD_PRES',24000.00,NULL,NULL,90,'1992-04-03 00:00:00'),(101,'Neena','Kochhar','NKOCHHAR','515.123.4568','AD_VP',17000.00,NULL,100,90,'1992-04-03 00:00:00'),(102,'Lex','De Haan','LDEHAAN','515.123.4569','AD_VP',17000.00,NULL,100,90,'1992-04-03 00:00:00'),(103,'Alexander','Hunold','AHUNOLD','590.423.4567','IT_PROG',9000.00,NULL,102,60,'1992-04-03 00:00:00'),(104,'Bruce','Ernst','BERNST','590.423.4568','IT_PROG',6000.00,NULL,103,60,'1992-04-03 00:00:00'),(105,'David','Austin','DAUSTIN','590.423.4569','IT_PROG',4800.00,NULL,103,60,'1998-03-03 00:00:00'),(106,'Valli','Pataballa','VPATABAL','590.423.4560','IT_PROG',4800.00,NULL,103,60,'1998-03-03 00:00:00'),(107,'Diana','Lorentz','DLORENTZ','590.423.5567','IT_PROG',4200.00,NULL,103,60,'1998-03-03 00:00:00'),(108,'Nancy','Greenberg','NGREENBE','515.124.4569','FI_MGR',12000.00,NULL,101,100,'1998-03-03 00:00:00'),(109,'Daniel','Faviet','DFAVIET','515.124.4169','FI_ACCOUNT',9000.00,NULL,108,100,'1998-03-03 00:00:00'),(110,'John','Chen','JCHEN','515.124.4269','FI_ACCOUNT',8200.00,NULL,108,100,'2000-09-09 00:00:00'),(111,'Ismael','Sciarra','ISCIARRA','515.124.4369','FI_ACCOUNT',7700.00,NULL,108,100,'2000-09-09 00:00:00'),(112,'Jose Manuel','Urman','JMURMAN','515.124.4469','FI_ACCOUNT',7800.00,NULL,108,100,'2000-09-09 00:00:00'),(113,'Luis','Popp','LPOPP','515.124.4567','FI_ACCOUNT',6900.00,NULL,108,100,'2000-09-09 00:00:00'),(114,'Den','Raphaely','DRAPHEAL','515.127.4561','PU_MAN',11000.00,NULL,100,30,'2000-09-09 00:00:00'),(115,'Alexander','Khoo','AKHOO','515.127.4562','PU_CLERK',3100.00,NULL,114,30,'2000-09-09 00:00:00'),(116,'Shelli','Baida','SBAIDA','515.127.4563','PU_CLERK',2900.00,NULL,114,30,'2000-09-09 00:00:00'),(117,'Sigal','Tobias','STOBIAS','515.127.4564','PU_CLERK',2800.00,NULL,114,30,'2000-09-09 00:00:00'),(118,'Guy','Himuro','GHIMURO','515.127.4565','PU_CLERK',2600.00,NULL,114,30,'2000-09-09 00:00:00'),(119,'Karen','Colmenares','KCOLMENA','515.127.4566','PU_CLERK',2500.00,NULL,114,30,'2000-09-09 00:00:00'),(120,'Matthew','Weiss','MWEISS','650.123.1234','ST_MAN',8000.00,NULL,100,50,'2004-02-06 00:00:00'),(121,'Adam','Fripp','AFRIPP','650.123.2234','ST_MAN',8200.00,NULL,100,50,'2004-02-06 00:00:00'),(122,'Payam','Kaufling','PKAUFLIN','650.123.3234','ST_MAN',7900.00,NULL,100,50,'2004-02-06 00:00:00'),(123,'Shanta','Vollman','SVOLLMAN','650.123.4234','ST_MAN',6500.00,NULL,100,50,'2004-02-06 00:00:00'),(124,'Kevin','Mourgos','KMOURGOS','650.123.5234','ST_MAN',5800.00,NULL,100,50,'2004-02-06 00:00:00'),(125,'Julia','Nayer','JNAYER','650.124.1214','ST_CLERK',3200.00,NULL,120,50,'2004-02-06 00:00:00'),(126,'Irene','Mikkilineni','IMIKKILI','650.124.1224','ST_CLERK',2700.00,NULL,120,50,'2004-02-06 00:00:00'),(127,'James','Landry','JLANDRY','650.124.1334','ST_CLERK',2400.00,NULL,120,50,'2004-02-06 00:00:00'),(128,'Steven','Markle','SMARKLE','650.124.1434','ST_CLERK',2200.00,NULL,120,50,'2004-02-06 00:00:00'),(129,'Laura','Bissot','LBISSOT','650.124.5234','ST_CLERK',3300.00,NULL,121,50,'2004-02-06 00:00:00'),(130,'Mozhe','Atkinson','MATKINSO','650.124.6234','ST_CLERK',2800.00,NULL,121,50,'2004-02-06 00:00:00'),(131,'James','Marlow','JAMRLOW','650.124.7234','ST_CLERK',2500.00,NULL,121,50,'2004-02-06 00:00:00'),(132,'TJ','Olson','TJOLSON','650.124.8234','ST_CLERK',2100.00,NULL,121,50,'2004-02-06 00:00:00'),(133,'Jason','Mallin','JMALLIN','650.127.1934','ST_CLERK',3300.00,NULL,122,50,'2004-02-06 00:00:00'),(134,'Michael','Rogers','MROGERS','650.127.1834','ST_CLERK',2900.00,NULL,122,50,'2002-12-23 00:00:00'),(135,'Ki','Gee','KGEE','650.127.1734','ST_CLERK',2400.00,NULL,122,50,'2002-12-23 00:00:00'),(136,'Hazel','Philtanker','HPHILTAN','650.127.1634','ST_CLERK',2200.00,NULL,122,50,'2002-12-23 00:00:00'),(137,'Renske','Ladwig','RLADWIG','650.121.1234','ST_CLERK',3600.00,NULL,123,50,'2002-12-23 00:00:00'),(138,'Stephen','Stiles','SSTILES','650.121.2034','ST_CLERK',3200.00,NULL,123,50,'2002-12-23 00:00:00'),(139,'John','Seo','JSEO','650.121.2019','ST_CLERK',2700.00,NULL,123,50,'2002-12-23 00:00:00'),(140,'Joshua','Patel','JPATEL','650.121.1834','ST_CLERK',2500.00,NULL,123,50,'2002-12-23 00:00:00'),(141,'Trenna','Rajs','TRAJS','650.121.8009','ST_CLERK',3500.00,NULL,124,50,'2002-12-23 00:00:00'),(142,'Curtis','Davies','CDAVIES','650.121.2994','ST_CLERK',3100.00,NULL,124,50,'2002-12-23 00:00:00'),(143,'Randall','Matos','RMATOS','650.121.2874','ST_CLERK',2600.00,NULL,124,50,'2002-12-23 00:00:00'),(144,'Peter','Vargas','PVARGAS','650.121.2004','ST_CLERK',2500.00,NULL,124,50,'2002-12-23 00:00:00'),(145,'John','Russell','JRUSSEL','011.44.1344.429268','SA_MAN',14000.00,0.40,100,80,'2002-12-23 00:00:00'),(146,'Karen','Partners','KPARTNER','011.44.1344.467268','SA_MAN',13500.00,0.30,100,80,'2002-12-23 00:00:00'),(147,'Alberto','Errazuriz','AERRAZUR','011.44.1344.429278','SA_MAN',12000.00,0.30,100,80,'2002-12-23 00:00:00'),(148,'Gerald','Cambrault','GCAMBRAU','011.44.1344.619268','SA_MAN',11000.00,0.30,100,80,'2002-12-23 00:00:00'),(149,'Eleni','Zlotkey','EZLOTKEY','011.44.1344.429018','SA_MAN',10500.00,0.20,100,80,'2002-12-23 00:00:00'),(150,'Peter','Tucker','PTUCKER','011.44.1344.129268','SA_REP',10000.00,0.30,145,80,'2014-03-05 00:00:00'),(151,'David','Bernstein','DBERNSTE','011.44.1344.345268','SA_REP',9500.00,0.25,145,80,'2014-03-05 00:00:00'),(152,'Peter','Hall','PHALL','011.44.1344.478968','SA_REP',9000.00,0.25,145,80,'2014-03-05 00:00:00'),(153,'Christopher','Olsen','COLSEN','011.44.1344.498718','SA_REP',8000.00,0.20,145,80,'2014-03-05 00:00:00'),(154,'Nanette','Cambrault','NCAMBRAU','011.44.1344.987668','SA_REP',7500.00,0.20,145,80,'2014-03-05 00:00:00'),(155,'Oliver','Tuvault','OTUVAULT','011.44.1344.486508','SA_REP',7000.00,0.15,145,80,'2014-03-05 00:00:00'),(156,'Janette','K_ing','JKING','011.44.1345.429268','SA_REP',10000.00,0.35,146,80,'2014-03-05 00:00:00'),(157,'Patrick','Sully','PSULLY','011.44.1345.929268','SA_REP',9500.00,0.35,146,80,'2014-03-05 00:00:00'),(158,'Allan','McEwen','AMCEWEN','011.44.1345.829268','SA_REP',9000.00,0.35,146,80,'2014-03-05 00:00:00'),(159,'Lindsey','Smith','LSMITH','011.44.1345.729268','SA_REP',8000.00,0.30,146,80,'2014-03-05 00:00:00'),(160,'Louise','Doran','LDORAN','011.44.1345.629268','SA_REP',7500.00,0.30,146,80,'2014-03-05 00:00:00'),(161,'Sarath','Sewall','SSEWALL','011.44.1345.529268','SA_REP',7000.00,0.25,146,80,'2014-03-05 00:00:00'),(162,'Clara','Vishney','CVISHNEY','011.44.1346.129268','SA_REP',10500.00,0.25,147,80,'2014-03-05 00:00:00'),(163,'Danielle','Greene','DGREENE','011.44.1346.229268','SA_REP',9500.00,0.15,147,80,'2014-03-05 00:00:00'),(164,'Mattea','Marvins','MMARVINS','011.44.1346.329268','SA_REP',7200.00,0.10,147,80,'2014-03-05 00:00:00'),(165,'David','Lee','DLEE','011.44.1346.529268','SA_REP',6800.00,0.10,147,80,'2014-03-05 00:00:00'),(166,'Sundar','Ande','SANDE','011.44.1346.629268','SA_REP',6400.00,0.10,147,80,'2014-03-05 00:00:00'),(167,'Amit','Banda','ABANDA','011.44.1346.729268','SA_REP',6200.00,0.10,147,80,'2014-03-05 00:00:00'),(168,'Lisa','Ozer','LOZER','011.44.1343.929268','SA_REP',11500.00,0.25,148,80,'2014-03-05 00:00:00'),(169,'Harrison','Bloom','HBLOOM','011.44.1343.829268','SA_REP',10000.00,0.20,148,80,'2014-03-05 00:00:00'),(170,'Tayler','Fox','TFOX','011.44.1343.729268','SA_REP',9600.00,0.20,148,80,'2014-03-05 00:00:00'),(171,'William','Smith','WSMITH','011.44.1343.629268','SA_REP',7400.00,0.15,148,80,'2014-03-05 00:00:00'),(172,'Elizabeth','Bates','EBATES','011.44.1343.529268','SA_REP',7300.00,0.15,148,80,'2014-03-05 00:00:00'),(173,'Sundita','Kumar','SKUMAR','011.44.1343.329268','SA_REP',6100.00,0.10,148,80,'2014-03-05 00:00:00'),(174,'Ellen','Abel','EABEL','011.44.1644.429267','SA_REP',11000.00,0.30,149,80,'2014-03-05 00:00:00'),(175,'Alyssa','Hutton','AHUTTON','011.44.1644.429266','SA_REP',8800.00,0.25,149,80,'2014-03-05 00:00:00'),(176,'Jonathon','Taylor','JTAYLOR','011.44.1644.429265','SA_REP',8600.00,0.20,149,80,'2014-03-05 00:00:00'),(177,'Jack','Livingston','JLIVINGS','011.44.1644.429264','SA_REP',8400.00,0.20,149,80,'2014-03-05 00:00:00'),(178,'Kimberely','Grant','KGRANT','011.44.1644.429263','SA_REP',7000.00,0.15,149,NULL,'2014-03-05 00:00:00'),(179,'Charles','Johnson','CJOHNSON','011.44.1644.429262','SA_REP',6200.00,0.10,149,80,'2014-03-05 00:00:00'),(180,'Winston','Taylor','WTAYLOR','650.507.9876','SH_CLERK',3200.00,NULL,120,50,'2014-03-05 00:00:00'),(181,'Jean','Fleaur','JFLEAUR','650.507.9877','SH_CLERK',3100.00,NULL,120,50,'2014-03-05 00:00:00'),(182,'Martha','Sullivan','MSULLIVA','650.507.9878','SH_CLERK',2500.00,NULL,120,50,'2014-03-05 00:00:00'),(183,'Girard','Geoni','GGEONI','650.507.9879','SH_CLERK',2800.00,NULL,120,50,'2014-03-05 00:00:00'),(184,'Nandita','Sarchand','NSARCHAN','650.509.1876','SH_CLERK',4200.00,NULL,121,50,'2014-03-05 00:00:00'),(185,'Alexis','Bull','ABULL','650.509.2876','SH_CLERK',4100.00,NULL,121,50,'2014-03-05 00:00:00'),(186,'Julia','Dellinger','JDELLING','650.509.3876','SH_CLERK',3400.00,NULL,121,50,'2014-03-05 00:00:00'),(187,'Anthony','Cabrio','ACABRIO','650.509.4876','SH_CLERK',3000.00,NULL,121,50,'2014-03-05 00:00:00'),(188,'Kelly','Chung','KCHUNG','650.505.1876','SH_CLERK',3800.00,NULL,122,50,'2014-03-05 00:00:00'),(189,'Jennifer','Dilly','JDILLY','650.505.2876','SH_CLERK',3600.00,NULL,122,50,'2014-03-05 00:00:00'),(190,'Timothy','Gates','TGATES','650.505.3876','SH_CLERK',2900.00,NULL,122,50,'2014-03-05 00:00:00'),(191,'Randall','Perkins','RPERKINS','650.505.4876','SH_CLERK',2500.00,NULL,122,50,'2014-03-05 00:00:00'),(192,'Sarah','Bell','SBELL','650.501.1876','SH_CLERK',4000.00,NULL,123,50,'2014-03-05 00:00:00'),(193,'Britney','Everett','BEVERETT','650.501.2876','SH_CLERK',3900.00,NULL,123,50,'2014-03-05 00:00:00'),(194,'Samuel','McCain','SMCCAIN','650.501.3876','SH_CLERK',3200.00,NULL,123,50,'2014-03-05 00:00:00'),(195,'Vance','Jones','VJONES','650.501.4876','SH_CLERK',2800.00,NULL,123,50,'2014-03-05 00:00:00'),(196,'Alana','Walsh','AWALSH','650.507.9811','SH_CLERK',3100.00,NULL,124,50,'2014-03-05 00:00:00'),(197,'Kevin','Feeney','KFEENEY','650.507.9822','SH_CLERK',3000.00,NULL,124,50,'2014-03-05 00:00:00'),(198,'Donald','OConnell','DOCONNEL','650.507.9833','SH_CLERK',2600.00,NULL,124,50,'2014-03-05 00:00:00'),(199,'Douglas','Grant','DGRANT','650.507.9844','SH_CLERK',2600.00,NULL,124,50,'2014-03-05 00:00:00'),(200,'Jennifer','Whalen','JWHALEN','515.123.4444','AD_ASST',4400.00,NULL,101,10,'2016-03-03 00:00:00'),(201,'Michael','Hartstein','MHARTSTE','515.123.5555','MK_MAN',13000.00,NULL,100,20,'2016-03-03 00:00:00'),(202,'Pat','Fay','PFAY','603.123.6666','MK_REP',6000.00,NULL,201,20,'2016-03-03 00:00:00'),(203,'Susan','Mavris','SMAVRIS','515.123.7777','HR_REP',6500.00,NULL,101,40,'2016-03-03 00:00:00'),(204,'Hermann','Baer','HBAER','515.123.8888','PR_REP',10000.00,NULL,101,70,'2016-03-03 00:00:00'),(205,'Shelley','Higgins','SHIGGINS','515.123.8080','AC_MGR',12000.00,NULL,101,110,'2016-03-03 00:00:00'),(206,'William','Gietz','WGIETZ','515.123.8181','AC_ACCOUNT',8300.00,NULL,205,110,'2016-03-03 00:00:00');

/*Table structure for table `jobs` */

DROP TABLE IF EXISTS `jobs`;

CREATE TABLE `jobs` (
  `job_id` varchar(10) NOT NULL,
  `job_title` varchar(35) DEFAULT NULL,
  `min_salary` int(6) DEFAULT NULL,
  `max_salary` int(6) DEFAULT NULL,
  PRIMARY KEY (`job_id`)
) ENGINE=InnoDB DEFAULT CHARSET=gb2312;

/*Data for the table `jobs` */

insert  into `jobs`(`job_id`,`job_title`,`min_salary`,`max_salary`) values ('AC_ACCOUNT','Public Accountant',4200,9000),('AC_MGR','Accounting Manager',8200,16000),('AD_ASST','Administration Assistant',3000,6000),('AD_PRES','President',20000,40000),('AD_VP','Administration Vice President',15000,30000),('FI_ACCOUNT','Accountant',4200,9000),('FI_MGR','Finance Manager',8200,16000),('HR_REP','Human Resources Representative',4000,9000),('IT_PROG','Programmer',4000,10000),('MK_MAN','Marketing Manager',9000,15000),('MK_REP','Marketing Representative',4000,9000),('PR_REP','Public Relations Representative',4500,10500),('PU_CLERK','Purchasing Clerk',2500,5500),('PU_MAN','Purchasing Manager',8000,15000),('SA_MAN','Sales Manager',10000,20000),('SA_REP','Sales Representative',6000,12000),('SH_CLERK','Shipping Clerk',2500,5500),('ST_CLERK','Stock Clerk',2000,5000),('ST_MAN','Stock Manager',5500,8500);

/*Table structure for table `locations` */

DROP TABLE IF EXISTS `locations`;

CREATE TABLE `locations` (
  `location_id` int(11) NOT NULL AUTO_INCREMENT,
  `street_address` varchar(40) DEFAULT NULL,
  `postal_code` varchar(12) DEFAULT NULL,
  `city` varchar(30) DEFAULT NULL,
  `state_province` varchar(25) DEFAULT NULL,
  `country_id` varchar(2) DEFAULT NULL,
  PRIMARY KEY (`location_id`)
) ENGINE=InnoDB AUTO_INCREMENT=3201 DEFAULT CHARSET=gb2312;

/*Data for the table `locations` */

insert  into `locations`(`location_id`,`street_address`,`postal_code`,`city`,`state_province`,`country_id`) values (1000,'1297 Via Cola di Rie','00989','Roma',NULL,'IT'),(1100,'93091 Calle della Testa','10934','Venice',NULL,'IT'),(1200,'2017 Shinjuku-ku','1689','Tokyo','Tokyo Prefecture','JP'),(1300,'9450 Kamiya-cho','6823','Hiroshima',NULL,'JP'),(1400,'2014 Jabberwocky Rd','26192','Southlake','Texas','US'),(1500,'2011 Interiors Blvd','99236','South San Francisco','California','US'),(1600,'2007 Zagora St','50090','South Brunswick','New Jersey','US'),(1700,'2004 Charade Rd','98199','Seattle','Washington','US'),(1800,'147 Spadina Ave','M5V 2L7','Toronto','Ontario','CA'),(1900,'6092 Boxwood St','YSW 9T2','Whitehorse','Yukon','CA'),(2000,'40-5-12 Laogianggen','190518','Beijing',NULL,'CN'),(2100,'1298 Vileparle (E)','490231','Bombay','Maharashtra','IN'),(2200,'12-98 Victoria Street','2901','Sydney','New South Wales','AU'),(2300,'198 Clementi North','540198','Singapore',NULL,'SG'),(2400,'8204 Arthur St',NULL,'London',NULL,'UK'),(2500,'Magdalen Centre, The Oxford Science Park','OX9 9ZB','Oxford','Oxford','UK'),(2600,'9702 Chester Road','09629850293','Stretford','Manchester','UK'),(2700,'Schwanthalerstr. 7031','80925','Munich','Bavaria','DE'),(2800,'Rua Frei Caneca 1360 ','01307-002','Sao Paulo','Sao Paulo','BR'),(2900,'20 Rue des Corps-Saints','1730','Geneva','Geneve','CH'),(3000,'Murtenstrasse 921','3095','Bern','BE','CH'),(3100,'Pieter Breughelstraat 837','3029SK','Utrecht','Utrecht','NL'),(3200,'Mariano Escobedo 9991','11932','Mexico City','Distrito Federal,','MX');

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

158~189没看,192~197已阅

;