41.MySql

Posted 重庆刘亦菲

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了41.MySql相关的知识,希望对你有一定的参考价值。

mysql安装
目录:英文,软件和数据文件放在一起
端口号:3306
用户名:root 密码:root
服务名称:MySql
启动服务:
1.管理——服务与应用程序
2.cmd窗口 net start mysql
     Net stop mysql
mysql的登录:
  在cmd窗口中
    1.mysql -uroot -p密码
    2.Mysql -uroot -p
  输入密码:
密码的重置:
前提 :保证mysql服务关闭
步骤:
  1.在cmd窗口中输入 mysqld --console --skip-grant-tables
  2.再次打开一个cmd窗口,输入mysql -uroot
  3.切换数据库 use mysql
  4.修改密码 update user set password=password(‘新密码’) where user=’root’;
  5.关闭两个cmd窗口,启动mysql服务

分类:
DDL:数据库定义语言
    操作对象:数据库和表
    关键词:create alter drop 
    操作数据库:
        创建(☆):
            格式:create database 数据库名称;
                如:create database mjl;
        修改(了解):
            就是修改数据库的字符集或者校对规则
            格式:alter database mjl character set utf8;
        删除(理解):
            格式:drop database 数据库名称;
                如:drop database mjl;
        常用命令:
            查看所有的数据库:show databases;
            进入或者切换数据库:use 数据库名称;
            查看建库语句:show create database 数据库名;
    操作表:
        创建表:
            格式:create table 表名(字段描述1,字段描述2....字段描述n);
                字段描述的格式:字段名 字段类型 [约束]
                如:create table user(id int,name varchar(20));
        修改表:
            格式:alter table 表名 ...
            修改表名:
                格式:alter table 旧表名 rename to 新表名;
            添加字段:
                格式:alter table 表名 add[column] 新字段描述;
                    如:alter table user add password varchar(20);
            修改字段类型:
                格式:alter table 表名 modify 新字段描述;
                    如:alter table user modify password int;
            修改字段名称:
                格式:alter table 表名 change 旧字段名 新字段描述;
                    如:alter table user change password pwd varchar(20);
            删除字段:
                格式:alter table 表名 drop 字段名;
                    如:alter table user drop pwd;
        删除表:
            格式:drop table 表名;
        常用命令:
            查看当前数据库下所有表:show tables;
            查看表结构:desc 表名;
            查看建表语句:show create table 表名;
DML:数据库操作语言
    操作对象:记录
    关键词:insert update delete
    插入记录:
        格式1:
            Insert into 表名 values(值1[,值2...]);
            例如:
                insert into user values(1,’zhangsan’);
            注意:
                默认插入全部的字段,values里面的值要和建表语句中字段顺序及类型保持一致。
                Int类型可以不使用引号,varchar类型必须使用引号
        格式2:
            Insert into 表名(字段1[,字段2...]) values(值1[,值2...]);
            例如:
                Insert into user(name,id) values(‘李四’,2);
            注意:
            插入指定的字段values里面的值要和前面的字段顺序及类型保持一致。
        插入记录乱码问题:
            方法1:临时修改
                Set names gbk;
            方法2:永久修改
                安装目录下/my.ini文件
                port=3306
                [mysql]
                default-character-set=utf8
                把utf8改成gbk,然后重启服务
    修改记录:
        格式:
            Update 表名 set 字段名1=值1[,字段名2=值2...] where 条件;
            例如:
                Update user set id=3 where name=’李四’;
                Update user set id=4,name=’赵六’ where id=3;
    删除记录:
        格式:
            Delete from 表名 [where 条件];
            例如:
                Delete from user; -- 清空表
                Delete from user where id=4;
        扩展:
            在开发中添加一个字段用来标识该条记录是否被删除。例如 isdel 
