MySQL数据库实战教程

本文介绍了MySQL数据库的基础知识,包括安装、卸载、创建和管理数据库,以及SQL语言的基本操作,如数据的增删改查。详细讲解了如何创建表、设置数据类型和约束,以及如何进行复杂的查询操作,如使用where子句、聚合函数和分组。此外,还涉及到了数据备份与恢复、权限管理以及数据库设计的一对多关系。通过对MySQL和SQL的学习,读者可以掌握数据库的基本操作和管理技巧。
摘要由CSDN通过智能技术生成

1. 数据库的简介

在这里插入图片描述

1.1. 什么是数据库?

  数据仓库。访问必须只能用SQL语句来访问。数据库也是一个文件的系统。

1.2. 数据库的作用?

  存储数据的作用。开发任何的应用,都有数据库。

1.3. 关系型的数据库

  数据库中保存的都是实体与实体之间的关系。

1.4. 常见的数据库

  Java开发,必用的两个数据库Oracle和MySQL

  • Oracle数据库(甲骨文) 大型的数据库,收费的。
  • MySQL数据库 小型的数据库,免费开源的。被Oracle收购了(在6.x版本下开始收费了)
  • SQLServer 微软的数据库
  • DB2 IBM公司产品,大型的数据库,收费的。
  • SyBASE 退出了历史的舞台。PowerDigener(数据库的设计的工具)

2. MySQL数据库的安装和卸载

2.1. MySQL数据库的卸载

  • 先找到MySQL的安装路径,找到my.ini配置文件。
  • basedir="C:/Program Files (x86)/MySQL/MySQL Server 5.5/"
    • MySQL安装路径(my.ini没有删除)
  • datadir="C:/ProgramData/MySQL/MySQL Server 5.5/Data/"
    • MySQL数据存放位置(手动删除)
  • 直接通过控制面板卸载程序。

2.2. 安装MySQL

  • 安装的路径中不能有中文和空格。

2.3. 进行测试

  • cmd ‐‐ 输入mysql ‐u root ‐p ‐‐ 回车 ‐‐ 输入密码 ‐‐ 进入MySQL的服务器。

3. MySQL数据库概念

总结:
  一个数据库的服务器中包含多个数据库,一个数据库中有多张表,一个表中包含多个字段(字段和JavaBean的属性是对应),表中存放是数据,一行数据和一个JavaBean实体对象是对应的。

4. SQL语言(操作数据库)

  • Structured Query Language, 结构化查询语言
  • SQL非过程性的语言
    • 过程性的语言:依赖上一条或者上几条语句执行。
    • 非过程性的语言:一条语言,就对应一个返回的结果。
  • SQL语言是基础
    • 在Oracle使用自己的语言,PL/SQL只能在Oracle来说使用。

5. SQL的分类

  • DDL: 数据定义语言
    • 创建数据库 创建表 创建视图 创建索引 修改数据库 删除数据库 修改表 删除表
    • create ‐‐ 创建 alter ‐‐ 修改 drop ‐‐ 删除
  • DML: 数据操作语言
    • 操作数据 插入数据(insert) 修改数据(update) 删除数据(delete)
  • DCL: 数据控制语言
    • if else while
  • DQL: 数据查询语言
    • 从表中查询数据(select)

6. 数据库的操作

6.1. 创建数据库(重点)

  • 创建数据库的语法
    • 基本的语法:create database 数据库名称;
    • 正宗的语法:create database 数据库名称 character set 编码 collate 校对规则;
  • 校对规则(了解):决定当前数据库的属性。
  • 创建一个名称为mydb1的数据库。create database mydb1;
  • 创建一个使用utf8字符集的mydb2数据库。create database mydb2 character set 'utf8';
  • 创建一个使用utf8字符集,并带校对规则的mydb3数据库。create database mydb3 character set 'utf8' collate 'utf8_bin';

