关于sql:数据库

8次阅读

共计 13581 个字符,预计需要花费 34 分钟才能阅读完成。

根本应用

数据库 DataBase

  • 学习数据库次要学习的就是如何对数据进行增删改查操作
  • 平时所提到的数据库 (DBMS 数据库管理系统) 实际上就是款软件, 电脑上装置了这个软件, 电脑就能够成为数据库服务器
  • 常见的 DBMS(数据库软件):

    • MySQL: Oracle 公司产品, MySQL 在 08 年被 Sun 公司收买,09 年 Sun 公司被 Oracle 收买, 目前市占率第一, 开源软件, 原 MySQL 创始人从 Oracle 到职开办 MariaDB
    • Oracle: Oracle 公司产品, 闭源, 性能最强价格最贵, 市占率第二 , 拉里埃里森
    • SQLServer: 微软公司产品, 市占率第三 , 闭源 . 次要利用在微软的整套解决方案中(开发网站须要用到的所有 = 编程语言 +web 服务软件 + 操作系统 + 数据库软件)
    • DB2: IBM 公司产品, 闭源 次要利用在 IBM 的整套解决方案中
    • SQLite: 轻量级数据库, 安装包只有几十 k, 性能只具备最根底的增删改查 .
  • 开源和闭源

    • 开源: 凋谢源代码, 有技术大拿无偿保护降级, 产品收费 靠卖服务盈利
    • 闭源: 不凋谢源代码, 有黑客或技术大拿攻打, 然而闭源公司有钱 雇人保护降级, 靠卖产品和卖服务盈利
  • 学习数据库次要是学习一门语言: SQL(Structured Query Language) 结构化查询语言 , 用于程序员和数据库软件之间进行交换
  • 执行 SQL 语句须要先连贯数据库软件

    • window: 开始 -> 所有程序 ->MySQL 或 MariaDB->MySQL Client 点击 运行输出明码后回车
  • Linux 零碎: 在桌面上右键 关上终端, 输出 mysql -uroot -p 回车 输出明码再回车.
  • 如何查看 MySQL 服务是否开启?

    在我的电脑上右键 -> 治理 -> 服务 ->MySQL 查看是否启动 如果没有, 右键启动

SQL 语句分类:

  • DDL: 数据定义语言,
  • DML: 数据操作语言
  • DQL: 数据查询语言
  • TCL: 事务管制语言
  • DCL: 数据管制语言

DDL 数据定义语言

  • 包含数据库相干和表相干的 SQL 语句
  • 应用数据库软件保留数据须要先建库再建表

数据库相干的 SQL

  1. 查问所有数据库

    • 格局: show databases;
  2. 创立数据库

    • 格局: create database 数据库名;
    • 举例:

      create database db1;

      create database db2 character set utf8;

      create database db3 character set gbk;

  3. 查询数据库详情

    • 格局: show create database 数据库名;
    • 举例:

      show create database db1;

  4. 删除数据库

    • 格局: drop database 数据库名;
    • 举例:

      drop database db3;

  5. 应用数据库

    • 格局: use 数据库名;
    • 举例:

      use db1;

数据库相干回顾

  1. 查问所有 show databases;
  2. 创立 create database db1 character set utf8/gbk;
  3. 查问详情 show create database db1;
  4. 删除数据库 drop database db1;
  5. 应用数据库 use db1;

数据库相干练习

  1. 别离创立 mydb1 和 mydb2 数据库 字符集第一个是 utf8 第二个是 gbk

    create database mydb1;

    create database mydb2 character set gbk;

  2. 查问所有数据库查看是否创立胜利

    show databases;

  3. 别离查问两个数据库的字符集 查看是否胜利

    show create database mydb1;

    show create database mydb2;

  4. 先应用 mydb1 再应用 mydb2

    use mydb1;

    use mydb2;

  5. 删除两个数据库

    drop database mydb1;

    drop database mydb2;

