【MariaDB 数据库】简单入门

这篇博客介绍下MariaDB的安装及其使用!

  • 有人可能会问,MariaDB和mysql有什么关系?
  • 回答:Mysql数据库是瑞典 mysql ab公司开发的,免费开源的数据库;后来被 Oracle甲骨文公司收购,然后就想把 mysql 搞成和 Oracle 数据库一样的闭源收费的,但原来搞 mysql 数据库的这一帮程序员大佬就不愿意啊,于是集体辞职,另外搞了一个数据库:MariaDB;所以MariaDB还是沿用了mysql许多的东西!
下载链接:https://pan.baidu.com/s/1-VyX3PgOvGXwwr_jyyVUYA 
提取码:1826 

安装过程:

  • 1、下载后双击运行安装
    在这里插入图片描述
  • 2.安装过程中设置密码为root, 设置默认字符集UTF-8
    在这里插入图片描述
  • 3、后续安装步骤是一直下一步直至完成。

测试MySQL是否安装成功

  • 1、从开始菜单中找到MariaDB里面的MySQL Client 运行,输入密码root后回车 提示以下信息说明连接成功!
    在这里插入图片描述
  • 2、再次执行测试的SQL 命令 select ‘HelloWorld’;
    在这里插入图片描述
  • 3、显示以上内容说明安装成功!

数据库Database

  • 学习如何对数据进行增删改查操作
  • 学习数据库主要学习的就是SQL语言,该语言是用于程序员和数据库软件进行交流的语言

1.DBMS

DataBaseManagementSystem(数据库软件)

  • 常见的DBMS:

    • MySQL:Oracle公司产品,开源产品, MariaDB, 市占率第一
    • Oracle:Oracle公司产品,闭源 价格最贵性能最强,老板拉里埃里森, 市占率第二
    • SQLServer: 微软公司产品,闭源,市占率第三
    • DB2: IBM公司产品,闭源
    • SQLite: 轻量级数据库
  • 开源和闭源

    • 开源: 开放源代码 ,产品免费 ,盈利方式:靠卖服务 ,有技术大拿无偿维护升级
    • 闭源: 不公开源代码, 产品收费, 盈利方式: 卖产品+卖服务 , 有可能有黑客攻击,但是产品公司会样一群人维护升级

2.SQL语言

  • Structured Query Language结构化查询语言
  • 执行SQL语句需要先连接数据库软件
    • window: 开始菜单-> 找到MariaDB/Mysql->MysqlClient 打开后输入密码回车
      在这里插入图片描述
  • Linux/Mac OS: 桌面空白区域右键打开终端 输入mysql -uroot -p 回车 输入密码 回车

3.SQL语句分类

  • DDL: 数据定义语言, 包括数据库和表相关的SQL

    在MySQL数据库软件中保存数据需要, 先建库再建表,最后才能操作数据

  • DML: 数据操作语言, 包括数据增删改查相关的SQL

  • DQL: 数据查询语言, 只包括查询相关SQL

  • TCL: 事务控制语言,包括和事务相关的SQL

  • DCL: 数据控制语言, 包括权限分配相关SQL

4.数据库相关SQL

  1. 查询所有数据库

    格式: show databases;

  2. 创建数据库

    格式: create database 数据库名;

    指定字符集创建格式: create database 数据库名 character set utf8/gbk;

    举例:

    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 db1;

  5. 使用数据库

    • 执行表和数据相关的SQL语句必须提前使用了某个数据库

    • 格式: use 数据库名;

      use db2;

练习题
  1. 创建mydb1和mydb2数据库 字符集第一个utf8和第二个gbk

    create database mydb1 character set utf8;

    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;

5.表相关SQL

  • 操作表相关SQL 必须使用了某个数据库否则会报错

    No database selected

  1. 创建表

    格式: create table 表名(字段1名 类型,字段2名 类型);

    指定字符集格式: create table (字段1名 类型,字段2名 类型) charset=utf8/gbk;

    举例:

    ​ create table person(name varchar(20),age int);

    ​ create table student(name varchar(20),score int)charset=utf8;

    ​ create table car(name varchar(20),money int)charset=gbk;

  2. 查询所有表

    格式: show tables;

  3. 查询表详情

    格式: show create table 表名;

    举例:

    show create table person;

    show create table student;

    show create table car;

  4. 查询表字段 description描述

    格式: desc 表名;

    举例:

    ​ desc person;

  5. 删除表

    格式: drop table 表名;

    举例:

    ​ drop table student;

  6. 修改表名

    格式: rename table 原名 to 新名

    举例:

    ​ rename table car to t_car;