6.2. 查看数据库(重点)

  • show databases; ‐‐ 查看所有的数据库
  • use 数据库名称;(*****) ‐‐ 使用数据库
  • show create database 数据库名称; ‐‐ 查询数据库的创建的信息
  • select database(); ‐‐ 查询当前正在使用的数据库

6.3. 删除数据库(重点)

  • 删除数据库
    • drop database 数据库名称;
  • 查看当前数据库服务器中的所有数据库
    • show databases;
  • 查看前面创建的mydb2数据库的定义信息
    • show create database mydb2;
  • 删除前面创建的mydb1数据库
    • drop database mydb1;

6.4. 修改数据库

  • 语法:
    • alter database 数据库名称 character set 'gbk' collate '校对规则';

7. 表结构操作

7.1. 创建表

  • 语法:
create table 表名称(
	字段1 类型(长度) 约束,
	字段2 类型(长度) 约束,
	字段3 类型(长度) 约束
);
  • 注意:
    • 创建表的时候,后面用小括号,后面分号。
    • 编写字段,字段与字段之间使用逗号,最后一个子段不能使用逗号。
    • 如果声明字符串数据的类型,长度是必须指定的。
    • 如果不指定数据的长度,有默认值的。int类型的默认长度是11
  • 员工表练习:
  1. 创建一张表结构:
create table employee(
id int,
name varchar(30),
gender char(5),
birthday date,
entry_date date,
job varchar(50),
salary double,
resume text
);
  1. 执行SQL语句:
    • 查询当前正在使用的数据库 select database();
    • 选择你要使用的数据库 use mydb2;
    • 执行创建表的SQL语句。
  2. 使用desc employee;查询表的信息在这里插入图片描述

8. 数据库的数据类型(重点)

  • 字符串型(重点)
    • VARCHAR(用的比较多):长度是可变的。
      • 例子:name varchar(8) ,存入数据hello,存入进去之后,name字段长度自动变成了5。
    • CHAR :长度是不可变的。 例子:name char(8) 存入数据hello,用空格来补全剩余的位置。
  • 大数据类型(不常用)
    • BLOB :字节(电影 mp3)
    • TEXT :字符(文本的内容)
  • 数值型(重点)
    • TINYINT 、SMALLINT、INT、BIGINT、FLOAT、DOUBLE
  • 逻辑型
    • BIT
    • 在Java中是true或者false
    • 在数据库bit类型(1或者0)
  • 日期型(重点)
    • DATE :只包含日期(年月日)
    • TIME :只包含时间(时分秒)
    • DATETIME :包含日期和时间。如果插入数据的时候,字符值为空,字段的值就是空了。
    • TIMESTAMP :包含日期和时间。如果插入数据的时候,设置字段的值为空,默认获取当前的系统的时候,
      把时间保存到字段中。

9. 表的操作

9.1. 单表的约束(了解)

  • 约束的好处:保证数据的完整性。
  • 主键约束(重要)代表记录的唯一标识。
    • 关键字:primary key 通过该关键字声明某一列为主键。
    • 唯一 值就不能相同
    • 非空 值也不能为空
    • 被引用 (和外键一起来使用)
  • 唯一约束
    • 声明字段值是唯一的。使用关键字 unique
  • 非空约束
    • 声明字段的值是不能空的。not null

9.2. 删除和查看表

  • 删除表语法:drop table 表名;
  • 查看标签
    • desc 表名; ‐‐ 查询表的信息
    • show tables; ‐‐ 查看当前数据库中所有的标签
    • show create table 表名; ‐‐ 查看表的创建的信息