表相干的 SQL

  • 操作表相干的 SQL 语句肯定要保障应用了某个数据库, 不然会报错
  1. 创立表

    • 格局: create table 表名(字段 1 名 类型, 字段 2 名 类型);
    • 格局: create table 表名(字段 1 名 类型, 字段 2 名 类型) charset=utf8/gbk;
    • 举例:

      create table student(name varchar(20),age int);

      create table hero(name varchar(20),type varchar(20), money int)charset=gbk;

  2. 查问所有表

    • 格局: show tables;
  3. 查问表详情

    • 格局: show create table 表名;
    • 举例: show create table hero;
  4. 查问表字段

    • 格局: desc 表名;
  5. 删除表

    • 格局: drop table 表名;
  6. 批改表名

    • 格局: rename table 原名 to 新名;

      rename table student to stu;

练习题

  1. 创立数据库 db5 字符集为 gbk 并应用

    create database db5 character set gbk;

    use db5;

  2. 创立表 t_hero 英雄表 有名字和年龄字段 默认字符集

    create table t_hero(name varchar(20),age int);

  3. 批改表名为 hero

    rename table t_hero to hero;

  4. 查问表字段

    desc hero;

  5. 删除表 drop table hero;
  6. 删除数据库 drop database db5;

表相干续

  1. 给表增加字段

    • 最初面增加格局: alter table 表名 add 字段名 类型;
    • 最后面增加格局: alter table 表名 add 字段名 类型 first;
    • 在 xxx 字段前面增加格局: alter table 表名 add 字段名 类型 after xxx;
    • 举例:

      create table emp(name varchar(20));

      alter table emp add age int;

      alter table emp add id int first;

      alter table emp add gender varchar(10) after name;

  2. 删除表字段

    • 格局: alter table 表名 drop 字段名;

      alter table emp drop gender;

  3. 批改表字段

    • 格局: alter table 表名 change 原名 新名 新类型;
    • 举例: alter table emp change age salary int;

表相干回顾

  1. 创立表 create table t1(name varchar(20),age int)charset=utf8/gbk;
  2. 查问所有表 show tables;
  3. 查问表字段 desc t1;
  4. 查问表详情 show create table t1;
  5. 删除表 drop table t1;
  6. 批改表名 rename table t1 to t2;
  7. 增加表字段 alter table t1 add age int first/after xxx;
  8. 删除表字段 alter table t1 drop age;
  9. 批改表字段 alter table t1 change 原名 新名 新类型;

DML 数组操作语言

  • 包含对数据的增删改查
create database db4 character set utf8;
use db4;
create table person(name varchar(20),age int)charset=utf8;
  1. 插入数据

    • 全表插入格局: insert into 表名 values(值 1, 值 2, 值 3);
    • 指定字段插入格局: inert into 表名(字段 1 名, 字段 2 名) values(值 1, 值 2);
    • 举例:

      insert into person values(“Tom”,18);

      insert into person(name) values(“Jerry”);

    • 批量插入格局: insert into 表名 values(值 1, 值 2, 值 3),(值 1, 值 2, 值 3),(值 1, 值 2, 值 3);

      insert into person values(“Lucy”,20),(“Lily”,21);

      insert into person(name) values(“Lilei”),(“Hanmeimei”);

    • 插入中文数据:

      insert into person values(“ 传奇哥 ”,18);

      如果执行带有中文的 SQL 语句报以下谬误, 解决方案: set names gbk;

  • 查问

    • 格局: select 字段信息 from 表名 where 条件;
    • 举例:

      select name from person;

      select name,age from person;

      select * from person;

      select * from person where age=18;

      select * from person where name=”Lucy”;

  • 批改

    • 格局: update 表名 set 字段 1 名 = 值, 字段 2 名 = 值 where 条件;
    • 举例:

      ​ update person set age=50 where name=’Jerry’;

      ​ 把 Tom 名字改成汤姆年龄改成 50

      ​ update person set age=50,name=” 汤姆 ” where name=”Tom”;

  • 删除

    • 格局: delete from 表名 where 条件;
    • 举例:

      delete from person where name=”Lucy”;

      delete from person where age<50;

      delete from person;

数据相干 SQL 回顾

  1. 插入数据: insert into t1(字段 1 名, 字段 2 名) values(值 1, 值 2),(值 1, 值 2);
  2. 查问数据: select 字段信息 from t1 where 条件;
  3. 批改数据: update t1 set xxx=xxx,xxx=xxx where 条件;
  4. 删除数据: delete from t1 where 条件;