DQL:数据库查询语言
    关键词:select
    查询语句:select * from 表名;
    基本查询:
        1.查询出所有商品信息(查询全部)
            Select * from products;
            Select id,name,price,pnum,category from products;(标准)
        2.查询出所有商品的名称,价格,类别及数量信息(查询部分)
            Select name,price,category,pnum from products;
        3.查询出所有的商品类别
            去重复操作:distinct
            Select distinct category from products;
        4.查询出所有商品的名称及价格,将所有商品价格加10
            在查询的结果之上进行运算。
            Select name,price+10 from products;
            注意:
                NULL和任意数据进行运算结果都是NULL值。可以通过ifnull(字段名,默认是)  
                例如:ifnull(price,0) 若价格为null,则按0处理
                Select name,ifnull(price,0)+10 from products;
        5.查询出每一个商品的总价及名称
            Select name,pnum*price from products;
            字段起别名:字段 [as] 别名
                select name,pnum*price as 总价 from products;
    条件查询:
        格式:select * from 表名 where 条件;
            Select 字段1[,字段2...] from 表名 where 条件;
        1.查询所有计算机类商品信息
            -- 条件写法1:支持关系运算符 >  >=  <  <=  !=(<>)
            -- 格式:字段名 运算符 值;
            Select * from products where category=’计算机’;
            Select * from products where category!=’计算机’;
        2.查询出商品价格大于90的商品信息
            Select * from products where price >90;
        3.查询出商品总价大于10000的商品信息
            Select * from products where price*pnum>10000;
        4.查询出价格在100-200之间的商品信息
            -- 条件写法2:支持逻辑操作符 and  or  not
            -- 格式:表达式1 and|or 表达式2
            Not 表达式
            Select * from products where price >=100 and price <=200;
            -- 条件写法 3:支持between  and 操作
            -- 格式:字段 between 较小值and 较大值
            Select * from products where price between 100 and 200;
        5.查询出商品价格是65,100或190的商品信息
            Select  * from products where price =65 or price =100 or price =190;
            -- 条件写法4:支持 in 操作
            -- 格式:字段 in (值1,值2...)
            Select * from products where price in (65,100,190);
        6.查询出商品的名字中包含java的商品信息
            -- 条件写法5:匹配操作 like
            -- 格式:字段 like 匹配规则;
            -- 匹配内容
                Like  ‘龙’     值为龙
                Like%龙’     值以龙结尾
                Like  ‘龙%’  值以龙开头
                Like%%’ 值包含龙
            -- 匹配个数
                Like   ‘_’     值为一个字符
                Like  ‘__”    值为2个字符
            Select * from products where name like%java%’;
        7.查询出书名是两个字的商品信息
            Select * from products where name like ‘__’;
            (很少用,一汉字三字节)Select * from products where length(name)=6;
        8.查询出商品价格不为null的商品信息
            -- 条件写法6:Null操作
            -- 格式1:is null
            Select * from products where price is null;
            --格式2:is not null
            Select * from products where price is not null;
            排序:order by
                格式1:
                    Select * from 表名 [where 条件] order by 排序字段 排序方式;
                格式2:
                    Select * from 表名 [where 条件] order by 排序字段1 排序方式,排序字段2,排序方式;
            排序方式:
                升序:asc(默认)
                降序:desc
                1.查询出所有商品,并根据价格进行升序排列
                    Select * from products order by price asc;
                2.查询出所有商品,根据数量进行升序排列。如果数量相同,根据价格进行        降序排列
                    Select * from products order by pnum asc,price desc;
    聚集函数:
        它是对一列的值进行计算,然后返回一个单一的值;另外聚集函数会忽略空值
        Sum(字段):求和
        Count(字段):计数
        Max(字段):最大值
        Min(字段):最小值
        Avg(字段):平均值
        格式:
            Select 聚集函数 from 表名 [where 条件];
        1.统计商品表中共有多少条记录
            Select count(id) from products;
            开发中:
                Select count(*) from products;
        2.统计商品表中价格大于50的有多少条记录
            Select count(*) from products where price >50;
        3.统计有多少商品
            Select sum(pnum) from products;
        4.统计所有商品的总价值
            Select sum(price*pnum) from products;
        5.统计所有商品的平均价格
            Select sum(price*pnum)/sum(pnum) from products; 
            --round(值,保留位数)
            Select round(sum(price*pnum)/sum(pnum),2)  from products;
        6.统计出记录中pnum的平均值
            Select avg(pnum) from products;
        7.统计出商品表中price最大值
            Select max(price) from products;
        8.统计出商品表中price最小值
            Select min(price) from products;
        9.统计出生活百科类图书的总数量
            Select sum(pnum) from products where category=’生活百科’;
            分组:group by
                格式1:
                    Select 分组字段[,集合函数] from 表名 [where 条件] group by分组字段;
                1.对商品分类别统计,求出每一种类商品的总数量
                    Select category,sum(pnum) from products group by category;
                2.对商品分类别统计,求出每一种类商品的总数量,数量要大于100
                    Select category,sum(pnum) from products where sum(pnum)>100 group by category; ×where条件后不能跟聚集函数
                格式2:
                    Select 分组字段[,集合函数] from 表名 [where 条件] group by分组字段 sum(pnum)>100;
                where和having的区别:
                    1.where后面不能使用聚集函数,having可以
                    2.where是对分组之前的数据进行筛选,having是对分组之后的数据进行筛选。
        DQL的使用小结:
            Select 分组字段[,聚集函数] from 表名 where 条件 group by 分组字段 having 条件 order by 排序字段 asc|desc;
            注意:order by永远放在最后
            执行顺序:
                1.先确定哪张表 from 
                2.确定是否有条件 where
                3.若需要分组,使用group by
                4.若需要对分组后的数据进行筛选,执行having
                5.确定要显示哪些字段,select 
                6.确定字段的显示方法,执行order by