9.3. 修改表

  • 语法:
    • alter table 表名 add 新列名 类型(长度) 约束; ‐‐ 添加列
    • alter table 表名 drop 列名; ‐‐ 删除列
    • alter table 表名 modify 列名 类型(长度) 约束; ‐‐ 修改列的类型或者约束
    • alter table 表名 change 旧列名 新列名 类型(长度) 约束; ‐‐ 修改列名
    • rename table 表名 to 新表名; ‐‐ 修改表的名称
    • alter table 表名 character set utf8; ‐‐ 修改表的字符集
  • 示例:
    • 在上面员工表的基本上增加一个image列。
      • alter table employee add image varchar(50);
    • 修改job列,使其长度为60。
      • alter table employee modify job varchar(60);
    • 删除gender列。
      • alter table employee drop gender;
    • 表名改为user。
      • rename table employee to user;
    • 修改表的字符集为utf8
      • alter table user character set utf8;
    • 列名name修改为username
      • alter table user change name username varchar(30);

10. 数据的操作(重点)

10.1. 插入数据(insert)

  • 插入数据的语法:
    • insert into 表名 (字段1,字段2,字段3) values (值1,值2,值3);
    • insert into 表名 values (值1,值2,值3);
  • 注意事项
    • 插入的数据与字段类型必须是相同的。
    • 数据的大小范围在字段范围内
    • 值与字段一一对应
    • 字符串或者日期类型数据需要使用单引号
insert into user values (1,'meimei','1956‐1‐1','1957‐1‐1','HR',5000,'meimeimei','xx');
insert into user values (2,'小凤','1996‐1‐1','2013‐1‐1','BOSS',15000,'mei','xx');
insert into user values (3,'聪聪','1993‐11‐11','2015‐09‐10','WORKER',500.0,'chou','yy');
insert into user values (4,'如花','1994‐1‐1','2013‐1‐1','BOSS',25000,'mei','xx');
insert into user values (5,'小苍','1991‐1‐1','2014‐1‐1','BOSS',15000,'mei','xx');
insert into user values (6,'小泽','1986‐1‐1','2013‐1‐1','BOSS',15000,'mei','xx');

在这里插入图片描述

  • character_set_client=utf8 ‐‐ 客户端向MySQL服务器端发送内容
  • character_set_results=utf8 ‐‐ MySQL服务器端向客户端发送内容

10.2. MySQL插入中文数据乱码

在这里插入图片描述

  1. 先把MySQL服务停止。
  2. 找到MySQL安装文件的my.ini的配置文件
[client]
port=3306
[mysql]
defaultcharacterset=gbk
  1. 重启MySQL服务

10.3. 修改数据(update)

  • 语法:update 表名 set 字段1=值,字段2=值 where 条件; where username = 'meimei';
    • 如果没有where条件语句,默认更新所有的数据。
    • 如果有where条件,默认更新符合条件的记录。
  • 将所有员工薪水修改为5000元。
    • update user set salary = 5000;
  • 将姓名为’聪聪’的员工薪水修改为3000元。
    • update user set salary = 3000 where username = '聪聪';
  • 将姓名为’小凤’的员工薪水修改为4000元,job改为ccc。
    • update user set salary = 4000,job = 'ccc' where username = '小凤';
  • 将如花的薪水在原有基础上增加1000元。
    • update user set salary = salary+1000 where username = '如花';

10.4. 删除数据(delete)

  • 语法:
    • delete from 表名 where 条件;
      • 如果没有where条件,默认删除所有的数据。
    • truncate 表名;
      • 删除表中所有的数据。
    • delete from 表名;
      • 也可以删除所有数据。
  • 区别:
    • truncate先把你整个表删除掉,默默创建一个空的表(和原来的表结构是一样的)。
    • delete from 表名 一行一行的删除。(使用它)
    • 事物的概念:事物提交和事物回滚。
  • 示例:
    • 删除表中名称为’聪聪’的记录。
      • delete from user where username = '聪聪';
    • 删除表中所有记录。
      • delete from user;
    • 使用truncate删除表中记录。

10.5. 查询数据(select)(重点)

10.5.1. 基本的select语句

  • 语法:
    • 查询所有列的记录:
      • select * from 表名;
    • 查询字段123的记录:
      • select 字段1,字段2,字段3 from 表名;
    • 去除重复的数据(面试):
      • DISTINCT
      • eg: select distinct english from stu;
  • 练习:
create database day15;
use day15;
create table stu(
id int,
name varchar(30),
math int,
english int,
chinese int
);
insert into stu values (1,'美美',78,93,56);
insert into stu values (2,'聪聪',18,13,16);
insert into stu values (3,'小凤',98,96,89);
insert into stu values (4,'如花',90,100,46);
insert into stu values (5,'欧阳锋',74,93,56);
insert into stu values (6,'吴彦祖',37,11,89);
insert into stu values (7,'聪大',88,77,66);
insert into stu values (8,'聪二',55,44,33);

10.5.2. 查询语句中使用运算和别名

  • 在所有学生分数上加10分特长分。
    • select name,(math+10) m,(english+10) e,(chinese+10) c from stu;
  • 统计每个学生的总分。
    • select name,(math+english+chinese) 总分 from stu;
  • 使用别名表示学生分数
    • select name,(math+english+chinese) 总分 from stu;

10.5.3. 使用where条件过滤

  • 查询姓名为聪聪的学生成绩
    • select name,math,chinese from stu where name = '聪聪';
  • 查询英语成绩大于90分的同学
    • select name,english from stu where english > 20;
  • 查询总分大于200分的所有同学
    • select name,math+english+chinese from stu where (math+english+chinese) > 200;

10.5.4. where子句中出现的运算

  • <、>、<=、>=、=、<>: 小于、大于、大于(小于)等于、不等于。
  • in 表示范围。
    • select * from stu where math = 18; 查询出一条数据
    • select * from stu where math in (78,18,99);
  • like 模糊查询 ‐‐ 符合模糊的条件
    • select * from stu where name like '张_'; 姓张的名称(只有两个)的记录
    • select * from stu where name like '张%'; 姓张的名称(张飞 张翼德 张是是是冠希)的记录。
    • select * from stu where name like '%张'; 末尾是张(聪聪张 XSDF张)
    • select * from stu where name like '%张%'; 只要名称中包含张。
  • is null 判断某一个字段记录是否为空
  • and与、or或者、not非。
  • 查询英语分数在 80-90之间的同学。
    • select * from stu where english >= 10 and english < 19;
  • 查询数学分数为89,90,91的同学。
    • select * from stu where math in (89,90,91);
  • 查询所有姓小的学生成绩。
    • select * from stu where name like '小%';
  • 查询数学分>80,语文分>80的同学。
    • select * from stu where math > 80 or chinese > 80;
  • 总结select 列名(运算) from 表名(别名) where 条件(运算的符号);

10.5.5. order by 对查询的结果进行排序

  • 排序的语法
    • select * from 表名 where 条件 order by 列名 升序/降序;
  • 升序和降序
    • order by 列名 asc;(升序,默认值)
    • order by 列名 desc;(降序)
  • order by 子句必须出现在select语句的末尾。
  • 对数学成绩排序后输出。
    • select name,math from stu order by math desc;
  • 对总分排序按从高到低的顺序输出
    • select name,(math+english+chinese) as total from stu order by total desc;
  • 对学生成绩按照英语进行降序排序,英语相同学员按照数学降序
    • select name,english,math from stu order by english desc,math desc;
  • 对姓聪的学生成绩排序输出
    • select name,(math+english+chinese) as total from stu where name like '聪%' order by total desc;