综合练习

1. 创立数据库 mydb3 字符集 utf8 并应用
create database mydb3 character set utf8;
use mydb3;
2. 创立 hero 表 字段:id,name,type varchar(10)
create table hero(id int,name varchar(10),type varchar(10));
3. 表中插入以下数据: 
    insert into hero values
    (1, '李白', '刺客'),(2, '诸葛亮' , '法师'),   (3, '刘备', '兵士'),
    (4, '孙尚香', '射手'),   (5, '关羽', '兵士'),  (6, '刘禅', '辅助');
4. 批改李白的 type 为诗人   update hero set type='诗人' where name='李白';
5. 给表增加 money 字段     alter table hero add money int;
6. 批改 id 小于 5 的 money 为 6888    update hero set money=6888 where id<5; 
7. 批改诗人为打野  update hero set type="打野" where type="诗人";     
8. 批改刘禅名字为阿斗价格为 50  update hero set name="阿斗",money=50 where name="刘禅";
9. 删除 id 大于 5 的数据   delete from hero where id>5;
10. 批改所有英雄的价格为 13888    update hero set money=13888;
11. 批改表名为 heros     rename table hero to heros;       
12. 删除 money 字段  alter table heros drop money;
13. 删除所有数据   delete from heros;
14. 删除表   drop table heros;         15. 删除数据库  drop database mydb3;

数据库数据类型

  • 整数: int(m) 和 bigint(m) , m 代表显示长度, m=10 18 0000000018 , 须要和 zerofill 关键字联合应用

    create table t1 (id int,age int(10) zerofill);

    insert into t1 values(1,18);

    select * from t1;

  • 浮点数: double(m,d) m 代表总长度, d 代表小数长度 54.234 m=5 d=3 , decimal(m,d)是超高精度浮点数, 只有波及到超高精度运算时应用
  • 字符串:

    • char(m): 固定长度字符串, m=10 存 abc 长度占 10, 执行效率高于可变长度, 最大长度为 255
    • varchar(m): 可变长度字符串,m=10 存 abc 长度占 3, 节俭空间, 最大长度 65535 倡议保留 255 以内长度的数据
    • text(m): 可变长度字符串 最大长度也是 65535 倡议保留长度大于 255 的数据

短的用 varchar 长的用 text

  • 日期

    • date: 只能保留年月日
    • time: 只能保留时分秒
    • datetime: 年月日时分秒 , 默认值是 null, 最大值 9999-12-31
    • timestamp: 工夫戳 年月日时分秒, 默认值为以后零碎工夫, 最大值 2038-1-19
    • 测试日期类型:

      create table t_date(t1 date,t2 time,t3 datetime,t4 timestamp);

      insert into t_date values(“2020-10-10”,null,null,null);

      insert into t_date values(null,”17:12:11″,”2018-11-12 11:11:11″,null);

具体应用

### 主键束缚

  • 什么是束缚:束缚是创立表字段时增加的限度条件
  • 什么是主键:示意数据唯一性的字段称为主键
  • 主键束缚: 限度主键的值 惟一且非空
  • 如何应用:

                    create table t1(id int primary key,name varchar(20));
    
                    insert into t1 values(1,'aaa');   // 正确
    
                    insert into t1 values(1,'bbb');   // 报错   Duplicate entry 反复数据
    
                    insert into t1 values(null,'ccc'); // 报错   Cannot be null 不能为空
    

自增 auto_increment

  • 自增规定:从历史最大值 +1
  • 如何应用:

    create table t2(id int primary key auto_increment,name varchar(10));

    insert into t2 values(null,’aaa’); 1

    insert into t2 values(null,’bbb’); 2

    insert into t2 values(10,’ccc’); 10

    insert into t2 values(null,’ddd’); 11

    delete from t2 where id>=10;

    insert into t2 values(null,’eee’); 12

导入 *.sql 批处理文件

  • 下载 emp.zip 解压失去 emp.sql 把文件复制到 d 盘根目录 其它零碎放到桌面
  • 在终端中执行以下指令 导入 emp.sql 外面的数据 到 MySQL 中

    source d:/emp.sql;

  • 测试:select * from emp; // 如果有乱码 执行 set names gbk;