DTL:数据库事物语言
DCL:数据库控制语言



字段类型:
Java                    mysql
Byte                    tinyint
Short                     smallint
Int                     intLong                    bigint

Float                    float
Double                       double double(m,d) m代表的数字的长度,d代表小数位个数
                                Double(5,2) 存放的最大值为999.99        

Char                        char(n)    char(5):长度不可变 如:存abc,在数据库中“abc  ”
String                       varchar(n)☆  varchar(5):长度可变 如:存abc,“abc”

Boolean                

Java.sql.Date           date:日期
Java.sql.Time          time:时间
Java.sql.TimeStamp     timestamp:时间戳
                       dateTime:日期和时间



约束:保证是数据的有效性和完整性
    在mysql中有主键约束(primary key),唯一约束(unique),非空约束(not null),外键约束(foreign key)
    
    主键约束(primary key):确定字段是该条记录唯一标识。
        注意:
            1.主键可以是一个字段,也可以是多个字段
            2.一张表只能有一个主键
        特点:
            被主键约束修饰过的字段唯一非空
        使用:
            格式1:在声明字段的同时,添加主键约束
                Create table pk01(
                    id int primary key,
                    name varchar(20)
                );
                insert into pk01 values(1,tom); --成功
                insert into pk01 values(1,tom);--错误,已经存在,保证唯一性
                insert into pk01 values(null,tom);--错误,非空
                扩展:
                    一般情况下,使用id作为主键,id没有任何实际意义。
                    
            格式2:在声明字段之后,在约束区域添加主键约束:[constraint] primary key(字段1[,字段2...]);联合主键,都不能为空
                Create table pk02(
                    id int
                    name varchar(20),
                    primary key(id,name)
                );
                Insert into pk02 values(1,’tom’);
                Insert into pk02 values(1,’jack’);
                
            格式3:创建完表之后,通过修改表结构添加主键约束:
                Alter table 表名 add primary key(字段1[,字段2...]);
                Create table pk03(id int,name varchar(20));
                Alter table pk03 add primary key(name);
        使用小结:
            开发中最常使用的是第一种,只能在一个字段上添加主键约束。
            若需要在多个字段上添加主键约束(联合主键),请使用第二种或第三种方    式。
            
    唯一约束(unique)
        特点:被修饰的字段唯一,对Null值不起作用
        使用:
            格式1:在声明字段的同时,添加唯一约束 
                写法:字段名 字段类型 unique
                Create table un01(
                    id int unique,
                    name varchar(20)
                );
                    Insert into un01 values(null,’tom’); --多次创建成功,对null不起作用
                    
            格式2:在声明字段之后,在约束区域添加唯一约束
                写法:[constraint] unique(字段1[,字段2...])
                Create table un02(
                    id int,name varchar(20),
                    unique(id,name)
                );--联合唯一约束
                
            格式3:在创建完表之后,通过修改表结构添加唯一约束
                Alter table 表名 add unique(字段1[,字段2]));
                Alter table un03 add unique(id);

            使用小结:
                在开发中一般不添加
                在项目最后上线的时候通过第三种方式添加唯一约束。
                
    非空约束(not null)
        特点:被修饰的字段非空
        格式:在声明字段的同时添加非空约束
            Create table nn
                id int not null,
                name varchar(20) not null
            );


