
本文共 49889 字,大约阅读时间需要 166 分钟。
本文涵盖内容及学习目标
上篇
- 了解数据库相关概念
- 了解MySQL相关概念及常用命令
- 了解SQL分类
- 掌握SQL应用(重点)
- DDL(数据库定义语言)
- DML(数据操作语言)
- DQL(数据查询语言)
- TCL(事务控制语言)
- DCL(数据控制语言)
- 理解事务相关知识
下篇
- 掌握视图应用
- 掌握变量应用
- 掌握存储过程和函数应用
- 了解数据库范式
- 了解数据库建表规则
- 掌握JDBC应用
一.数据库相关概念
如果对数据库概念已有一定认知,可直接看
什么是数据库?
数据库则是保存数据的容器、集合、文件…
数据库的作用?
- 实现数据的持久化
数据库的好处?
-
使用完整的管理系统统一管理,方便查询
-
可以让数据实现结构化存储,方便管理
数据库细分概念
-
DB:数据库(DATABASE):存储数据的“仓库”。它保存了一系列有组织的结构化数据。
-
DBMS:数据库管理系统(DATABASE Management System)。数据库是通过DBMS创建和操作的容器
-
SQL:结构化查询语言(Structure Query Language):专门与数据库通信的语言,用于管理和维护数据库,这是一种关系型数据库的通用语言。注:SQL并非某个数据库专有的语言,几乎所有的DBMS都支持SQL,也就是说,几乎所有的数据库管理系统都支持SQL语言,例如:MySQL、SQLSerevr、Oracle,但是,各个数据库都有各自的方言,会存在些许不一样
数据库分类
关系型数据库
是指采用了关系模型来组织数据的数据库,其以行和列的形式存储数据,以便于用户理解,关系型数据库这一系列的行和列被称为表,一组表组成了数据库。用户通过查询来检索数据库中的数据,而查询是一个用于限定数据库中某些区域的执行代码。关系模型可以简单理解为二维表格模型,而一个关系型数据库就是由二维表及其之间的关系组成的一个数据组织。注:从java的角度来理解的话,表就是一个存储对象的集合,一行就是一个对象,行中的列则是对象的属性,而多个表则组成了一个库
优点 | 缺点 |
---|---|
易于维护,都是使用表结构,格式一致 | 读写性能比较差,尤其是海量数据的高效率读写 |
使用方便,数据库操作语言通用 | 固定的表结构,灵活度稍欠 |
支持复杂操作:可用于一个表以及多个表之间非常复杂的查询 | 高并发读写需求,传统关系型数据库来说,硬盘I/O是一个很大的瓶颈 |
非关系型数据库
非关系型数据库严格上不是一种数据库,应该是一种数据结构化存储方法的集合,可以是文档或者键值对等
优点 | 缺点 |
---|---|
格式灵活:存储数据的格式可以是key-value形式、 文档形式、图片形式等等 | 不提供sql支持,学习和使用成本较高 |
速度快:可以使用硬盘或者随机存储器作为载体, 而关系型数据库只能使用硬盘 | 数据结构相对复杂,复杂查询方面稍欠 |
高扩展性,成本低,部署简单,基本都是开源软件 | 无事务处理,不保证关系数据的ACID特性 |
二.MySQL
简介:
开源免费的数据库,小型的数据库。MySQL6.x版本也开始有收费版本
最早是MySQL开发,后来Sun公司收购了MySQL,而Sun公司又被Oracle收购
优点:
-
成本低:开放源代码,一般可以免费试用
-
性能高:执行很快
-
简单:很容易安装和使用
MySQL安装
略,请自行百度,教程超多~~~
MySQL常用命令
- 启动MySQL服务:net start mysql服务名
- 停止MySQL服务:net stop mysql服务名
- 连接MySQL:mysql -h 主机ip -P 端口 -u用户名 -p密码。注:ip和端口可视情况省略,省略的话默认本机地址好3306端口
- 退出登录:exit
- 查看mysql版本:未登录:mysql -V,已登录:SELECT VERSION();
SQL简介及规范
学习MySQL其实主要是学习使用SQL对数据库进行操作
-
所有SQL语句以分号或者\g结尾,在一些图形化客户端可以省略,但是不建议省略
-
SQL语句不区分大小写,无论是关键字还是数据
-
SQL注释格式
注释的语法 说明 –空格 注释 单行注释,通用的注释 /* 注释 */ 多行注释,与Java相同 # 注释 单行注释,只在MySQL中可以用,不建议使用
SQL分类
1. DDL语句
Data Definition Language,数据定义语言,简称DDL,数据操纵语句,用于库和表的创建、修改、删除,包括如下SQL语句
- CREATE TABLE:创建数据库表
- ALTER TABLE:更改表结构、添加、删除、修改列长度
- DROP TABLE:删除表
- CREATE INDEX:在表上建立索引
- DROP INDEX:删除索引
2. DML语句
Data Manipulation Language,数据操作语言,简称DML,用于添加、删除、修改数据库记录,并检查数据完整性,包括如下SQL语句
- INSERT:添加数据到数据库中
- UPDATE:修改数据库中的数据
- DELETE:删除数据库中的数据
3. DQL语句(重点)
Data Query Language,数据查询语言,简称DQL,查询
4.TCL语句
Transaction Control Language)事务控制语言,简称TCL
5. DCL语句
Data Control Language,数据控制语言,简称DCL,用于定义用户的访问权限和安全级别,包括如下SQL语句
- GRANT:授予访问权限
- REVOKE:撤销访问权限
- COMMIT:提交事务处理
- ROLLBACK:事务处理回退
- SAVEPOINT:设置保存点
- LOCK:对数据库的特定部分进行锁定
SQL应用
1.DDL语句应用
创建数据库
语法:
-- 创建数据库CREATE DATABASE 数据库名-- 判断数据库是否存在,不存在再创建CREATE DATABASE IF NOT EXISTS 数据库名-- 在创建时指定数据库编码CREATE DATABASE 数据库名 CHARACTER SET 字符名称-- 查看所有的数据库SHOW DATABASES-- 查看某个数据库定义信息SHOW CREATE DATABASE 数据库名-- 切换至指定数据库USE 数据库名
修改和删除数据库
语法:
-- 修改数据库字符集语法ALTER DATABASE 数据库名 CHARACTER SET 字符集名称-- 查看正在使用的数据库SELECT DATABASE();-- 修改库名(不建议,有问题,直接改data文件夹,然后重启服务)RENAME DATABASE books TO 新库名;-- 删除数据库DROP DATABASE 数据库名-- 如果存在则删除DROP DATABASE IF EXISTS 数据库名;
创建表结构
语法:
-- 字段名就是列名,字段类型 数据类型 约束-- 多个字段之间使用逗号来分隔,约束可以没有CREATE TABLE 表名 ( 字段名1 字段类型1【字段长度】 约束1, 字段名2 字段类型2【字段长度】 约束2);
查看表结构
语法:
-- 查看某个数据库中的所有表SHOW TABLES;-- 查看某个表结构 DESC 表名;-- 查看创建表的SQL语句 SHOW CREATE TABLE 表名;-- 创建相同的表结构CREATE TABLE 新表名 LIKE 旧表;
修改表结构
语法:
-- 添加表列ADDALTER TABLE 表名 ADD COLUMN 字段名 数据类型;-- 修改列类型MODIFYALTER TABLE 表名 MODIFY COLUMN 字段名 新的数据类型;-- 修改列名和类型 CHANGEALTER TABLE 表名 CHANGE COLUMN 旧列名 新列名 数据类型;-- 删除列 DROPALTER TABLE 表名 DROP COLUMN 列名;-- 修改表名RENAME TABLE 旧表名 RENAME TO 新的表名;
删除表
语法:
-- 直接删除表DROP TABLE 表名;-- 判断表是否存在再删除表DROP TABLE IF EXISTS 表名;
复制表
语法:
-- 1.仅仅复制表的结构CREATE TABLE 需要创建的表名 LIKE 被复制的目标表名;-- 2.复制表的结构+数据CREATE TABLE 需要创建的表名 SELECT * FROM 被复制的目标表名;-- 3.只复制部分数据CREATE TABLE 需要创建的表名 SELECT 被复制的目标列名1,列名2 FROM 被复制的目标表名 WHERE nation='中国';-- 4.仅仅复制某些字段CREATE TABLE copy4 SELECT id,au_name FROM author WHERE 0;
案例:
-- 1.仅仅复制表的结构CREATE TABLE copy LIKE author;-- 2.复制表的结构+数据CREATE TABLE copy2 SELECT * FROM author;-- 3.只复制部分数据CREATE TABLE copy3 SELECT id,au_name FROM author WHERE nation='中国';-- 4.仅仅复制某些字段CREATE TABLE copy4 SELECT id,au_name FROM author WHERE 0;
MySQL常用数据类型
整形
分类 | 类型名称 | 类型说明 |
---|---|---|
整型 | tinyint | 微整形(占8位二进制) |
smallint | 小整形(占16位二进制) | |
mediumint | 中整形(占24位二进制) | |
int | 整形(占32位二进制) | |
bigint | 大整形(占64位二进制) |
关于有无符号案例
-- 如何设置无符号和有符号CREATE TABLE tab_int( t1 INT(7) ZEROFILL, t2 INT(7) unsigned );
注意:
- 如果不设置无符号还是有符号,默认是有符号,如果想设置无符号,需要添加unsigned关键字
- 如果插入的数值超出了整型的范围,会报out of range异常,并且插入临界值
- 如果不设置长度,会有默认的长度
- 长度代表了显示的最大宽度,如果不够会用0在左边填充,但必须搭配zerofill使用!
小数
分类 | 类型名称 | 类型说明 |
---|---|---|
浮点型小数 | float(m,n) | 单精度浮点数(占4个字节) |
double(m,n) | 双精度浮点数(占8个字节) | |
定点型小数 | decimal(m,n) | 数值类型,m表示数值的长度,n表示小数的位数 |
注意:
- M:长度,整数部位+小数部位,D:小数部位,如果超过范围,则插入临界值
- M和D都可以省略,如果是decimal,则M默认为10,D默认为0,如果是float和double,则会根据插入的数值的精度来决定精度
- 定点型的精确度较高,如果要求插入数值的精度较高如货币运算等则考虑使用
字符型
分类 | 类型名称 | 类型说明 |
---|---|---|
较短字符串 | char(m) | 定长字符串,无论使用几个字符都沾满全部,m为0-255之间的整数 |
varchar(m) | 变长字符串,使用几个字符就占几个,m为0-65535之间的整数 | |
较长字符串 | text | 文本类型 |
较短二进制 | binary | 较小的二进制 |
varbinary | 较小的二进制 | |
较长二进制 | blob | 较大的二进制 |
其他 | enum | 枚举 |
set | 集合 |
char和varchar对比
写法 | M的意思 | 特点 | 空间的耗费 | 性能 |
---|---|---|---|---|
char(M) | 最大的字符数,可以省略,默认为1 | 固定长度的字符 | 比较耗费(合理使用即可) | 高 |
varchar(M) | 最大的字符数,不可以省略 | 可变长度的字符 | 比较节省 | 低 |
日期型
分类 | 类型名称 | 类型说明 |
---|---|---|
日期 | time | 只表示时间类型 |
date | 只表示日期类型 | |
datetime | 表示日期和时间类型,时间范围为:‘1000-01-01 00:00:00’到’9999-12-31 23:59:59’ | |
timestamp | 表示日期和时间类型,时间范围为:‘1970-01-01 00:00:00’到’2038-01-19 03:14:07’(受时区影响,相对准确) | |
year | 只表示年 |
MySQL数据类型选择原则:所选择的类型越简单越好,能保存数值的类型越小越好
MySQL约束
含义:一种限制,用于限制表中的数据,为了保证表中的数据的准确和可靠性
分类:
NOT NULL:非空约束,用于保证该字段的值不能为空,比如姓名、学号等必定有值的属性
DEFAULT:默认,用于保证该字段有默认值
PRIMARY KEY:主键,用于保证该字段的值具有唯一性,并且非空
UNIQUE:唯一,用于保证该字段的值具有唯一性,可以为空,但是一个表中也只能有一条为空的记录
CHECK:检查约束【mysql中不支持】,比如年龄一般大于0小于100、性别只有男和女
FOREIGN KEY:外键,用于限制两个表的关系,用于保证该字段的值必须来自于主表的关联列的值,在从表添加外键约束,用于引用主表中某列的值,比如学生表的专业编号,员工表的部门编号,员工表的工种编号(一般软件中外键关系由数据库的客户端(程序员)来维护)
添加约束的时机:
- 创建表时
- 修改表时
约束的添加分类:
列级约束:六大约束语法上都支持,但外键约束没有效果
表级约束:除了非空、默认,其他的都支持
关于外键的注意点:
- 要求在从表设置外键关系
- 从表的外键列的类型和主表的关联列的类型要求一致或兼容,名称无要求
- 主表的关联列必须是一个key(一般是主键或唯一)
- 插入数据时,先插入主表,再插入从表,删除数据时,先删除从表,再删除主表
主键约束和唯一约束的对比:
约束名 | 是否保证唯一性 | 是否允许为空 | 是否一个表中可以有多少个 | 是否允许组合 |
---|---|---|---|---|
主键 | 是 | 否 | 否(最多一个) | 是(组合的为复合主键,保证组合的字段的值组合起来不重复即可,一般不推荐使用 |
唯一 | 是 | 是 | 是 | 是(但不推荐) |
语法:
CREATE TABLE 表名( 字段名 字段类型 列级约束, 字段名 字段类型, 表级约束)CREATE DATABASE students;-- 一、创建表时添加约束-- 1.添加列级约束/*语法:直接在字段名和类型后面追加 约束类型即可。只支持:默认、非空、主键、唯一*/-- 复合主键CREATE TABLE 表名 ( 字段名字1 数据类型1, 字段名字2 数据类型2, PRIMARY KEY (字段名字1, 字段名字2));
案例:
USE students;DROP TABLE stuinfo;CREATE TABLE stuinfo( id INT PRIMARY KEY,-- 主键 stuName VARCHAR(20) NOT NULL UNIQUE,-- 非空 gender CHAR(1) CHECK(gender='男' OR gender ='女'),-- 检查 seat INT UNIQUE,-- 唯一 age INT DEFAULT 18,-- 默认约束 majorId INT REFERENCES major(id)-- 外键);CREATE TABLE major( id INT PRIMARY KEY, majorName VARCHAR(20));-- 查看stuinfo中的所有索引,包括主键、外键、唯一SHOW INDEX FROM stuinfo;-- 2.添加表级约束/*语法:在各个字段的最下面 【constraint 约束名】 约束类型(字段名) */DROP TABLE IF EXISTS stuinfo;CREATE TABLE stuinfo( id INT, stuname VARCHAR(20), gender CHAR(1), seat INT, age INT, majorid INT, CONSTRAINT pk PRIMARY KEY(id),-- 主键 CONSTRAINT uq UNIQUE(seat),-- 唯一键 CONSTRAINT ck CHECK(gender ='男' OR gender = '女'),-- 检查 CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id)-- 外键);SHOW INDEX FROM stuinfo;-- 通用的写法:★CREATE TABLE IF NOT EXISTS stuinfo( id INT PRIMARY KEY, stuname VARCHAR(20), sex CHAR(1), age INT DEFAULT 18, seat INT UNIQUE, majorid INT, CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id));-- 二、修改表时添加约束/*1、添加列级约束alter table 表名 modify column 字段名 字段类型 新约束;2、添加表级约束alter table 表名 add 【constraint 约束名】 约束类型(字段名) 【外键的引用】;*/DROP TABLE IF EXISTS stuinfo;CREATE TABLE stuinfo( id INT, stuname VARCHAR(20), gender CHAR(1), seat INT, age INT, majorid INT)DESC stuinfo;-- 1.添加非空约束ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) NOT NULL;-- 2.添加默认约束ALTER TABLE stuinfo MODIFY COLUMN age INT DEFAULT 18;-- 3.添加主键-- ①列级约束ALTER TABLE stuinfo MODIFY COLUMN id INT PRIMARY KEY;-- ②表级约束ALTER TABLE stuinfo ADD PRIMARY KEY(id);-- 4.添加唯一-- ①列级约束ALTER TABLE stuinfo MODIFY COLUMN seat INT UNIQUE;-- ②表级约束ALTER TABLE stuinfo ADD UNIQUE(seat);-- 5.添加外键ALTER TABLE stuinfo ADD CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id); -- 三、修改表时删除约束-- 1.删除非空约束ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) NULL;-- 2.删除默认约束ALTER TABLE stuinfo MODIFY COLUMN age INT ;-- 3.删除主键ALTER TABLE stuinfo DROP PRIMARY KEY;-- 4.删除唯一ALTER TABLE stuinfo DROP INDEX seat;-- 5.删除外键ALTER TABLE stuinfo DROP FOREIGN KEY fk_stuinfo_major;SHOW INDEX FROM stuinfo;
标识列
含义:可以不用手动的插入值,系统提供默认的序列值,又称为自增长列
案例:
-- 一、创建表时设置标识列DROP TABLE IF EXISTS tab_identity;CREATE TABLE tab_identity( id INT , NAME FLOAT UNIQUE AUTO_INCREMENT, seat INT );TRUNCATE TABLE tab_identity;INSERT INTO tab_identity(id,NAME) VALUES(NULL,'john');INSERT INTO tab_identity(NAME) VALUES('lucy');SELECT * FROM tab_identity;SHOW VARIABLES LIKE '%auto_increment%';SET auto_increment_increment = 3;
注意:
- 标识列并不是必须和主键搭配,但要求是一个key
- 一个表最多可以有一个标识列!
- 标识列的类型只能是数值型
- 标识列可以通过 SET auto_increment_increment=3; 设置步长,可以通过 手动插入值,设置起始值
2.DML语句应用
新增记录
语法:
-- 方式一插入全部字段,可以不用写字段名INSERT INTO 表名 VALUES (值1,值2...);-- 方式一插入部分的字段,未插入字段的值默认是NULLINSERT INTO 表名 (列名1,列名2) VALUES(值1,值2);-- 方式一插入多条记录INSERT INTO 表名 VALUES(值1,值2),(值1,值2),(值1,值2);-- 方式二插入数据INSERT INTO 表名 SET 列名=值,列名=值,...
对比:
- 方式一支持插入多行,方式二不支持
INSERT INTO beauty VALUES(23,'唐艺昕1','女','1990-4-23','1898888888',NULL,2),(24,'唐艺昕2','女','1990-4-23','1898888888',NULL,2),(25,'唐艺昕3','女','1990-4-23','1898888888',NULL,2);
- 方式一支持子查询,方式二不支持
INSERT INTO beauty(id,NAME,phone)SELECT 26,'宋茜','11809866';INSERT INTO beauty(id,NAME,phone)SELECT id,boyname,'1234567' FROM boys WHERE id < 3;
注意:
- 插入的数据应与字段的数据类型相同
- 数据的大小应在列的规定范围内
- 在 VALUES 中列出的数据位置必须与被加入的列的排列位置相对应
- 字符和日期型数据应包含在单引号中
- 不指定列或使用null,表示插入空值
更新记录
语法:
-- 不带条件修改数据,修改所有行的记录UPDATE 表名 SET 字段名=值-- 带条件修改数据,修改满足条件的记录UPDATE 表名 SET 字段名=值 WHERE 条件-- 一次修改多个字段值UPDATE 表名 SET 字段名1=值1, 字段名2=值2-- 修改多表的记录【补充】-- sql92语法:UPDATE 表1 别名,表2 别名 c 列=值,... WHERE 连接条件 AND 筛选条件;-- sql99语法:UPDATE 表1 别名 INNER|LEFT|RIGHT JOIN 表2 别名 ON 连接条件 SET 列=值,... WHERE 筛选条件;
案例:
-- 案例 1:修改张无忌的女朋友的手机号为114UPDATE boys bo INNER JOIN beauty b ON bo.`id`=b.`boyfriend_id` SET b.`phone`='119',bo.`userCP`=1000 WHERE bo.`boyName`='张无忌';-- 案例2:修改没有男朋友的女神的男朋友编号都为2号UPDATE boys boRIGHT JOIN beauty b ON bo.`id`=b.`boyfriend_id` SET b.`boyfriend_id`=2 WHERE bo.`id` IS NULL;
删除记录
语法:
-- 不带条件删除数据(删除表中所有的记录,只删除记录不删除表结构)DELETE FROM 表名-- 带条件删除数据(删除符合条件的记录,只删除记录不删除表结构)DELETE FROM 表名 WHERE 条件-- 与DELETE删除的记录的区别-- 1. 相当于先删除表结构:DROP TABLE 表名;-- 2. 创建一张相同结构的表:CREATE TABLE 表名;TRUNCATE TABLE 表名-- 多表的删除【补充】-- sql92语法:DELETE 表1的别名,表2的别名 FROM 表1 别名,表2 别名 WHERE 连接条件 AND 筛选条件;-- sql99语法:DELETE 表1的别名,表2的别名 FROM 表1 别名 INNER|LEFT|RIGHT JOIN 表2 别名 ON 连接条件 WHERE 筛选条件;
案例:
-- 案例:删除张无忌的女朋友的信息DELETE b FROM beauty b INNER JOIN boys bo ON b.`boyfriend_id` = bo.`id` WHERE bo.`boyName`='张无忌';-- 案例:删除黄晓明的信息以及他女朋友的信息DELETE b,bo FROM beauty b INNER JOIN boys bo ON b.`boyfriend_id`=bo.`id` WHERE bo.`boyName`='黄晓明';
对比:
- delete 可以加where 条件,truncate不能加
- truncate删除,效率高一丢丢
- 假如要删除的表中有自增长列,如果用delete删除后,再插入数据,自增长列的值从断点开始,而truncate删除后,再插入数据,自增长列的值从1开始。
- truncate删除没有返回值,delete删除有返回值
- truncate删除不能回滚,delete删除可以回滚
级联操作
修改主表中主键,或者删除主表中记录的时候,从表中外键也被同时修改、或者删除
语法
写在外键约束的后面,在创建外键约束的时候创建级联操作
级联操作 | 语法 |
---|---|
级联更新 | on update cascade |
级联删除 | on delete cascade |
案例
-- 删除外键约束ALTER TABLE employee DROP FOREIGN KEY employee_ibfk_1;-- 添加外键约束,级联更新和级联删除ALTER TABLE employee ADD CONSTRAINT fk_emp_dept FOREIGN KEY (dept_id) REFERENCES department(id) ON UPDATE CASCADE ON DELETE CASCADE;-- DELETE FROM employee WHERE id > 6;SELECT * FROM employee;-- 把部门表中id等于1的部门改成id等于9UPDATE department SET id=9 WHERE id = 1;-- 删除部门号是2的部门DELETE FROM department WHERE id=2;
3. DQL语句应用
注意:本文需要用到的数据在文章末尾
基础查询
无条件查询
语法:
-- 查询表所有行和列的数据,星号*表示所有列SELECT * FROM 表名;-- 查询指定的多个列SELECT 列名1,列名2 FROM 表名;
AS关键字:指定列的别名
使用别名可以使查询结果清晰易懂,AS关键字可以省略,但不建议省略
语法:
-- 指定列的别名SELECT 列名 AS 别名 FROM 表名-- 省略as关键字SELECT 列名 别名 FROM 表名
注意:
- 在实际开发环境中强烈不建议使用 * 号,应该要什么数据取什么数据
- 在查询的列中如果包含数据库关键字,应使用着重号(TAB键上面那个)标记为这是一个字段而非关键字
查询常量值
语法:
SELECT 常量值;
案例:
SELECT 100;SELECT 'john';
查询表达式
语法:
SELECT 表达式
案例:
SELECT 100%98;
查询函数
语法:
SELECT 函数名;
案例:
-- 例: SELECT VERSION();
去重查询,distinct关键字
语法:
-- 一个字段去重SELECT DISTINCT 字段 FROM 表名-- 多个字段去重,必须是全部字段一样,才会去重SELECT DISTINCT 字段1,字段2 FROM 表名
查询结果参与运算
语法:
-- 某列数据和固定值运算 SELECT 列+数值 FROM 表名;-- 某列数据和其他列数据参与运算SELECT 列1+列2 FROM 表名;
注意:参与运算的必须是数值类型,mysql中的+号,仅仅只有一个充当运算符的功能,如果参与运算的其中一个为字符型,MySQL将会试图将其转换为数值型,如果转换成功,则参与运算,否则,将字符型数值转换为0,如果其中一方为null,则结果必然为null
条件查询
语法:
-- 取出表中的每条数据,满足条件的记录就返回,不满足条件的记录不返回SELECT 列名 FROM 表名 WHERE 条件
比较运算符查询
常用运算符
运算符 | 说明 |
---|---|
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
= | 等于 |
<> | 不等于 |
!= | 不等于,mysql可以用 |
<=> | 安全等于,可判断普通类型的值和NULL值 |
语法:
SELECT 列名 FROM 表名 WHERE 参与比较的字段 比较运算符 比较运算的值;
案例:
-- 案例:查询工资>12000的员工信息SELECT * FROM employees WHERE salary > 12000;
逻辑运算符
逻辑运算符 | 说明 |
---|---|
AND 或 && | 逻辑并,全真为真 |
OR 或 || | 逻辑或,见真为真 |
NOT 或 ! | 逻辑否,取反 |
语法:
SELECT 列名 FROM employees WHERE 参与比较的字段1 比较运算符1 比较运算的值1 逻辑运算符 参与比较的字段2 比较运算符2 比较运算的值2;
案例:
-- 案例:查询工资在10000到20000之间的员工名、工资以及奖金SELECT last_name,salary,commission_pct FROM employees WHERE salary >= 10000 AND salary <= 20000;
in关键字
in里面的每个数据都会作为一次匹配条件,只要满足条件的就会显示
语法:
SELECT 列名 FROM 表名 WHERE 等值匹配的字段 IN(匹配值1,匹配值2,匹配值3);
案例:
-- 案例:查询员工的工种编号是 IT_PROG、AD_VP、AD_PRES中的一个员工名和工种编号SELECT last_name,job_id FROM employees WHERE job_id IN( 'IT_PROT' ,'AD_VP','AD_PRES');
注意:
- in列表的值类型必须一致或兼容
- in列表中不支持通配符
范围查询关键字
BETWEEN…AND… ,通常用于数值类型的范围取值
语法:
SELECT 列名 FROM 表名 WHERE 范围查询字段 BETWEEN 起始边界值 AND 结束边界值;
案例:
-- 案例:查询员工编号在100到120之间的员工信息SELECT * FROM employees WHERE employee_id BETWEEN 100 AND 120;
注意:
- BETWEEN…AND…包含临界值
- 两个临界(范围)值不要调换顺序,小的在前,大的在后
模糊查询,like关键字
用于字符串的模糊查询,一般和通配符搭配使用
通配符 | 说明 |
---|---|
% | 匹配多个字符 |
_ | 匹配一个字符 |
语法:
SELECT 列名 FROM 表名 WHERE 模糊查询的列名 LIKE '模糊条件'
案例:
-- 案例1:查询员工名中包含字符a的员工信息SELECT * FROM employees WHERE last_name LIKE '%a%';-- 案例2:查询员工名中第三个字符为e,第五个字符为a的员工名和工资SELECT last_name,salary FROM employees WHERE last_name LIKE '__n_l%';
空值判断查询
语法:
SELECT 列名 FROM 表名 WHERE 判空列名 判空条件
=或<>并不能用于判断null值,一般使用 IS NULL 或 IS NOT NULL 可以判断 NULL 值
案例:
-- 案例1:查询没有奖金的员工名和奖金率SELECT last_name,commission_pct FROM mployees WHERE commission_pct IS NULL;-- 案例1:查询有奖金的员工名和奖金率SELECT last_name,commission_pct FROM employees WHERE commission_pct IS NOT NULL;
排序查询
使用 ORDER BY 排序的字段或表达式;
语法:
SELECT 列名 FROM 表名 ORDER BY 列名 排序条件-- 多列排序SELECT 列名 FROM 表名 ORDER BY 列名1 排序条件,列名2 排序条件
案例:
-- 1、按单个字段排序SELECT * FROM employees ORDER BY salary DESC;-- 2、添加筛选条件再排序-- 案例:查询部门编号>=90的员工信息,并按员工编号降序SELECT * FROM employees WHERE department_id >= 90 ORDER BY employee_id DESC;-- 3、按表达式排序-- 案例:查询员工信息 按年薪降序SELECT *,salary*12*(1+IFNULL(commission_pct,0)) FROM employees ORDER BY salary*12*(1+IFNULL(commission_pct,0)) DESC;-- 4、按别名排序-- 案例:查询员工信息 按年薪升序SELECT *,salary*12*(1+IFNULL(commission_pct,0)) 年薪 FROM employees ORDER BY 年薪 ASC;-- 5、按函数排序-- 案例:查询员工名,并且按名字的长度降序SELECT LENGTH(last_name),last_name FROM employees ORDER BY LENGTH(last_name) DESC;-- 6、按多个字段排序-- 案例:查询员工信息,要求先按工资降序,再按employee_id升序SELECT * FROM employees ORDER BY salary DESC,employee_id ASC;
注意:
- 排序的对象是对查询结果的排序,ASC 代表的是升序,可以省略,DESC 代表的是降序
- ORDER BY 子句可以支持 单个字段、别名、表达式、函数、多个字段
- ORDER BY 子句通常在查询语句的最后面,除了 LIMIT 子句
常见函数
类似于java的方法,将一组逻辑语句封装在方法体中,对外暴露方法名,使用者对其进行调用
好处:
- 隐藏了实现细节
- 提高代码的重用性
调用语法:
SELECT 函数名(实参列表) 【FROM 表】;
单行函数
字符函数
LENGTH 获取参数值的字节个数
SELECT LENGTH('jack');
CONCAT 拼接字符串
-- 拼接员工的姓和名,用下划线隔开SELECT CONCAT(last_name,'_',first_name) 姓名 FROM employees;
UPPER、LOWER 大小写转换
SELECT UPPER('jack');SELECT LOWER('JaCk');-- 示例:将姓变大写,名变小写,然后拼接SELECT CONCAT(UPPER(last_name),LOWER(first_name)) 姓名 FROM employees;
SUBSTR、SUBSTRING 字符串截取
-- 截取从指定索引处后面所有字符SELECT SUBSTR('李莫愁爱上了陆展元',7) out_put;-- 截取从指定索引处指定字符长度的字符SELECT SUBSTR('李莫愁爱上了陆展元',1,3) out_put;
注意:SQL中索引都是从1开始,并非0
INSTR 返回字符串第一次出现的索引,如果找不到返回0
SELECT INSTR('杨不殷六侠悔爱上了殷六侠','殷八侠') AS out_put;
TRIM 去除多余空格
SELECT LENGTH(TRIM(' 张翠山 ')) AS out_put;
LPAD 用指定的字符实现左填充指定长度
SELECT LPAD('殷素素',2,'*') AS out_put;
RPAD 用指定的字符实现右填充指定长度
SELECT RPAD('殷素素',12,'ab') AS out_put;
REPLACE 指定替换字符串中的内容
SELECT REPLACE('周芷若周芷若周芷若周芷若张无忌爱上了周芷若','周芷若','赵敏') AS out_put;
数学函数
ROUND 四舍五入
-- 默认整数,不保留小数SELECT ROUND(-1.55);-- 小数点后保留两位SELECT ROUND(1.567,2);
CEIL 向上取整,返回>=该参数的最小整数
SELECT CEIL(-1.02);
FLOOR 向下取整,返回<=该参数的最大整数
SELECT FLOOR(-9.99);
TRUNCATE 直接截断,保留指定位数
SELECT TRUNCATE(1.69999,1);
MOD 取余
SELECT MOD(10,-3);
日期函数
NOW 返回当前系统日期+时间
SELECT NOW();
CURDATE 返回当前系统日期,不包含时间
SELECT CURDATE();
CURTIME 返回当前时间,不包含日期
SELECT CURTIME();
获取指定的部分,年、月、日、小时、分钟、秒
SELECT YEAR(NOW()) 年;SELECT YEAR('1998-1-1') 年;SELECT YEAR(hiredate) 年 FROM employees;SELECT MONTH(NOW()) 月;SELECT MONTHNAME(NOW()) 月;
STR_TO_DATE 将字符通过指定的格式转换成日期
语法:
SELECT STR_TO_DATE(时间字符串,日期格式) AS 输出的别名;
案例:
SELECT STR_TO_DATE('1998-3-2','%Y-%c-%d') AS out_put;-- 查询入职日期为1992--4-3的员工信息SELECT * FROM employees WHERE hiredate = '1992-4-3';SELECT * FROM employees WHERE hiredate = STR_TO_DATE('4-3 1992','%c-%d %Y');
DATE_FORMAT 将日期转换成字符
语法:
SELECT DATE_FORMAT(时间,日期字符串格式) AS 输出的别名;
案例:
SELECT DATE_FORMAT(NOW(),'%y年%m月%d日') AS out_put;-- 查询有奖金的员工名和入职日期(xx月/xx日 xx年)SELECT last_name,DATE_FORMAT(hiredate,'%m月/%d日 %y年') 入职日期 FROM employees WHERE commission_pct IS NOT NULL;
流程控制函数
if函数: if else 的效果
语法:
SELECT IF(表达式(可以为比较运算也可以是判空),运算为真的结果,运算为假的结果);
案例:
SELECT IF(10<5,'大','小');-- 查询员工是否有奖金的情况SELECT last_name,commission_pct,IF(commission_pct IS NULL,'没奖金,呵呵','有奖金,嘻嘻') 备注 FROM employees;
case函数
使用方式一:
语法:
java中switch(变量或表达式){ case 常量1:语句1;break; ... default:语句n;break;}mysql中CASE 要判断的字段或表达式WHEN 常量1 THEN 要显示的值1或语句1;WHEN 常量2 THEN 要显示的值2或语句2;...ELSE 要显示的值n或语句n;END
/*案例:查询员工的工资,要求部门号=30,显示的工资为1.1倍部门号=40,显示的工资为1.2倍部门号=50,显示的工资为1.3倍其他部门,显示的工资为原工资*/SELECT salary 原始工资,department_id,CASE department_idWHEN 30 THEN salary * 1.1WHEN 40 THEN salary * 1.2WHEN 50 THEN salary * 1.3ELSE salaryEND AS 新工资FROM employees;
使用方式二:
类似于 多重if
语法:
java中:if(条件1){ 语句1;}else if(条件2){ 语句2;}...else{ 语句n;}mysql中:CASE WHEN 条件1 THEN 要显示的值1或语句1WHEN 条件2 THEN 要显示的值2或语句2...ELSE 要显示的值n或语句nEND
案例:
-- 案例:查询员工的工资的情况如果工资 > 20000,显示A级别如果工资 > 15000,显示B级别如果工资 > 10000,显示C级别否则,显示D级别SELECT salary,CASE WHEN salary > 20000 THEN 'A'WHEN salary > 15000 THEN 'B'WHEN salary > 10000 THEN 'C'ELSE 'D'END AS 工资级别FROM employees;
其他函数
VERSION 返回当前MySQL的版本
SELECT VERSION();
DATABASES 返回当前连接的数据库的库名称
SELECT DATABASES();
USER 返回当前登录的用户
SELECT USER();
分组(聚合)函数
分组函数作用于一组列的数值数据进行计算,并返回一个结果值。
AVG 求平均值
SELECT SUM(salary) FROM employees;
SUM 求和
SELECT SUM(salary) FROM employees;
MAX 求最大值
SELECT MAX(salary) FROM employees;
MIN 求最小值
SELECT MIN(salary) FROM employees;
COUNT 统计行数
SELECT COUNT(salary) FROM employees;
效率对比
SELECT COUNT(salary) FROM employees;SELECT COUNT(*) FROM employees;SELECT COUNT(1) FROM employees;/*效率:MYISAM存储引擎下 ,COUNT(*)的效率高INNODB存储引擎下,COUNT(*)和COUNT(1)的效率差不多,比COUNT(字段)要高一些/*
关于分组函数支持的类型测试
-- 测试SUM()和AVG()是否支持字符和时间类型,结果:不报错,但是结果无意义SELECT SUM(last_name) ,AVG(last_name) FROM employees;SELECT SUM(hiredate) ,AVG(hiredate) FROM employees;-- 测试MAX()和MIN()是否支持字符和时间类型,结果:支持SELECT MAX(last_name),MIN(last_name) FROM employees;SELECT MAX(hiredate),MIN(hiredate) FROM employees;-- 测试COUNT()支持的类型,结果:支持任何类型SELECT COUNT(commission_pct) FROM employees;SELECT COUNT(last_name) FROM employees;
关于是否忽略NULL值的测试
-- 结果:忽略NULL值SELECT SUM(commission_pct) ,AVG(commission_pct),SUM(commission_pct)/35,SUM(commission_pct)/107 FROM employees;SELECT MAX(commission_pct) ,MIN(commission_pct) FROM employees;SELECT COUNT(commission_pct) FROM employees;SELECT commission_pct FROM employees;
和DISTINCT搭配测试
-- 会先进行去重,在计算SELECT SUM(DISTINCT salary),SUM(salary) FROM employees;SELECT COUNT(DISTINCT salary),COUNT(salary) FROM employees;
和分组函数一同查询测试
-- 由于分组函数只返回一个结果,所以返回的行数只会有一条SELECT AVG(salary),employee_id FROM employees;
分组查询GROUP BY
分组依据:将结果中分组字段相同内容的作为一组
语法:
-- 语法:根据列名分组,然后对分组后的数据进行条件过滤SELECT 列名 FROM 表名 WHERE 筛选条件 GROUP BY 列名 HAVING 过滤条件 ORDER BY 排序字段 ASC|DESC
案例:
-- 语法:根据列名分组,然后对分组后的数据进行条件过滤SELECT 列名 FROM 表名 WHERE 筛选条件 GROUP BY 列名 HAVING 过滤条件 ORDER BY 排序字段 ASC|DESC-- 1.简单的分组-- 案例1:查询每个工种的员工平均工资SELECT AVG(salary),job_id FROM employees GROUP BY job_id;-- 2、可以实现分组前的筛选-- 案例2:查询有奖金的每个领导手下员工的平均工资SELECT AVG(salary),manager_id FROM employees WHERE commission_pct IS NOT NULL GROUP BY manager_id; -- 3、分组后筛选-- 案例2:每个工种有奖金的员工的最高工资>12000的工种编号和最高工资SELECT job_id,MAX(salary) FROM employees WHERE commission_pct IS NOT NULL GROUP BY job_id HAVING MAX(salary) > 12000;-- 4.添加排序-- 案例:每个工种有奖金的员工的最高工资>6000的工种编号和最高工资,按最高工资升序SELECT job_id,MAX(salary) m FROM employees WHERE commission_pct IS NOT NULL GROUP BY job_id HAVING m > 6000 ORDER BY m ;-- 5.按多个字段分组-- 案例:查询每个工种每个部门的最低工资,并按最低工资降序SELECT MIN(salary),job_id,department_id FROM employees GROUP BY department_id,job_id ORDER BY MIN(salary) DESC;
注意:
- 和分组函数一同查询的字段必须是group by后出现的字段
- 筛选分为两类:分组前筛选和分组后筛选,一般来讲,能用分组前筛选的,尽量使用分组前筛选,提高效率
关键字 | 功能 |
---|---|
where | 1. 先过滤,再进行分组 2. where条件后面不能使用聚合函数 |
having | 1. 先分组,再进行过滤 2. having后面可以使用聚合函数,having用在group by 后面 |
- 分组可以按单个字段也可以按多个字段
- 可以搭配着排序使用
连接查询
笛卡尔积
笛卡尔乘积是指在数学中,两个集合X和Y的笛卡尔积(Cartesian product),又称直积,表示为X × Y,第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员,对应数据库中其实就是两张或者多张表的乘积,由于并非所有数据都是我们需要的有效数据,所以我们需要避免笛卡尔积的产生;
我们可以建立有效的连接条件来避免笛卡尔积的产生,一般我们连接n个表的话那么就至少需要n-1个连接条件
SQL92标准
92标准仅仅支持内连接
内连接
语法:
SELECT 查询列表 FROM 表1,表2 WHERE 连接条件1;
案例:
等值连接
-- 案例1:查询女神名和对应的男神名SELECT NAME,boyName FROM boys,beauty WHERE beauty.boyfriend_id= boys.id;-- 案例:查询每个工种的工种名和员工的个数,并且按员工个数降序SELECT job_title,COUNT(*) FROM employees e,jobs j WHERE e.`job_id`=j.`job_id` GROUP BY job_title ORDER BY COUNT(*) DESC;
非等值连接
-- 案例1:查询员工的工资和工资级别SELECT salary,grade_level FROM employees e,job_grades g WHERE salary BETWEEN g.`lowest_sal` AND g.`highest_sal` AND g.`grade_level`='A';
自连接
-- 案例:查询 员工名和上级的名称SELECT e.employee_id,e.last_name,m.employee_id,m.last_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 排序列表】
案例:
内连接
等值连接
-- 案例1.查询员工名、部门名SELECT last_name,department_name FROM departments d JOIN employees e ON e.`department_id` = d.`department_id`;
非等值连接
-- 查询员工的工资级别SELECT salary,grade_level FROM employees e JOIN job_grades g ON e.`salary` BETWEEN g.`lowest_sal` AND g.`highest_sal`;
自连接
-- 查询员工的名字、上级的名字SELECT e.last_name,m.last_name FROM employees e JOIN employees m ON e.`manager_id`= m.`employee_id`;
外连接
应用场景:用于查询一个表中有,另一个表没有的记录
左外连接:左表中所有的记录都出现在结果中,如果右表没有匹配的记录,使用NULL填充
-- 查询哪个部门没有员工SELECT d.*,e.employee_id FROM departments d LEFT OUTER JOIN employees e ON d.`department_id` = e.`department_id` WHERE e.`employee_id` IS NULL;
右外连接:右表中所有的记录都出现在结果中,如果左表没有对应的记录,使用NULL填充
SELECT d.*,e.employee_id FROM employees e RIGHT OUTER JOIN departments d ON d.`department_id` = e.`department_id`WHERE e.`employee_id` IS NULL;
全外连接
SELECT b.*,bo.* FROM beauty b FULL OUTER JOIN boys bo ON b.`boyfriend_id` = bo.id;
交叉连接
-- 交叉连接就相当于笛卡尔积了,一般没必要SELECT b.*,bo.* FROM beauty b CROSS JOIN boys bo;
注意:
- 外连接的查询结果为主表中的所有记录,如果从表中有和它匹配的,则显示匹配的值,如果从表中没有和它匹配的,则显示null,外连接查询结果=内连接结果+主表中有而从表没有的记录
- 左外连接,left join左边的是主表,右外连接,right join右边的是主表
- 左外和右外交换两个表的顺序,可以实现同样的效果
- 全外连接=内连接的结果+表1中有但表2没有的+表2中有但表1没有的
SQL92和SQL99语法比较
功能:sql99支持的较多
可读性:sql99实现连接条件和筛选条件的分离,可读性较高
子查询
含义:
- 将一个查询的结果做为另一个查询的条件
- 这是一种查询语句的嵌套,嵌套的SQL查询称为子查询。
- 如果使用子查询必须要使用括号
- 外部的查询语句,称为主查询或外查询
分类:
按子查询出现的位置:
select后面:仅仅支持标量子查询
from后面:支持表子查询
where或having后面:标量子查询(单行单列),列子查询 (多行多列)
exists后面(相关子查询):表子查询
按结果集的行列数不同:
标量子查询(单行单列)
列子查询(多行单列)
行子查询(单行多列)
表子查询(多行多列)
案例:
WHERE或HAVING后面
特点:
- 子查询放在小括号内
- 子查询一般放在条件的右侧
- 标量子查询,一般搭配着单行操作符使用 > < >= <= = <>
- 列子查询,一般搭配着多行操作符使用 in、any/some、all
- 子查询的执行优先于主查询执行,主查询的条件用到了子查询的结果
/*1、标量子查询(单行单列子查询)2、列子查询(多行单列子查询)3、行子查询(多列多行)*/-- 1.标量子查询★-- 案例1:谁的工资比 Abel 高?-- 查询Abel的工资SELECT salary FROM employees WHERE last_name = 'Abel'-- ②查询员工的信息,满足 salary>①结果SELECT * FROM employees WHERE salary > (SELECT salary FROM employees WHERE last_name = 'Abel');-- 案例2:返回job_id与141号员工相同,salary比143号员工多的员工 姓名,job_id 和工资-- ①查询141号员工的job_idSELECT job_id FROM employees WHERE employee_id = 141 -- ②查询143号员工的salarySELECT salary FROM employees WHERE employee_id = 143-- ③查询员工的姓名,job_id 和工资,要求job_id=①并且salary>②SELECT last_name,job_id,salary FROM employees WHERE job_id = (SELECT job_id FROM employees WHERE employee_id = 141) AND salary > (SELECT salary FROM employees WHERE employee_id = 143);-- 案例3:返回公司工资最少的员工的last_name,job_id和salary-- ①查询公司的 最低工资SELECT MIN(salary) FROM employees-- ②查询last_name,job_id和salary,要求salary=①SELECT last_name,job_id,salary FROM employees WHERE salary = (SELECT MIN(salary) FROM employees);-- 案例4:查询最低工资大于50号部门最低工资的部门id和其最低工资-- ①查询50号部门的最低工资SELECT MIN(salary) FROM employees WHERE department_id = 50-- ②查询每个部门的最低工资SELECT MIN(salary),department_id FROM employees GROUP BY department_id-- ③在②基础上筛选,满足min(salary)>①SELECT MIN(salary),department_id FROM employees GROUP BY department_id HAVING MIN(salary) > (SELECT MIN(salary) FROM employees WHERE department_id = 50);-- 非法使用标量子查询SELECT MIN(salary),department_id FROM employees GROUP BY department_id HAVING MIN(salary) > (SELECT salary FROM employees WHERE department_id = 250);-- 2.列子查询(多行子查询)★-- 案例1:返回location_id是1400或1700的部门中的所有员工姓名-- ①查询location_id是1400或1700的部门编号SELECT DISTINCT department_id FROM departments WHERE location_id IN(1400,1700)-- ②查询员工姓名,要求部门号是①列表中的某一个SELECT last_name FROM employees WHERE department_id <>ALL(SELECT DISTINCT department_id FROM departments WHERE location_id IN(1400,1700));-- 案例2:返回其它工种中比job_id为‘IT_PROG’工种任一工资低的员工的员工号、姓名、job_id 以及salary-- ①查询job_id为‘IT_PROG’部门任一工资SELECT DISTINCT salary FROM employees WHERE job_id = 'IT_PROG'-- ②查询员工号、姓名、job_id 以及salary,salary<(①)的任意一个SELECT last_name,employee_id,job_id,salary FROM employees WHERE salary<ANY(SELECT DISTINCT salary FROM employees WHERE job_id = 'IT_PROG') AND job_id<>'IT_PROG';-- 或SELECT last_name,employee_id,job_id,salary FROM employees WHERE salary<(SELECT MAX(salary)FROM employees WHERE job_id = 'IT_PROG') AND job_id<>'IT_PROG';-- 案例3:返回其它部门中比job_id为‘IT_PROG’部门所有工资都低的员工的员工号、姓名、job_id 以及salarySELECT last_name,employee_id,job_id,salary FROM employees WHERE salary<ALL(SELECT DISTINCT salary FROM employeesWHERE job_id = 'IT_PROG') AND job_id <> 'IT_PROG';-- 或SELECT last_name,employee_id,job_id,salary FROM employees WHERE salary<(SELECT MIN( salary) FROM employees WHERE job_id = 'IT_PROG') AND job_id <> 'IT_PROG';-- 3、行子查询(结果集一行多列或多行多列)-- 案例:查询员工编号最小并且工资最高的员工信息SELECT * FROM employees WHERE (employee_id,salary)=(SELECT MIN(employee_id),MAX(salary) FROM employees);-- ①查询最小的员工编号SELECT MIN(employee_id) FROM employees-- ②查询最高工资SELECT MAX(salary) FROM employees-- ③查询员工信息SELECT * FROM employees WHERE employee_id=(SELECT MIN(employee_id) FROM employees)AND salary = (SELECT MAX(salary)FROM employees);
SELECT后面
/*仅仅支持标量子查询*/-- 案例:查询每个部门的员工个数SELECT d.*,(SELECT COUNT(*) FROM employees e WHERE e.department_id = d.`department_id`) 个数 FROM departments d; -- 案例2:查询员工号=102的部门名SELECT (SELECT department_name,e.department_id FROM departments d INNER JOIN employees e ON d.department_id=e.department_id WHERE e.employee_id = 102) 部门名;
FROM后面
/*将子查询结果充当一张表,要求必须起别名*/-- 案例:查询每个部门的平均工资的工资等级-- ①查询每个部门的平均工资SELECT AVG(salary),department_id FROM employees GROUP BY department_idSELECT * FROM job_grades;#②连接①的结果集和job_grades表,筛选条件平均工资 between lowest_sal and highest_salSELECT ag_dep.*,g.`grade_level` FROM (SELECT AVG(salary) ag,department_id FROM employees GROUP BY department_id) ag_dep INNER JOIN job_grades g ON ag_dep.ag BETWEEN lowest_sal AND highest_sal;
EXISTS后面(相关子查询)
/*语法:EXISTS(完整的查询语句),其实就是查询子查询中是否有数据结果:1或0*/SELECT EXISTS(SELECT employee_id FROM employees WHERE salary=300000);-- 案例1:查询有员工的部门名-- INSELECT department_name FROM departments d WHERE d.`department_id` IN(SELECT department_id FROM employees)-- EXISTSSELECT department_name FROM departments d WHERE EXISTS(SELECT * FROM employees e WHERE d.`department_id` = e.`department_id`);-- 案例2:查询没有女朋友的男神信息-- INSELECT bo.* FROM boys bo WHERE bo.id NOT IN(SELECT boyfriend_id FROM beauty)-- EXISTSSELECT bo.* FROM boys bo WHERE NOT EXISTS(SELECT boyfriend_id FROM beauty b WHERE bo.`id` = b.`boyfriend_id`);
分页查询
限制从服务器返回的数据行数,通常用于分页操作,起始行从 0 开始编号
语法:
SELECT 列名 FROM 表名 LIMIT 起始索引(从0开始),每页条数;
案例:
SELECT 查询列表 FROM 表【join type JOIN 表2 ON 连接条件 WHERE 筛选条件 GROUP BY 分组字段 HAVING 分组后的筛选 ORDER BY 排序的字段】 LIMIT 【offset,】size; -- offset要显示条目的起始索引(起始索引从0开始) -- size 要显示的条目个数 -- 案例1:查询前五条员工信息SELECT * FROM employees LIMIT 0,5;SELECT * FROM employees LIMIT 5;-- 案例2:查询第11条——第25条SELECT * FROM employees LIMIT 10,15;-- 案例3:有奖金的员工信息,并且工资较高的前10名显示出来SELECT * FROM employees WHERE commission_pct IS NOT NULL ORDER BY salary DESC LIMIT 10 ;
注意:
- limit语句放在查询语句的最后
- 公式:要显示的页数 page,每页的条目数size
SELECT 查询列表 FROM 表 LIMIT (page-1) * size,size;
联合查询
union 联合 合并:将多条查询语句的结果合并成一个结果
应用场景:
要查询的结果来自于多个表,且多个表没有直接的连接关系,但查询的信息一致时
语法:
SELECT 查询列表 FROM 表(查询语句一)UNIONSELECT 查询列表 FROM 表(查询语句二)
案例:
-- 引入的案例:查询部门编号>90或邮箱包含a的员工信息SELECT * FROM employees WHERE email LIKE '%a%' OR department_id > 90;SELECT * FROM employees WHERE email LIKE '%a%'UNIONSELECT * FROM employees WHERE department_id>90;-- 案例:查询中国用户中男性的信息以及外国用户中年男性的用户信息SELECT id,cname FROM t_ca WHERE csex='男'UNION ALLSELECT t_id,tname FROM t_ua WHERE tGender='male';
注意:
- 要求多条查询语句的查询列数是一致的!
- 要求多条查询语句的查询的每一列的类型和顺序最好一致
- union关键字默认去重,如果使用union all 可以包含重复项
4.TCL语句应用(事务管理)
事务概述
一个或一组SQL语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行。或者说要么全部成功,要么全部失败,将多个操作组成一个操作单元
事务的特性
ACID
原子性(Atomicity):一个事务不可再分割,要么都执行要么都不执行
一致性(Consistency):一个事务执行会使数据从一个一致状态切换到另外一个一致状态
隔离性(Isolation):一个事务的执行不受其他事务的干扰
持久性(Durability):一个事务一旦提交,则会永久的改变数据库的数据
事务的使用
隐式事务
事务没有明显的开启和结束的标记,比如insert、update、delete语句。
显式事务
事务具有明显的开启和结束的标记
前提:必须先设置自动提交功能为禁用
语法:
-- 步骤1:开启事务SET AUTOCOMMIT=0;START TRANSACTION;可选的-- 步骤2:编写事务中的sql语句(select insert update delete)语句1;-- 设置保存点(可选)SAVEPOINT a;语句2;...-- 步骤3:结束事务-- 提交事务COMMIT;-- 回滚事务ROLLBACK;-- 回滚到保存点(可选)ROLLBACK TO 节点名;-- 设置回滚节点SAVEPOINT 节点名;
事务的隔离级别
级别 | 名字 | 脏读 | 不可重复读 | 幻读 | 数据库默认隔离级别 |
---|---|---|---|---|---|
1 | 读未提交(read uncommitted) | 是 | 是 | 是 | |
2 | 读已提交(read committed) | 否 | 是 | 是 | Oracle和SQL Server |
3 | 可重复读(repeatable read) | 否 | 否 | 是 | MySQL |
4 | 串行化(serializable) | 否 | 否 | 否 |
隔离级别的特点:
- 级别1最低,级别4最高
- 隔离级别越高,性能越低,安全性越高
隔离级别(并发事务)引发的问题
事务的隔离级别通常决定数据库在并发操作时会出现的问题
并发访问的问题 | 含义 |
---|---|
脏读 | 一个事务读取到了另一个事务没有提交的数据 |
不可重复读 | 在数据库中一个事务无论查询多少次数据,每次查询的结果应该是一样的, 这叫可以重复读取。如果两次读取数据不同,则称为不可重复读。 通常是一个事务在查询的时候,另一个事务更新了表中数据 |
幻读 | 一个事务在查询表中记录数量的时候, 如果有另一个事务插入或删除了表中的记录。 就会导致这个事务多次查询记录数不同 |
四种隔离级别起的作用
- Read uncommitted (读未提交): 级别最低,会同时出现三种问题
- Read committed (读已提交):可以解决脏读的问题
- Repeatable read (可重复读):可以解决脏读和不可重复读的问题
- Serializable (串行化): 所有的事务都是以串行的方式执行,没有并发执行的事务
注意:所谓的事务针对的是数据表记录的增删改查,对表和库的操作无效
5.DCL语句应用
创建mysql用户
语法:
CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码'
案例:
-- 创建user1用户,只能在localhost这个服务器登录mysql服务器,密码为123CREATE USER 'user1'@'localhost' identified by '123'; -- 创建user2用户可以在任何电脑上登录mysql服务器,密码为123CREATE USER 'user2'@'%' identified by '123';
给用户授权
针对不同的用户,赋予不同的访问权限
语法:
GRANT 权限 ON 数据库名.表名 TO '用户名'@'主机名'
案例:
-- 给user1用户分配对test这个数据库操作的权限:创建表,修改表,插入记录,更新记录,查询GRANT CREATE,ALTER,INSERT,UPDATE,SELECT ON test.* TO 'user1'@'localhost';-- 给user2用户分配所有权限,对所有数据库的所有表 GRANT ALL ON *.* TO 'user2'@'%';
撤销权限
回收用户的权限
语法:
REVOKE 权限 ON 数据库名.表名 FROM '用户名'@'主机名'
案例:
-- 撤销user1用户对test数据库所有表的操作的权限,注:用户名和主机名要与创建时相同,各自要加上单引号REVOKE ALL ON test.* FROM 'user1'@'localhost';
删除用户、修改密码
删除用户
语法:
DROP USER '用户名'@'主机名'
案例:
-- 删除user2用户DROP USER 'user2'@'%';
修改管理员密码
在DOS命令行下执行
mysqladmin.exe 在MySQL安装目录下的bin文件夹中
语法:
mysqladmin -u 用户名 -p password 新密码
案例:
-- 修改管理由密码为123456,并用新密码登陆mysqladmin -u root -p password 123456
修改其它用户的密码
需要用户先登陆,然后才能修改密码
语法:
SET password = password('密码')
案例:
-- 修改user1的密码为abc,并以新的密码登录set password=password('abc');
本文需要用到的测试数据
/*!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*/`girls` /*!40100 DEFAULT CHARACTER SET utf8 */;USE `girls`DROP TABLE IF EXISTS `admin`;CREATE TABLE `admin` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(10) NOT NULL, `password` varchar(10) NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;insert into `admin`(`id`,`username`,`password`) values (1,'john','8888'),(2,'lyt','6666');DROP TABLE IF EXISTS `beauty`;CREATE TABLE `beauty` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) NOT NULL, `sex` char(1) DEFAULT '女', `borndate` datetime DEFAULT '1987-01-01 00:00:00', `phone` varchar(11) NOT NULL, `photo` blob, `boyfriend_id` int(11) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8;insert into `beauty`(`id`,`name`,`sex`,`borndate`,`phone`,`photo`,`boyfriend_id`) values (1,'柳岩','女','1988-02-03 00:00:00','18209876577',NULL,8),(2,'苍老师','女','1987-12-30 00:00:00','18219876577',NULL,9),(3,'Angelababy','女','1989-02-03 00:00:00','18209876567',NULL,3),(4,'热巴','女','1993-02-03 00:00:00','18209876579',NULL,2),(5,'周冬雨','女','1992-02-03 00:00:00','18209179577',NULL,9),(6,'周芷若','女','1988-02-03 00:00:00','18209876577',NULL,1),(7,'岳灵珊','女','1987-12-30 00:00:00','18219876577',NULL,9),(8,'小昭','女','1989-02-03 00:00:00','18209876567',NULL,1),(9,'双儿','女','1993-02-03 00:00:00','18209876579',NULL,9),(10,'王语嫣','女','1992-02-03 00:00:00','18209179577',NULL,4),(11,'夏雪','女','1993-02-03 00:00:00','18209876579',NULL,9),(12,'赵敏','女','1992-02-03 00:00:00','18209179577',NULL,1);DROP TABLE IF EXISTS `boys`;CREATE TABLE `boys` ( `id` int(11) NOT NULL AUTO_INCREMENT, `boyName` varchar(20) DEFAULT NULL, `userCP` int(11) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;insert into `boys`(`id`,`boyName`,`userCP`) values (1,'张无忌',100),(2,'鹿晗',800),(3,'黄晓明',50),(4,'段誉',300);
/*!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`;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;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);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;
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');
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;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);
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;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');
CREATE TABLE job_grades(grade_level VARCHAR(3), lowest_sal int, highest_sal int);INSERT INTO job_gradesVALUES ('A', 1000, 2999);INSERT INTO job_gradesVALUES ('B', 3000, 5999);INSERT INTO job_gradesVALUES('C', 6000, 9999);INSERT INTO job_gradesVALUES('D', 10000, 14999);INSERT INTO job_gradesVALUES('E', 15000, 24999);INSERT INTO job_gradesVALUES('F', 25000, 40000);
发表评论
最新留言
关于作者