11. 聚集函数

  • 聚集函数:总计某一列数据总和。一列的个数。一列的平均数。一列中最大值和最小值。
  • 聚集函数来操作列的。
  • 聚集函数
    • count ‐‐ 计数
    • sum ‐‐ 求和
      • ifnull 判断是否为空
      • 语法:ifnul(xxx,0) 如果xxx为null,替换成0
    • avg ‐‐ 平均值
      • 语法:select avg(列名) from 表名;
    • max
      • 最大值
    • min
      • 最小值
  • 练习:
    • 统计一个班级共有多少学生?
      • select count(name) from stu;
    • 统计数学成绩大于90的学生有多少个?
      • select count(math) from stu where math >= 90;
    • 统计总分大于220的人数有多少?
      • select count(*) from stu where math + english+chinese > 200;
    • 统计一个班级数学总成绩?
      • select sum(math) from stu;
    • 统计一个班级语文、英语、数学各科的总成绩
      • select sum(math),sum(english),sum(chinese) from stu;
    • 统计一个班级语文、英语、数学的成绩总和
      • select sum(ifnull(math,0)+english+chinese) from stu;
      • select sum(math) + sum(english) + sum(chinese) from stu;
    • 编写一条更新语句:
      • update stu set math = null where id = 2;
    • 统计一个班级数学成绩平均分
      • select avg(ifnull(math,0)) from stu;
    • 求一个班级总分平均分
      • select avg(ifnull(math,0)+english+chinese) from stu;
    • 求班级英语最高分和最低分
      • select max(english) from stu;
      • select min(english) from stu;

12. 分组(重要)

  • 使用group by字段进行分组。
create database day16;
use day16;
create table orders(
id int,
product varchar(20),
price float
);
insert into orders(id,product,price) values(1,'电视',900);
insert into orders(id,product,price) values(2,'洗衣机',100);
insert into orders(id,product,price) values(3,'洗衣粉',90);
insert into orders(id,product,price) values(4,'电视',900);
insert into orders(id,product,price) values(5,'洗衣粉',90);
insert into orders(id,product,price) values(6,'洗衣粉',90);

在这里插入图片描述

  • 练习:
  • 对订单表中商品归类后,显示每一类商品的总价
    • select product,sum(price),count(*) from orders group by product;
    • 默认是一组
  • 查询购买了几类商品,并且每类总价大于100的商品
    • select product from orders group by product having sum(price) > 100;
  • 总结
    • Having和where均可实现过滤,但在having可以使用聚集函数,where不能使用聚集函数,having通常跟在group by后,它作用于分组。
    • select … from … where … group by … having … order by …固定的顺序:如果没有上述的条件,把关键字去掉就ok。

13. 修改密码

  • 停止mysql服务:
    • services.msc 进入到服务界面
  • 在cmd>输入一个命令:
    • mysqld ‐‐skip‐grant‐tables (开启一个mysql服务,不需要进行认证.)
  • 新打开一个cmd窗口
    • mysql ‐u root ‐p 不需要输入密码.就可以进入.
  • 输入命令 show databases;查看数据库,输入命令 use mysql;使用mysql数据库。
  • 修改密码的语句:
    • update user set password=password('root') WHERE user='root';
  • 将两个窗口都关闭.
  • 任务管理器中结束(mysqld)进程.
  • 重启mysql服务

14. 数据库的备份和恢复

  • MySQL数据库备份和恢复
    • 备份数据库表中的数据
    • 命令:mysqldump ‐u 用户名 ‐p 数据库名 > 文件名.sql 回车后 再输入密码
  • 恢复数据库(前提创建空的数据库,并且use)
    • 命令:mysql –u 用户名 p 数据库名 < 文件名.sql 回车后 再输入密码
  • 注意1:不是在数据库的登陆状态下
  • 注意2:该命令后没有分号结束
  • 注意3:注意 > 符号的方向
  • 注意4:恢复数据库使用的命令是mysql,而不是mysqldump

15. 单表的约束

  • 代表记录的唯一的标识。
  • 声明某一列作为主键
    • 使用关键字 primary key
  • 主键值的特点
    • 唯一
    • 非空
    • 被引用
  • 创建一张表,声明主键列
    • 第一种:
create table person(
id int primary key,
name varchar(30)
);
insert into person values (1,'聪聪');
insert into person values (2,'美美');
insert into person values (3,'小凤');
  • 第二种:
create table person(
id int,
name varchar(30),
primary key (id)
);
  • 自增长
    • 可以去帮你维护主键的信息
    • 关键字:auto_increment
create table person(
id int primary key auto_increment,
name varchar(30)
);
insert into person values (null,'聪聪');
insert into person values (null,'美美');
insert into person values (null,'小凤');

delete from person where id = 1;

16. 唯一和非空

  • 唯一 :声明值是唯一的 使用关键字 unique
  • 非空 :声明值是不为空的 not null

17. 多表外键的约束

create table dept(
did int primary key auto_increment,
dname varchar(30)
);
create table emp(
eid int primary key auto_increment,
ename varchar(30),
sal double,
dno int
);
insert into dept values (1,'研发部');
insert into dept values (2,'人事部');

insert into emp values (null,'聪聪',15000,1);
insert into emp values (null,'邦邦',5000,1);
insert into emp values (null,'美美',6000,2);

insert into emp values (null,'小凤',8000,2);
insert into emp values (null,'如花',8000,null);
  • 问题:

    • 直接把研发部删除掉。delete from dept where did = 1; 能删除成功。
    • 在现实生活中,不合理。如果你避免问题的发生,两个表之间设置关系。
  • 引入外键的约束

  • 添加外键

    • 正常的情况下(一个部门有多个员工,一个员工只能属于一个部门)
    • 设置员工标签的dno字段,作为外键,指向部门表的主键。
    • 修改员工的表,在员工添加外键。
      • alter table emp add foreign key emp (dno) references dept (did);
  • 直接添加外键

    • 在创建表的时候,指定外键
create table emp(
eid int primary key auto_increment,
ename varchar(30),
sal double,
dno int,
foreign key emp(dno) references dept (did)
);
  • 直接删除部门,这回不行了。
    • delete from dept where did = 1;

18. 表的设计(一对多 多对多 一对一)

在这里插入图片描述

18.1. 一对多(重要)

  • 看图
  • 例子:部门和员工的例子。
  • 建表原则:分清除一方和多方。在多方的表中添加一个字段,作为该表的外键,指向一方表的主键。

18.2. 多对多(重要)

  • 看图
  • 学生选课。
  • 如果是多对多的关系,创建中间表。把表的关系拆成两个一对多。在中间表至少包含两个字段,作为该表的外键指向
    一方表的主键。

18.3. 一对一(了解)

  • 看图

18.4. 简单购物网站

  1. 用户、订单、商品、分类
  2. 实体的表中包含属性(省略)
  3. 实体与实体之间的关系?创建表的时候需要指定之间的关系。(一个用户可以产生多个订单,一个订单中包含多个商
    品,一个分类下有多个商品)
  4. 创建表结构

19. 多表的查询(重要)

  了解笛卡尔积(两个结果的乘积)
表A:

aidaname
a1a11
a2a22

表B:

bidbnameaid
b1b11a1
b2b22a2
b3b33a3

  select * from A,B; 查询的结果产生的结果就是笛卡尔积
结果:

a1a11b1b11
a1a11b2b22
a1a11b3b33
a2a22b1b11
a2a22b2b22
a2a22b3b33

  使用部门和员工两个表演示笛卡尔积: select * from dept,emp;

19.1. 多表查询之内链接

  • 前提条件:两个表有联系,通过外键关联。
  • 普通内链接
    • 语法:关键字 ... inner join ... on 条件;
    • 注意:
      • inner join关键字之前写表1
      • inner join关键字之后写表2
      • on的后面写条件:(表1是dept,表2是emp) dept.did = emp.dno
    • 语句: select * from dept inner join emp on dept.did = emp.dno;
  • 隐式内链接(用的最多的)
    • 语法:select ... from 表1,表2 where 表1.字段 = 表2.字段;
    • 语句:select * from dept,emp where dept.did = emp.dno;
    • 别名:select * from dept d,emp e where d.did = e.dno;
    • 指定字段: select d.dname,e.ename,e.sal from dept d,emp e where d.did = e.dno;