练习题
  1. 创建数据库mydb3 字符集gbk并使用

    create database mydb3 character set gbk;

    use mydb3;

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

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

  3. 修改表名为hero rename table t_hero to hero;

  4. 查询表字段 desc hero;

    1. 删除表 drop table hero;
  5. 删除数据库 drop database mydb3;

6.表相关SQL续

use db2;

create table emp(name varchar(20));

  1. 添加表字段

    最后面格式: alter table 表名 add 字段名 类型;

    最前面格式: alter table 表名 add 字段名 类型 first;

    某字段后面格式: alter table 表名 add 字段名 类型 after xxx;

    举例:

    ​ alter table emp add age int;

    ​ alter table emp add id int first;

    ​ alter table emp add salary int after name;

    ​ desc emp;

    1. 删除表字段

      格式: alter table 表名 drop 字段名;

      alter table emp drop salary;

      desc emp;

    2. 修改表字段

      格式: alter table 表名 change 原名 新名 新类型;

      alter table emp change age gender varchar(1);

      desc emp;

表相关SQL回顾
  1. 创建表 create table t1(name varchar(20), age int) charset=utf8/gbk;
  2. 查询所有 show tables;
  3. 查询详情 show create table t1;
  4. 查询表字段 desc 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 原名 新名 新类型;
练习题
  1. 创建数据库mydb4 字符集utf8并使用

    create database mydb4 character set utf8;

    use mydb4;

  2. 创建teacher表 字段:名字 字符集utf8

    create table teacher(name varchar(20)) charset=utf8;

  3. 添加表字段: 最后添加age ,最前面添加id , age前面添加工资salary

    alter table teacher add age int;

    alter table teacher add id int first;

    alter table teacher add salary int after name;

  4. 删除age字段 alter table teacher drop age;

  5. 修改表名为t rename table teacher to t;

  6. 删除表 drop table t;

  7. 删除数据库 drop database mydb4;

7.DML数据操作语言(和数据相关的SQL)

create database db4 character set utf8;

use db4;

create table person(name varchar(20),age int) charset=utf8;

  1. 插入数据
  • 全表插入格式: insert into 表名 values(值1,值2);

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

  • 指定字段插入格式: insert into person(字段1名,字段2名)values(值1,值2);

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

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

insert into person values(‘aaa’,10),(‘bbb’,11),(‘ccc’,12);

  • 插入数据中文问题:

    insert into person values(“刘德华”,20);

    如果只选上面SQL语句报错 ,执行 set names gbk; 则可以解决
    在这里插入图片描述
    在这里插入图片描述

  1. 查询数据

    格式: select 字段信息 from 表名 where 条件;

    举例:

    ​ select name from person;

    ​ select * from person;

    ​ select * from person where age>15;

    ​ select age from person where name=‘刘德华’;

  2. 修改数据

    格式: update 表名 set 字段名=值,字段名=值 where 条件;

    举例:

    update person set age=88 where name=‘Tom’;

    update person set name=‘张学友’,age=50 where name=‘刘德华’;

  3. 删除数据

    格式: delete from 表名 where 条件;

    举例:

    delete from person where age=10;

    delete from person where name=‘张学友’;

    delete from person where age>15;

    delete from person where age=null;

    delete from person;

增删改查回顾:
  1. 增(插入数据) insert into 表名(字段1名,子段2名) values(值1,值2),(值1,值2),(值1,值2);
  2. 删(删除数据) delete from 表名 where 条件;
  3. 改(修改数据) update 表名 set xxx=xxx,xxx=xxx where 条件;
  4. 查(查询数据) select 字段信息 from 表名 where 条件;
综合练习题
1. 创建数据库mydb5 字符集utf8并使用
create database mydb5 character set utf8;
use mydb5;
2. 创建hero表 字段: id,name,type varchar(10)
create table hero(id int,name varchar(20),type varchar(10));
3. 插入以下数据:
	insert into hero values(1,'李白','刺客'),   (2,'诸葛亮','法师'),    (3,'刘备','战士'),    (4,'孙尚香','射手'),
	(5,'关羽','战士'),   (6,'刘禅','辅助');