三个小知识(必须掌握)
    auto_increment(开发)
        作用:被它修饰过的字段可以自增
        格式:
            字段名称 字段类型 primary key auto_increment
        特点:    
            1.被修饰的字段类型可以自增,一般是int
            2.被修饰的字段必须是一个key,一般是primary key
        create table ai01(
            id varchar(20) primary key auto_increment,
            name varchar(20)
        ); -- 错误 Incorrect column specifier for column ‘id‘
        
        create table ai02(
            id int auto_increment,
            name varchar(20)
        ); -- 错误  it must be defined as a key
         
        create table ai03(
            id int primary key auto_increment,
            name varchar(20)
        );
        
        使用的注意事项:
            插入值得时候可以是指定的值
            插入值得时候把它指定为Null
            插入值的时候忽略掉它也可以。
        insert into ai03 values(33,sansan);
        insert into ai03 values(null,xiaosan);
        insert into ai03(name) values(xiaosi);
    
    truncate(面试)
        作用:清空表,干掉表结构,创建一个新表。
        格式:truncate table 表名;
        
        delete from 和truncate区别:
            1.truncate 属于DDL语句,delete 属于DML语句
            2.truncate 是干掉表结构,重新创建一个新表。delete 是逐条删除记录
            
    default(看懂)
        作用:添加默认值
        格式:字段名称  字段类型 (约束) default 默认值
        例如:
            create table de(
                id int primary key auto_increment,
                name varchar(20) default 张三丰
            );
            
            insert into de values(null,sansan);
            insert into de values(null,null); -- null也算是赋值
            insert into de(id) values(null);
            
            结论:在不明确给定值得时候采用默认值。


数据库的备份与还原(了解)
    备份:
        格式:在cmd窗口下输入
            mysqldump -uroot -p密码 要备份的数据库>文件磁盘路径
            例如:    
                mysqldump -uroot -pmoujinling321 mjl>d:/mjl.sql
        
    还原:前提是必须手动创建目的地数据库
        格式1:在cmd窗口下输入    
            mysql -uroot -p密码 目的地数据库<文件磁盘路径
            例如:
                mysql -uroot -pmoujinling321 u34<d:/mjl.sql
        格式2:必须在目的地数据库中执行命令
            source 文件磁盘路径    
                例如:
                    source d:/mjl.sql
    常用的命令:
        select database(); -- 查看当前所在的数据库



多表的设计与实现☆
    关系型数据库:存放实体与实体之间的关系。
    用户<拥有> 订单<包含> 商品
        
    一对多
        设计:
            在实际开发中,我们称一方(用户表)为一表或者主表,称多方(订单表)为多表或者从表。
            然后在多表的一方添加一个字段,字段名称自定义(一般使用主表的名称_id,字段的类型一般和主表的id保持一致)。该字段称之为外键。
        实现:
            user(用户表)
            create table user(
                id int primary key auto_increment,
                username varchar(20)
            );
            
            orders(订单表)
            create table orders(
                id int primary key auto_increment,
                price double,
                user_id int
            );
        
            insert into user values(null,强哥),(null,聪哥);
            
            insert into orders values(null,1314,1);
            insert into orders values(null,1315,2);
            insert into orders values(null,305,2);
        为了保证数据的有效性和完整性,必须给表添加外键约束。
        在多表的一方添加外键约束。
        格式:通过修改表结构添加外键约束。
            alter table 表名 add [constraint [外键名称]] foreign key(多表的外键) references 主表(主键);
        例如:    
            alter table orders add foreign key(user_id) references user(id);
        
        注意:
            主表中不能删除从表中已引用的数据
            从表中不能添加主表中不存在的数据
            外键可以为null
            
    多对多
        设计:
            在开发中,一般会引入一个中间表,中间表中的字段一般为两表的主键。
            通过中间表,就可以把多对多的关系拆分成两个一对多的关系。
            一般我们会把中间表的两个字段设置成联合主键。
        实现:
            list(商品表)
            create table list(
                id int primary key auto_increment,
                price double
            );
        
            orders_pro(中间表)
            create table orders_pro(
                oid int,
                pid int,
                primary key(oid,lid)
            );
            
            insert into list values(null,999),(null,305),(null,10);
            
            insert into orders_list values(1,1),(1,2),(1,3),(2,1),(2,2),(2,3),(3,2);
        为了保证数据的有效性和完整性,必须给表添加外键约束。(在中间表上添加)
        在中间表上添加两个外键约束
        格式:    
            alter table 表名 add [constraint [外键名称]] foreign key(多表的外键) references 主表(主表的id);
        例如:
            alter table orders_list add foreign key(oid) references orders(id);
            alter table orders_list add foreign key(lid) references list(id);
            
    一对一    
        设计:
            1.若一张表中的字段很少,二表合二为一
            2.根据需求,一般在不常用的表上添加外键约束,实际上是把主键设置成外键即可。
        实现:    
            person(人员表)
            create table person(
                id int primary key auto_increment,
                username varchar(20)
            );
        
            idcard(身份证表)
            create table idcard(
                id int primary key auto_increment,
                idno varchar(25)
            );
        设置外键:
            alter table idcard add foreign key(id) references person(id);
            