is null 和 is not null

  • 查问字段的值为 null 时 应用 is null 反之应用 is not null

    • 查问没有上级领导的员工信息

      select * from emp where mgr is null;

    • 查问有上级领导的员工信息

      select * from emp where mgr is not null;

去重 distinct

  • 查问员工表中呈现的不同的工作

    select distinct job from emp;

  • 查问员工表中呈现的部门编号 去掉反复

    select distinct deptno from emp;

比拟运算符 > < >= <= = != 和 <>

  1. 查问工资小于等于 3000 的员工姓名和工资

    select ename,sal from emp where sal<=3000;

  2. 查问工作不是程序员的员工姓名和工作(两种写法)

    select ename,job from emp where job!=” 程序员 ”;

    select ename,job from emp where job<>” 程序员 ”;

and 和 or

  • and 相似 Java 中的 &&,有多个条件同时满足时应用
  • or 类型 java 中的 ||,有多个条件满足一个就行的时候应用
  1. 查问 1 号部门工资小于 3000 的员工信息

    select * from emp where deptno=1 and sal<3000;

  2. 查问 3 号部门或工作是程序员的员工信息

    select * from emp where deptno=3 or job=’ 程序员 ’;

  3. 查问有上级领导中工资小于 2000 的员工姓名,工资和领导编号

    select ename,sal,mgr from emp where mgr is not null and sal<2000;

in 关键字

  1. 查问工资值为 3000,1500,5000 的员工信息

    select * from emp where sal=3000 or sal=1500 or sal=5000;

    select * from emp where sal in(3000,1500,5000);

  2. 查问工作是程序员和 CEO 的员工姓名和工作

    select ename,job from emp where job in(“ 程序员 ”,”CEO”);

between x and y 在两者之间 蕴含 x 和 y

  1. 查问工资在 1000-2000 之间的员工信息

    select * from emp where sal>=1000 and sal<=2000;

    select * from emp where sal between 1000 and 2000;

  2. 查问工资在 1000-2000 以外的员工信息

    select * from emp where sal not between 1000 and 2000;

综合练习

  1. 查问有上级领导并且是 3 号部门的员工信息

    select * from emp where mgr is not null and deptno=3;

  2. 查问 2 号部门工资在 1000 到 2000 之间的员工姓名 工资和部门编号

    select ename,sal,deptno from emp where deptno=2 and sal between 1000 and 2000;

  3. 查问 1 号部门工资为 800 和 1600 的员工信息

    select * from emp where deptno=1 and sal in(800,1600);

  4. 查问 1 号和 2 号部门工资高于 2000 的员工信息

    select * from emp where deptno in(1,2) and sal>2000;

含糊查问 like

  • _:代表 1 个未知字符
  • %:代表 0 或多个未知字符
  • 举例:

    • 以 x 结尾 x%
    • 以 x 结尾 %x
    • 以 x 结尾 y 结尾 x%y
    • 蕴含 x %x%
    • 第二个字符是 x _x%
    • 第二个是 x 倒数第三个是 y x%y_
  1. 查问姓孙的员工姓名

    select ename from emp where ename like “ 孙 %”;

  2. 查问工作中第二个字是售 的员工信息

    select * from emp where job like “_售 %”;

  3. 查问名字中以精结尾的员工姓名

    select ename from emp where ename like “% 精 ”;

  4. 查问名字蕴含僧字的员工姓名和工资

    select ename,sal from emp where ename like “% 僧 %”;

排序 order by

  • 格局: order by 字段名 asc 升序(默认)/desc 降序
  1. 查问每个员工的姓名和工资,依照工资升序排序

    select ename,sal from emp order by sal;

  2. 查问每个员工的姓名和工资,依照工资降序序排序

    select ename,sal from emp order by sal desc;

  3. 查问 3 号部门的员工信息 依照工资降序排序

    select * from emp where deptno=3 order by sal desc;

  4. 查问每个员工的姓名,工资和部门编号依照部门编号升序排序(多字段排序)

    select ename,sal,deptno from emp order by deptno,sal desc;