4. 修改李白为诗人 
update hero set type='诗人' where name='李白';
5. 给表添加价格money字段   alter table hero add money int;
6. 修改id小于5的价格为6888    
update hero set money=6888 where id<5;
7. 修改诗人为打野  
update hero set type='打野' where type='诗人';
8. 修改刘禅为阿斗 
update hero set name='阿斗' 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 mydb5;

8.数据类型

  1. 整数: int(m)和bigint(m), bigint等效java语言中的long, m代表显示长度(用来补零 m=5 , 00018),如果需要补零需要结合zerofill关键字使用

    create table t1(name varchar(20),age int(10) zerofill);

    insert into t1 values(‘aaa’,18);

    select * from t1;

  2. 浮点数: double(m,d) m代表总长度, d代表小数长度 m=5 d=3 23.456

    decimal(m,d) 超高精度浮点数, 只有涉及到超高精度运算时使用

  3. 字符串

    • char(m),m代表字符长度, 固定长度, m=10存"abc" 占10个字符长度的空间, 好处:执行效率略高, 最大长度255
    • varchar(m): 可变长度,m=10存"abc" 占3个长度看空间,好处:节省空间,最大长度65535 但是建议保存255以内的 超过255建议使用text
    • text(m):可变长度 最大长度65535,建议保存长度大于255的内容
  4. 日期

    • date:保存年月日
    • time:保存时分秒
    • datetime:保存年月日时分秒, 默认值为null, 最大值为9999-12-31
    • timestamp(时间戳:距离1970年1月1日的毫秒数):保存年月日时分秒,默认值为当前系统时间,最大值2038-1-19

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

    insert into t_date values(“2021-1-4”,null,null,null);

    insert into t_date values(null,‘20:27:33’,‘2020-10-10 11:20:30’,null);

    select * from t_date;

9.主键约束 primary key

  • 什么是约束: 约束就是创建表时给表字段添加的限制条件

  • 什么是主键: 表示数据唯一性的字段称为主键

  • 主键约束: 限制主键字段的值 唯一且非空.

  • 举例:

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

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

    insert into t2 values(1,‘bbb’); //报错 主键值重复

    insert into t2 values(null,‘ccc’); //报错 主键值不能为null

主键约束+自增 auto_increment

自增规律:从历史最大值+1

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

insert into t3 values(null,‘aaa’); 1 //自增情况下 null代表触发自增

insert into t3 values(null,‘bbb’); 2

insert into t3 values(3,‘ccc’); 3

insert into t3 values(10,‘ccc’); 10

insert into t3 values(null,‘ddd’); 11

delete from t3 where id>=10;

insert into t3 values(null,‘eee’); 12

10导入*.sql批处理文件

链接:https://pan.baidu.com/s/1PLt4fZvVgkmnKNqUVC3ScA 
提取码:1826 
  1. 把sql文件保存在某个盘的根目录 ,如果是其它系统保存在桌面

  2. 在终端中执行以下代码 提示Query OK! 成功!

    source e:/emp.sql;

  3. 查询emp表数据如果出现乱码 执行 set names gbk; 再次查询

    select * from emp;

  • 导入的两个表:员工表 emp、部门表 dept 下面会经常使用

11.is null和 is not null

如果查询的是某个字段值为null的 使用 is null 查询不是null 的 写 is not null;

  1. 查询没有上级领导的员工信息

    select * from emp where mgr is null;

  2. 查询有上级领导的员工姓名 和领导编号

    select ename,mgr from emp where mgr is not null;

去重distinct
  1. 查询员工表中出现了哪几种工作

    select distinct job from emp;

  2. 查询员工表中出现的部门编号 去掉重复

    select distinct deptno from emp;

比较运算符 > < >= <= = !=和<>
  1. 查询工资小于等于3000 的员工姓名和工资

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

  2. 查询1号部门的员工姓名和工作

    select ename,job from emp where deptno=1;

  3. 查询不是程序员的员工姓名 工资和工作(两种写法)

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

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

  4. 查询有奖金的员工姓名和奖金

    select ename,comm from emp where comm>0;