多表的查询☆
    环境搭建:
    -- 用户表
    create table `user` (                                  
        `id` int auto_increment primary key,                
        `username` varchar(50)  -- 用户姓名                                                
    );

    -- 订单表(orders)
    create table `orders` (                                                  
        `id` int  auto_increment primary key,                                  
        `price` double,                                           
        `user_id` int                                       
        );

    -- 给订单表添加外键约束
    alter table orders add constraint user_fk foreign key (user_id) references user(id); 

    -- 向user表中添加数据
        insert into user values(1,张三);
        insert into user values(2,李四);
        insert into user values(3,王五);
        insert into user values(4,赵六);

    -- 向orders 表中插入数据
        insert into orders values(1,1314,1);
        insert into orders values(2,1314,1);
        insert into orders values(3,15,2);
        insert into orders values(4,315,4);
        insert into orders values(5,1014,null);
        
    1.查询用户的订单,没有订单的用户不显示
    2.查询所有用户的订单详情
    3.查询所有订单的用户详情
    笛卡尔积:(了解)
        格式:    
            select a.*,b.* from a,b
    隐式内连接:(1)
        格式:
            select a.*,b.* from a,b where 连接条件;
        例如:
            select user.*,orders.* from user,orders where user.id=orders.user_id;
    内连接:(1)
        格式:
            select a.*,b.* from a [inner] join b on 连接条件;
        注意:
            内连接的查询结果和隐式内连接的查询结果一样。
        例如:
            select user.*,orders.* from user inner join orders on user.id=orders.user_id;
    左外连接:
        格式:
            select a.*,b.* from a left join b on 连接条件;
        意思:
            以Left左边的表为主,显示它的所有记录,根据连接条件查询b表。若符合条件,则显示该条记录。否则以Null值显示。
        例如:
            select user.*,orders.* from user left join orders on user.id=orders.user_id;
            
    右外连接:
        格式:
            select a.*,b.* from a right join b on 连接条件;
        注意:
            左外连接和右外连接可以等价。
        意思:    
            以right右边的表为主,显示它的所有记录,根据连接条件查询a表。若符合条件,则显示该条记录。否则以Null值显示。
        例如:
            select user.*,orders.* from user right join orders on user.id=orders.user_id;
    子查询:
        一个查询的条件是另一个查询的结果。
        1.查看用户为张三的订单详情
            select id from user where username=张三; --id=1
            select * from orders where user_id=1;
            
            合二为一:
            select * from orders where user_id=(select id from user where username=张三);
        
        2.查询出订单的价格大于300的所有用户信息。
            select user_id from orders where price>300; -- user_id=1,1,4,null
            select * from user where id in(1,1,4,null);
            
            合二为一:
            select * from user where id in (select user_id from orders where price>300);
        3.查询订单价格大于300的订单信息及相关用户的信息。
            方式1:select user.*,orders.* from user,orders where user.id=orders.user_id and orders.price>300;
            方式2:
                首先,查询订单价格大于300的订单信息。
                    select * from orders where price>300;
                然后,通过上一条语句结果和user表进行关联查询即可
                    select a.*,b.* from a,b where 条件语句;
                例如:
                    select u.*,b.* from user u,(select * from orders where price >300) as b where u.id=b.user_id;
            
        单列多行子查询:
            可以使用in,any,all操作
            >any:大于子查询中的最小值
            >all:大于子查询中的最大值
            <any:小于子查询中的最大值
            <all:小于子查询中的最小值
            !=any或<>any:不等于子查询中的任意值
            =any:等于子查询中的任意值



练习:
-- 1.返回拥有员工的部门名、部门号。(dept,emp)    
select  distinct d.dname,d.deptno from dept d,emp e where d.deptno=e.deptno;

-- 2.工资多于ward的员工信息。
select sal from emp where ename=ward;
select * from emp where sal>(select sal from emp where ename=ward);

-- 3.返回员工和其所属领导的姓名。(自连接)
select e.ename as 员工,l.ename as 领导 from emp e,emp l where e.mgr=l.empno; -- 一张表拆成两张