19.2. 多表查询之外链接

  • 左外链接(左链接)
    • 语法:… 表1 left outer join 表2 on 表1.字段 = 表2.字段
    • 语句: select * from dept left outer join emp on dept.did = emp.dno;
    • 特点:看左表,默认把左表中的全部数据都查询出来,再查询出有关联的数据。
  • 右外链接
    • 语法:… 表1 right outer join 表2 on 表1.字段 = 表2.字段
    • 语句: select * from dept right outer join emp on dept.did = emp.dno;
    • 特点:看右表,默认把右表中的全部数据都查询出来,再查询出有关联的数据。

向dept和emp表中插入一些数据:

insert into dept values (null,'牛宝宝部');
insert into dept values (null,'扯淡部');
insert into emp values (null,'陈冠希',100,null);
insert into emp values (null,'张柏芝',200,null);

测试:

  • 内链接测试:select * from dept d,emp e where d.did = e.dno;
  • 左链接测试:select * from dept left join emp on dept.did = emp.dno;
  • 右链接测试:select * from dept right join emp on dept.did = emp.dno;

19.3. 多表查询的总结

  • 内连接与外连接的区别:在这里插入图片描述
  • 如果两张表中的数据没有多余的数据,下面这些个查询的结果都是一样的。
  • 普通内链接查询
    • inner join … on 条件;
  • 隐式内链接查询
    • select * from A,B where 条件;
  • 左外链接查询
    • left outer join … on
  • 右外链接查询
    • right outer join … on
  • 如果两个表中有多余的数据,使用左链接,查询出的结果先把左表所有的数据全部都查询出来,再把两个表中有关联的数据查询出。
  • 如果两个表中有多余的数据,使用右链接,查询出的结果先把右表所有的数据全部都查询出来,再把两个表中有关联的数据查询出。

20. 子查询

  • 你可能一个查询语句不能查出你想要的结果,你可以把多个查询结合到一起使用。
  • 你编写的一个语句中包含多个select关键字。
  • 问题:查询出英语的成绩大于英语的平均分的同学?
    • 查询英语的平均分 select avg(english) from stu;
    • 查询的学生的信息,条件,英语的成绩需要大于平均分。
      • select * from stu where english > (select avg(english) from stu);
  • 子查询的特点
    • select * from 表 where 条件 > 子查询
    • select * from (子查询会先产出结果)
    • select * from (select english from stu);
  • 在where条件的后面使用运算符号
    • < > <= >= <>
    • all所有 > all 即:* > all(5,6,7)
    • any任意 > any 即:* > any(5,6,7)
  • dept emp

示例:

  • 查看聪聪所属的部门名称和员工名称?
    • 查询什么?部门的名称 员工的名称
    • 表:部门表和员工表
    • 条件:聪聪所属的部门(去除笛卡尔积),只想查聪聪 name=‘聪聪’
    • select d.dname,e.ename from dept d,emp e where d.did = e.dno and e.ename = '聪聪';
  • 统计每个部门的人数(按照部门名称统计)
    • 查询:部门的名称和人数
    • 表:部门和员工(人数)
    • 条件:
    • where d.did = e.dno 分组(部门分组) select d.dname,count(*) from dept d,emp e where d.did = e.dno group by d.dname;
  • 统计部门的平均工资(按部门名称统计)
    • 查询:平均工资
    • 表:部门 员工属性是工资
    • 条件:
    • where d.did = e.dno 分组(部门分组) select d.dname,avg(e.sal) from dept d,emp e where d.did = e.dno group by d.dname;
  • 统计部门的平均工资大于公司平均工资的部门
    • 查询:部门
    • 表:部门和员工
    • 条件:部门的平均工资 > 公司的平均工资
    • select d.dname,avg(e.sal) from dept d,emp e where d.did = e.dno group by d.dname having avg(e.sal) > (select avg(sal) from emp);
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值