and和or
  • and 类似java中的&& ,多个条件同时满足时使用and
  • or 类似价格中的|| , 多个条件满足一个时使用or
  1. 查询1号部门工资高于2000的员工信息

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

  2. 查询是程序员或者工资等于5000的员工信息

    select * from emp where job=‘程序员’ or sal=5000;

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. 查询工作是销售,人事和程序员的员工信息

    select * from emp where job in(“销售”,“人事”,“程序员”);

  3. 查询1号和2号部门中工资大于2000的员工信息

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

between x and y 两者之间 包含x和y
  1. 查询工资在2000至3000之间的员工信息

    select * from emp where sal between 2000 and 3000;

综合练习题
  1. 查询3号部门中有上级领导的员工信息

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

  2. 查询2号部门工资在2000-3000之间的员工姓名,工资和部门编号

    select ename,sal,deptno from emp

    where deptno=2 and sal between 2000 and 3000;

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

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

  4. 查询1号部门中出现了哪几种不同的工作

    select distinct job from emp where deptno=1;

12.模糊查询like

  • _ : 代表1个未知字符

  • %:代表0或多个未知字符

  • 举例:

    • 以x开头 x%
    • 以x结尾 %x
    • 包含x %x%
    • 以x开头y结尾 x%y
    • 第二个字符是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. 查询名字中包含僧的员工并且工资高于2000的员工信息

      select * from emp where ename like ‘%僧%’ and sal>2000;

排序 order by
  • 格式: order by 字段名 asc(默认)/desc
  1. 查询每个员工的姓名和工资按照工资升序排序

    select ename,sal from emp order by sal; 升序 默认

    select ename,sal from emp order by sal asc; 升序

    select ename,sal from emp order by sal desc; 降序

  2. 查询3号部门的员工信息 按照工资降序排序排序

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

  3. 查询每个员工的姓名,工资和部门编号 按照部门编号升序,如果部门编号一样的情况下 按照工资降序排序

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

分页查询 limit
  • 格式: limit 跳过的条数(跳过的条数=(请求页数-1)*请求条数), 请求的条数
  • 请求第5页的10条数据 limit (5-1)*10,10
  • 请求第3页的5条数据 limit (3-1)*5 ,5
  • 请求第8页的8条数据 limit (8-1)*8,8
  1. 查询员工表中工资升序排序第一页的5条数据

    select * from emp order by sal limit 0,5;

  2. 查询员工表中工资降序第二页的3条数据

    select * from emp order by sal desc limit 3,3;

  3. 查询工资高于1000的员工信息, 工资升序 查询前三条数据

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

数值计算+ - * / %
  • 对查询数据中某一个字段的值进行运算
  1. 查询每个员工的姓名,工资和年终奖 (年终奖=工资*5)

    select ename,sal,sal*5 from emp;

  2. 给1号部门的员工每人涨薪5块钱 (修改)

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

别名

select ename from emp;

select ename as ‘姓名’ from emp;

select ename ‘姓名’ from emp;

select ename 姓名 from emp;

综合练习题
1. 查询有领导并且工资在10003000之间的员工信息
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;

13.聚合函数

使用聚合函数可以对查询的多条数据进行统计查询

统计方式:

  • 平均值avg(字段名)

    • 查询员工表的平均工资

      select avg(sal) from emp;

    • 查询1号部门的平均工资

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

  • 最大值max(字段名)

    • 查询2号部门中的最高工资

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

  • 最小值min(字段名)

    • 查询1号部门的最低工资

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

  • 求和sum(字段名)

    • 查询3号部门的工资总和

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

  • 计数count(*) 如果计数字段中有null值 则会不被统计在内

    • 查询员工表中的人数

      select count(*) from emp;

  • 查询1号部门的平均工资,最高工资,最低工资,工资总和,人数 并且起别名

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

综合练习题
1. 查询员工表中工资高于2000的员工姓名和工资,按照工资升序排序,查询第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. 查询1号部门工资高于2000的员工人数

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

4. 查询3号部门的人数和工资总和并起别名

   select count(*) 人数,sum(sal) 工资总和 from emp where deptno=3;