-- 4.返回雇员的雇佣日期早于其领导雇佣日期的员工及其领导姓名。(在日期类型可以直接比较)
select e.ename 员工 ,l.ename 领导 from emp e,emp l where e.mgr=l.empno and e.hiredate<l.hiredate;

-- 5.返回员工姓名及其所在的部门名称。
select deptno from emp;
select e.ename,d.dname from emp e,(select deptno from emp) d where e.deptno=d.deptno; 

-- 6.返回从事clerk工作的员工姓名和所在部门名称
select job from emp where ename=clark;
select e.ename,d.dname from emp e,dept d where e.job=clerk and e.deptno=d.deptno;

-- 7.返回部门号及其本部门的最低工资。
select deptno,min(sal) from emp group by deptno;

-- 8.返回销售部(sales)所有员工的姓名。
select deptno from dept where dname=sales;
select ename from emp where deptno=(select deptno from dept where dname=sales);

-- 9.返回工资多于平均工资的员工。
select avg(sal) from emp;
select ename from emp where sal>(select avg(sal) from emp);

-- 10.返回与SCOTT从事相同工作的员工。
select job from emp where ename=scott;
select * from emp where job=(select job from emp where ename=scott);

-- 11.返回与30部门员工工资相同的员工姓名与工资。
select sal from emp where deptno=30;
select ename,sal from emp where sal in(select sal from emp where deptno=30);

-- 12.返回工资高于30部门所有员工工资水平的员工信息。
select max(sal) from emp where deptno=30;
select * from emp where sal>(select max(sal) from emp where deptno=30);
select * from emp where sal>all(select sal from emp where deptno=30);

!!!!!!!!!!!!!!!!!!
-- 13.返回部门号、部门名、部门所在位置及其每个部门的员工总数。count(*)=null被忽略了!!
select deptno,count(*) from emp group by deptno;
select d.*,temp.total from dept d,(select deptno,count(*) total from emp group by deptno) temp where d.deptno=temp.deptno;

select d.*,temp.total from dept d left join (select deptno,count(*) total from emp group by deptno) temp on deptno=temp.deptno;


-- 14.返回员工的姓名、所在部门名及其工资。
select deptno,ename,sal from emp;
select d.dname,e.ename,e.sal from dept d,(select deptno,ename,sal from emp) e where d.deptno=e.deptno;

-- 15.返回员工的详细信息。(包括部门名)
select deptno from emp;
select e.*,d.dname from emp e,dept d where e.deptno=d.deptno;
select e.*,d.dname from emp e left join dept d on d.deptno=e.deptno;

-- 16.返回员工工作及其从事此工作的最低工资。
select job from emp;
select min(sal) from emp group by job;

-- 17.返回不同部门经理的最低工资。
select deptno,min(sal) from emp where job=manager group by deptno;

-- 18.计算出员工的年薪,并且以年薪排序。
select sal*12+ifnull(comm,0) as YearSal from emp order by YearSal asc;

-- 19.返回工资处于第四级别的员工的姓名。
select losal,hisal from salgrade where grade=4;
select e.ename,e.sal from emp e,salgrade s where s.grade=4 and e.sal between s.losal and s.hisal;

-- 20.返回工资为二等级的职员名字、部门所在地、和二等级的最低工资和最高工资
select losal,hisal from salgrade where grade=2;
select e.ename,d.loc,s.losal,s.hisal from emp e,dept d,salgrade s where s.grade=2 and e.deptno=d.deptno and e.sal between s.losal and s.hisal;

select e.ename,d.loc,s.losal,s.hisal from emp e
    join salgrade s
        on s.grade=2 and e.sal between s.losal and s.hisal
    join dept d
        on e.deptno=d.deptno;

-- 21.工资等级多于smith的员工信息。
select hisal from salgrade s where (select sal from emp where ename=smith) between s.losal and s.hisal;
select * from emp where sal>(select hisal from salgrade s where (select sal from emp where ename=smith) between s.losal and s.hisal);

 






















以上是关于41.MySql的主要内容,如果未能解决你的问题,请参考以下文章

Linux命令应用大词典-第41章 MySQL数据库

VSCode自定义代码片段——CSS选择器

谷歌浏览器调试jsp 引入代码片段,如何调试代码片段中的js

片段和活动之间的核心区别是啥?哪些代码可以写成片段?

VSCode自定义代码片段——.vue文件的模板

VSCode自定义代码片段6——CSS选择器