分页查问 limit

  • 格局:limit 跳过的条数, 申请的条数(每页的条数)
  • 举例:limit (页数 -1)* 条数,条数

    • 申请 1 页的 10 条数据 limit 0,10
    • 申请第三页的 5 条数数据 limit 10,5
    • 申请第 5 页的 8 条数据 limit 32,8
    • 申请 15 页的 10 条数据 limit 140,10
  1. 查问员工表中第一页的 5 条数据

    select * from emp limit 0,5;

  2. 查问员工表中第 2 页的 3 条数据

    select * from emp limit 3,3;

  3. 查问员工表中第 3 页的 2 条数据

    select * from emp limit 4,2;

  4. 查问工资高于 1000 的员工信息 依照工资降序排序查问前三条

    select * from emp where sal>1000 order by sal desc limit 0,3;

数值计算 + – * / %

  • 对查问的某个字段的值 进行计算
  1. 查问每个员工的姓名,工资和年终奖(年终奖 = 5 个月工资)

    select ename,sal,sal*5 from emp;

  2. 批改 1 号部门的员工工资 每人涨薪 5 块钱

    update emp set sal=sal+5 where deptno=1;

综合练习

1. 查问有领导并且工资在 1000 到 3000 之间的员工信息
select * from emp where mgr is not null and sal between 1000 and 3000;
2. 查问 1 号部门有几种不同的工作
select distinct job from emp where deptno=1;
3. 查问名字中蕴含精或者工作中蕴含序的员工姓名和工作
select ename,job from emp where ename like "% 精 %" or job like "% 序 %";
4. 查问 3 号部门工资最高的员工姓名和工资
select ename,sal from emp where deptno=3 order by sal desc limit 0,1;
5. 查问上级领导编号是 8 工资最高的 3 集体的信息
select * from emp where mgr=8 order by sal desc limit 0,3;
6. 查问 1 号部门和 2 号部门的员工信息工资升序,查问第 3 页的 2 条数据
select * from emp where deptno in(1,2) order by sal limit 4,2;

聚合函数

  • 聚合函数就是对查问的多条数据进行统计查问
  • 统计形式:1. 平均值 2. 最大值 3. 最小值 4. 求和 5. 计数
  1. 平均值 avg(字段名)

    • 查问所有员工的平均工资

      select avg(sal) from emp;

    • 查问 2 号部门的平均工资

      select avg(sal) from emp where deptno=2;

  2. 最大值 max(字段名)

    • 查问 1 号部门的最高工资

      select max(sal) from emp where deptno=1;

    • 查问工资高于 2000 块钱的员工中资格最小的员工是什么时候入职的

      select max(hiredate) from emp where sal>2000;

  3. 最小值 min(字段名)

    • 查问 2 号部门的最低工资

      select min(sal) from emp where deptno=2;

  4. 求和 sum(字段名)

    • 查问 1 号部门的工资总和

      select sum(sal) from emp where deptno=1;

  5. 计数 count(字段名)

    • 查问 1 号部门工资大于 2000 的员工数量

      select count(*) from emp where deptno=1 and sal>2000;

别名

    select ename as "姓名" from emp;

select ename "姓名" from emp;

   select ename 姓名 from emp;
  1. 查问 1 号部门的平均工资,最高工资,最低工资,工资总和,人数 起别名

    select avg(sal) 平均工资, max(sal) 最高工资,min(sal) 最低工资,sum(sal) 工资总和,count(*) 人数 from emp where deptno=1;

综合练习题

  1. 查问员工表中工资高于 2000 的员工姓名和工资, 依照工资升序排序, 查问第二页的 2 条数据(每页 2 条)

    select ename,sal from emp where sal>2000 order by sal limit 2,2;

  2. 查问和销售相干工作的工资总和

    select sum(sal) from emp where job like “% 销售 %”;

  3. 查问程序员的人数 select count(*) from emp where job=” 程序员 ”;
  4. 查问 1 号部门中有领导的员工中的最高工资

    select max(sal) from emp where deptno=1 and mgr is not null;

  5. 查问 2 号部门的最高工资和最低工资并起别名

    select max(sal) 最高工资,min(sal) 最低工资 from emp where deptno=2;

  6. 查问 1 号部门的外面名字中蕴含空的员工姓名

    select ename from emp where deptno=1 and ename like “% 空 %”;