5. 查询1号部门中名字包含僧的员工的人数和平均工资 起别名

   select count(*) 人数,avg(sal) 平均工资 from emp where deptno=1 and ename like '%僧%';

14.分组查询group by

  • 格式 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;

  5. 查询最高人数的工作名称及人数

select job,count(*) from emp 
group by job order by count(*) desc limit 0,1;
select job,count(*) c from emp 
group by job order by c desc limit 0,1;

6.查询平均工资最高的部门编号和平均工资

select deptno,avg(sal) a from emp 
group by deptno order by a desc limit 0,1;
综合练习题
  1. 查询员工表中名字中包含骨字的员工信息

    select * from emp where ename like ‘%骨%’;

  2. 查询1号部门工资收入排名前三的员工信息

    select * from emp where deptno=1 order by sal desc limit 0,3;

  3. 查询2号和3号部门有几种不同的工作

    select distinct job from emp where deptno in(2,3);

  4. 查询3号部门的最高工资

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

  5. 查询每个部门的最低工资

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

  6. 查询平均工资最高的部门编号和平均工资

    select deptno,avg(sal) a from emp

    group by deptno order by a desc limit 0,1 ;

15.having关键字

  • where后面只能写普通字段的条件,不能写 聚合函数条件,having的作用就是专门用来写聚合函数条件的关键字
  • having需要结合分组查询一起使用,不要单独使用.
  1. 查询每个部门的平均工资,只查询出平均工资高于2000的信息

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

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

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

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

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

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

    select deptno,avg(sal) a from emp where sal between 1000 and 3000 group by deptno having a>=2000;

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

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

  4. 查询平均工资最高的部门编号,只查询有领导的员工

    select deptno from emp

    where mgr is not null group by deptno

    order by avg(sal) desc limit 0,1;

16.子查询(嵌套查询)

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

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

  • 将一条SQL语句的查询结果作为另外一条SQL语句条件的值

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

  1. 查询工资最高的员工信息

    select max(sal) from emp;

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

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

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

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

  3. 查询和孙悟空相同工作的其它员工信息

    select job from emp where ename=‘孙悟空’;

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

  4. 查询拿最低工资员工的同事们的信息(同事指相同部门)

    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);

  5. 查询白骨精的部门信息(需要用到部门表dept)

    select deptno from emp where ename=‘白骨精’;

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

  6. 查询人数最多的部门信息

    select deptno from emp group by deptno order by count(*) desc limit 0,1;

    select * from dept where deptno=(select deptno from emp group by deptno order by count(*) desc limit 0,1);

  7. 有的工作只有一个人, 那么查询有哪些人从事了这种只有一个人的工作

    select job from emp group by job having count(*)=1;

    select * from emp where job in (select job from emp group by job having count(*)=1);

​ select * from emp group by job having count(*)=1;

16.关联关系

  • 创建表时,表和表之间存在的业务关系
  • 有哪几种关系:
    • 一对一: 有AB两张表,A表中的一条数据对应B表的一条数据,同时B表的一条数据也对应A表的一条数据
    • 一对多:有AB两张表,A表中的一条数据对应B表的多条数据,同时B表的一条数据对应A表的一条数据
    • 多对多:有AB两张表,A表中的一条数据对应B表的多条数据,同时B表的一条数据也对应A表的多条数据
关联查询
  • 同时查询多张表数据的查询方式称为关联查询.
  • 有几种关联查询的方式:
    • 等值连接
    • 内连接
    • 外连接
关联查询之等值连接
  • 格式: 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;

关联查询之内连接
  • 等值连接和内连接查询到的数据一样,都是两个表的交集数据
  • 格式: 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号部门工资高于2000块钱的员工姓名和对应的部门名,部门地址

    select ename,dname,loc,sal

    from emp e join dept d

    on e.deptno=d.deptno

    where e.deptno=1 and sal>2000;

关联查询之外连接
  • 外连接查询到的是一个表的全部和另外一张表的交集数据
  • 格式: 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 ename,dname

    from emp e right join dept d

    on e.deptno = d.deptno;

  • 关联查询总结:

    如果需要同时查询多张表的数据,则使用关联查询,

    查询的是两个表的交集数据使用等值连接或内连接(推荐)

    查询的是一张表的全部和另外一张表的交集则使用外连接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值