分组查问 group by

  • 分组查问能够将某个字段雷同值的数据划分成一组 而后进行统计查问
  1. 查问每个部门的平均工资

    select deptno,avg(sal) from emp group by deptno;

  2. 查问每个部门的最高工资

    select deptno,max(sal) from emp group by deptno;

  3. 查问每种工作的工资总和

    select job,sum(sal) from emp group by job;

  4. 查问每个部门工资高于 2000 的员工人数

    select deptno,count(*) from emp where sal>2000 group by deptno;

各个关键字的程序

select * from 表名  where 条件  group by 分组字段名 order by 排序字段  limit 跳过条数,申请条数
  1. 查问每个部门工资高于 1000 的员工人数,依照人数降序排序取前两条数据

    select deptno,count(*) from emp where sal>1000 group by deptno order by count(*) desc limit 0,2;

综合练习题

1. 查问没有上级领导的员工编号 empno,姓名,工资
2. 查问有奖金的员工姓名和奖金
3. 查问名字中蕴含精的员工姓名和工资
4. 查问名字中第二个字是八的员工信息
5. 查问 1 号部门工资大于 2000 的员工信息
6. 查问 2 号部门或者工资低于 1500 的员工信息
7. 查问工资为 3000,1500,5000 的员工信息依照工资升序排序
8. 查问 3 号部门的工资总和
9. 查问每个部门工资大于 1000 的员工人数,依照人数升序排序
10. 查问每种工作中有领导的员工人数依照人数降序排序
11. 查问所有员工信息,依照部门编号升序排序,如果部门编号统一则工资降序
12. 查问有领导的员工,每个部门的编号和最高工资
13. 查问有领导的员工,依照工资升序排序,第 3 页的 2 条数据
14. 查问员工表中工资高于 2000 的员工姓名和工资, 依照工资升序排序, 查问第二页的 2 条数据
15. 查问和销售相干的工作的工资总和
16. 查问程序员人数 
17. 查问 1 号部门中有领导的员工中的最高工资
18. 查问 2 号部门的最高工资和最低工资 起别名
19. 查问 1 号部门外面名字中蕴含空字的员工姓名
20. 查问每个部门工资低于 2000 的人数

having 关键字

  • where 前面只能写一般字段条件,having 前面写聚合函数条件
  • having 要和 group by 联合应用,并且写在 group by 的前面
  1. 查问每个部门的平均工资,要求平均工资大于 2000

    select deptno,avg(sal) from emp group by deptno having avg(sal)>2000;

    select deptno,avg(sal) a from emp group by deptno having a>2000;

  2. 查问每种工作的人数,只查问人数大于 1 的

    select job,count(*) c from emp group by job having c>1;

  3. 查问每个部门的工资总和,只查问有领导的员工,并且要求工资总和高于 5400

    select deptno,sum(sal) s from emp where mgr is not null group by deptno having s>5400;

  4. 查问每个部门的平均工资, 只查问工资在 1000 到 3000 之间的, 并且过滤掉平均工资低于 2000 的部门

    select deptno,avg(sal) a from emp

    where sal between 1000 and 3000 group by deptno having a>=2000;

  5. 查问每种工作的人数要求人数大于 1 个, 并且只查问 1 号部门和 2 号部门的员工, 依照人数降序排序

    select job,count(*) c from emp where deptno in(1,2) group by job having c>1 order by c desc;

各个关键字的程序

select 字段信息 from 表名 where 一般字段条件 group by 分组字段名 having 聚合函数条件 order by 排序字段名 limit 跳过条数, 申请条数

子查问(嵌套查问)

  1. 查问工资高于 1 号部门平均工资的员工信息

    select avg(sal) from emp where deptno=1;

    select * from emp where sal>2330;

    • 合并下面两条 SQL

      select * from emp where sal>(select avg(sal) from emp where deptno=1);

  2. 查问工资最高的员工信息

    select max(sal) from emp;

    select * from emp where sal=(select max(sal) from emp);

  3. 查问工资高于 2 号部门最低工资的员工信息

    select * from emp where sal>(select min(sal) from emp where deptno=2);

  4. 查问和孙悟空雷同工作的其它员工信息

    select job from emp where ename=” 孙悟空 ”;

    select * from emp where job=(select job from emp where ename=” 孙悟空 ”) and ename!=” 孙悟空 ”;

  5. 查问拿最低工资员工的共事们的信息(共事指雷同部门)

    • 失去最低工资

      select min(sal) from emp;

    • 失去最低工资的员工的部门编号

      select deptno from emp where sal=(select min(sal) from emp);

    • 失去下面部门编号的员工 并且排除掉最低工资的员工

      select * from emp where deptno=(select deptno from emp where sal=(select min(sal) from emp)) and sal!=(select min(sal) from emp);

  6. 查问白骨精的部门信息(须要用到部门表 dept)

    select deptno from emp where ename=” 白骨精 ”;

    select * from dept where deptno=(select deptno from emp where ename=” 白骨精 ”);

表关系(💖)- 关联关系

  • 创立表时, 表和表之间存在的业务关系
  • 有哪几种关系:

    • 一对一(个别写在一张表, 比拟少见): 有 AB 两张表,A 表中一条数据对应 B 表中的一条数据, 同时 B 表中的一条数据也对应 A 表中的一条数据.

      eg: 一个人只有一张身份证, 一张身份证只对应一个档案, 一份档案只保留一个身份信息

    • 一对多 (最常见): 有 AB 两张表,A 表中一条数据对应 B 表中的多条数据, 同时 B 表中的一条数据对应 A 表中的一条数据.

      eg: 一个部门有多个员工, 一个员工只能属于一个部门

    • 多对多: 有 AB 两张表,A 表中一条数据对应 B 表中的多条数据, 同时 B 表中的一条数据也对应 A 表中的多条数据.

      eg: 一个老师教多个学生, 一个学生被多个老师教

  • 表和表之间如何建设关系

    通过一个独自的字段指向另外一张表 (或本人表) 的主键, 这个字段称为外键

关联查问

  • 同时查问多张存在关联关系的表时 应用的查问形式称为关联查问
  • 关联查问的查问形式有三种: 1. 等值连贯 2. 内连贯 3. 外连贯

关联查问之等值连贯

  • 格局: select * from A,B where A.x=B.x(关联关系) and A.age>30;
  1. 查问每个员工的姓名和对应的部门名

    select ename,dname from emp e,dept d where e.deptno=d.deptno;

  2. 查问 2 号部门员工的姓名, 工资和部门地址

    select ename,sal,loc from emp e, dept d where e.deptno=d.deptno and e.deptno=2;

  3. 查问孙悟空和刘备的部门信息

    select d.*

    from emp e, dept d

    where e.deptno=d.deptno

    and ename in(“ 孙悟空 ”,” 刘备 ”);

关联查问之内连贯

  • 等值连贯和内连贯的作用是一样的, 查问到的是两个表的交加数据
  • 格局: select * from A join B on A.x=B.x(关联关系) where A.age>30;
  1. 查问每个员工的姓名和对应的部门名

    select ename,dname from emp e join dept d on e.deptno=d.deptno;

  2. 查问 1 号部门有领导的员工姓名, 工资, 部门名和部门地址

    select ename,sal,dname,loc

    from emp e join dept d

    on e.deptno=d.deptno

    where e.deptno=1 and e.mgr is not null;

关联查问之外连贯

  • 查问的是一张表的全副和另外一张表的交加
  • 格局: select * from A left/right join B on A.x=B.x(关联关系) where A.age>30;

    • 筹备一个员工表中的交加以外的数据

      insert into emp (empno,ename) values(100,’ 灭霸 ’);

    1. 查问所有员工的姓名和对应的部门名

      select ename,dname

      from emp e left join dept d

      on e.deptno=d.deptno;

    2. 查问所有部门的名称, 地址和对应的员工姓名

      select dname,loc,ename

      from emp e right join dept d

      on e.deptno=d.deptno;

关联查问总结

  • 如果查问的数据是两个表的交加数据应用等值连贯或内连贯(举荐)
  • 如果查问的是一张表的全副数据和另外一张表的交加数据则应用外连贯
正文完
 0