mysql


一.练习

  1. 列出至少有4个员工的部门名称

    selectd.dname 部门名称,count(e.empno) 部门人数
    fromemp e join dept d
    one.deptno = d.deptno
    group byd.deptno
    havingcount(e.empno) > 4;
    
  2. 列出薪金比"SMITH"多的所有员工

    ---查询smith工资是多少?
    select sal from emp where ename = 'smith';select*
    fromemp
    wheresal > (select sal from emp where ename = 'smith');
    
  3. 列出所有员工的姓名以及其直接上级的姓名

    selecte.ename,m.ename
    fromemp e, emp m
    wheree.mgr = m.empno;
    
  4. 列出受雇日期早于其直接上级的所有员工的编号、姓名、部门名称

    selecte.empno 员工的编号,e.ename 姓名,d.dname 部门名称,e.hiredate 雇员入职日期,m.hiredate 领导入职日期
    fromemp e, emp m,dept d
    wheree.mgr = m.empno
    ande.deptno = d.deptno
    ande.hiredate < m.hiredate;
    
  5. 列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门

    selectd.dname,e.*
    fromdept d left join emp e
    ond.deptno = e.deptno;
    
  6. 列出所有从事"CLERK"工作的雇员姓名及其部门名称、部门人数

    ---查询每个部门的部门编号及人数
    select d.deptno,count(e.empno) count from emp e,dept d where e.deptno = d.deptno group by d.deptno;selecte.ename 雇员姓名,d.dname 部门名称,temp.count 部门人数
    fromemp e join dept d
    one.deptno = d.deptno
    join(select d.deptno,count(e.empno) count from emp e,dept d where e.deptno = d.deptno group by d.deptno) temp
    ond.deptno = temp.deptno
    wheree.job = 'CLERK';
    
  7. 列出最低薪金大于1500的各种工作及从事此工作的全部雇员人数

    selectjob,count(empno)
    fromemp
    group byjob
    havingmin(sal) > 1500;
    
  8. 列出在部门"sales"(销售部)工作的员工的姓名,假定不知道销售部的部门编号

    ---查询出销售部的部门编号
    select deptno from dept where dname = "sales";selectdeptno,ename
    fromemp
    wheredeptno = (select deptno from dept where dname = "sales");
    
  9. 列出薪金高于公司平均薪金的雇员姓名、所在部门名称、领导姓名、雇员的工资等级求出公司平均薪金

    ---查询出公司的平均薪资是多少?
    select avg(sal) from emp;selecte.ename 雇员姓名,d.dname 部门名称,m.ename 领导姓名,s.grade
    fromemp e join dept d
    one.deptno = d.deptno
    joinemp m
    one.mgr = m.empno
    joinsalgrade s
    one.sal
    between s.losal and s.hisal
    wheree.sal > (select avg(sal) from emp);
    
  10. 列出与"SMITH"从事相同工作的所有员工及部门名称

    ---查询SMITH从事什么工作
    select job from emp where ename = 'SMITH';selecte.*,d.dname
    fromemp e,dept d
    wheree.deptno = d.deptno
    andjob = (select job from emp where ename = 'SMITH');
    
  11. 列出薪金等于部门30中员工的薪金的所有员工的姓名和薪金

    ---部门30的员工的工资是多少?
    select sal from emp where deptno = 30;select   ename,sal
    from    emp
    wheresal in(select sal from emp where deptno = 30);
    
  12. 列出薪金高于部门30所有员工薪金的员工姓名、薪金及部门名称

    ---部门30的员工的工资是多少?
    select sal from emp where deptno = 30;select   ename,sal,d.dname
    from    emp e,dept d
    wheresal >all(select sal from emp where deptno = 30)
    ande.deptno = d.deptno;
    
  13. 列出在每个部门工作的员工数量、平均工资

    selectd.deptno 部门编号,count(e.empno) 员工数量,avg(e.sal) 平均工资
    fromdept d left join emp e
    ond.deptno = e.deptno
    group byd.deptno;
    
  14. 列出所有员工的姓名、部门名称和工资

    selecte.ename,d.dname,e.sal
    fromemp e,dept d
    wheree.deptno = d.deptno;
    
  15. 列出所有部门的详细信息和部门人数

    selectd.*,count(e.empno) 部门人数
    fromdept d left join emp e
    ond.deptno = e.deptno
    group byd.deptno;
    
  16. 列出每种工作的最低工资以及从事此工作的雇员姓名

    ---每个工作的最低工资是多少?
    select job,min(sal) from emp group by job;selecttemp.job,e.ename,temp.min
    fromemp e,(select job,min(sal) min from emp group by job) temp
    wheree.job = temp.job
    ande.sal = temp.min;
    
  17. 列出各个部门的经理的最低薪金

    selectmin(sal) 最低薪金
    fromemp e
    wherejob = 'manager'
    group bye.deptno;
    
  18. 列出所有员工的年工资,按年薪从低到高排序

    select(sal + ifnull(comm,0)) * 12 年薪
    fromemp
    order by年薪;
    
  19. 查询雇员的领导信息,要求领导的薪水要超过3000

    #distinct 是去重的意思。selectdistinct m.*
    fromemp e, emp m
    wheree.mgr = m.empno
    andm.sal > 3000;
    
  20. 求出部门名称中,带’S’字符的部门员工的工资总和 、部门人数

    selectsum(e.sal),count(e.empno),d.dname
    fromemp e,dept d
    wheree.deptno = d.deptno
    andd.dname
    like'%S%'
    group byd.dname;
    

二.函数

函数是由Mysql提供的内置函数。大致分为一下几类:
1.字符串
2.数值
3.日期
4.流程控制
5.系统

1.字符串函数

1.concat(s1,s2,s3...)    拼接字符串
selectconcat('编号为:',empno,' 他/她的名字是:',ename,' 工资是:',sal)
fromemp;
2.lower()    转换成小写select lower(ename) from emp;
3.upper()    转换成大写select upper(ename) from emp;
4.length()   字符串长度select length(ename) from emp;
5.reverse()  字符串反转select reverse(ename) from emp;
6.trim() 去除前后两端空白select trim(ename) from emp;select length('   hello   ') from dual;select length(trim('   hello   ')) from dual;dual是Mysql提供的专门用于测试用的虚表。
7.ltrim()    去除左边的空白select ltrim(ename) from emp;
8.rtrim()    去除左边的空白select rtrim(ename) from emp;
9.replace(s1,s2,s3) 将s1中的s2替换成s3select replace(ename,'S','*') from emp;
10.repeat(s,n) 将s重复n次然后输出select repeat(ename,2) from emp;
11.substr(s,i,len)   将s从i的位置截取len个select substr(ename,1,2) from emp;     下标从1开始

2.数值函数

1.ceil(n)    向上取整select ceil(9.01) from dual;
2.floor(n)   向下取整select floor(9.99) from dual;
3.round(n,y) 将n保留y位小数,并且四舍五入select round(avg(sal),3) from emp;select round(9.9999999,2) from emp;
4.truncate(n,y)  将n保留y位小数,不四舍五入select truncate(avg(sal),3) from emp;select truncate(9.9999999,2) from emp;
5.rand() 返回0-1的随机数select rand() * 100 from dual;

3.日期函数

1.now()  返回当前系统函数select now() from dual;
2.curdate()  返回当前年月日select curdate() from dual;
3.curtime()  返回时分秒select curtime() from dual;
4.year() 返回日期中的年份select year(hiredate) from emp;
5.month()    返回日期中的月份select month(hiredate) from emp;
6.day()  返回日期中的日select day(hiredate) from emp;
7.week() 返回一年中的星期select week('2022-07-01') from emp;
8.timestampdiff(interval,datetime1,datetime2) 根据datetime1返回与datetime2的interval
interval取值:year年 month月  day日        hour时   minute分     second秒 select timestampdiff(minute,'2010-02-13',now()) from dual;
9.date_format(partern)
格式:%Y    四位年%m   两位月%d   两位日%H   24小时制的时%i   分%s 秒
select date_format(now(),'%Y年%m月%d日 %H时:%i分:%s秒') from dual;

4.流程控制

1.if(k,v1,v2)    如果k为真取v1否则取v2;select if(sal > 3000,'中等收入','低收入人群') from emp;2.ifnull(k,v)    如果k为null 则取vselect ifnull(comm,0) from emp;

5.系统函数

1.database() 查看当前使用的数据库select database() from dual;
2.user()select user() from dual;
3.version()select version() from dual;

三.约束

1.什么是约束?约束是用于对数据库的数据进行合法性校验的一种手段。
2.约束的分类a)主键约束b)非空约束c)唯一约束d)外键约束

1.主键约束

a)主键自增长

主键约束本身不能为空且唯一。
被设定为主键的列会作为数据的主要标识。在创建表的时候设定主键,并且自增长:create table my_primary(id int,name varchar(20));
关键字:primary key 设定 id 字段为主键。auto_increment 主键自增长。 mysql自动维护主键。插入数据:insert into my_primary(name) values('张三');insert into my_primary(name) values('李四');查询数据:select * from my_primary;创建表之后设定主键,并且自增长:create table my_primary2(id int,name varchar(20));
设定主键:alter table my_primary2 modify id int auto_increment primary key;插入数据:insert into my_primary2(name) values('张三');insert into my_primary2(name) values('李四');查询数据:select * from my_primary2;---设定主键自增长的起始位置。alter table my_primary2 auto_increment = 100;
---设定主键自增长的不长。set auto_increment_increment = 2;注意:如果主键数据被删除,则该主键永不可用。

b)非自增长主键

在创建表时增加主键:
create table my_not_increment_pimary(id varchar(50) primary key,name varchar(20)
);插入数据:
insert into my_not_increment_pimary values('1','aaa');insert into my_not_increment_pimary values(uuid(),'bbb');insert into my_not_increment_pimary values(uuid(),'ccc');在创建表之后增加主键:
create table my_not_increment_pimary2(id varchar(50),name varchar(20)
);
设置主键:
alter table my_not_increment_pimary2 modify id varchar(50) primary key;插入数据:
insert into my_not_increment_pimary2 values(uuid(),'aaa');insert into my_not_increment_pimary2 values(uuid(),'bbb');insert into my_not_increment_pimary2 values(uuid(),'ccc');

2.非空约束

不允许数据为null就是非空。create table t_my_not_null(id varchar(50) primary key,cardNo char(18) not null,name varchar(20)not null
);插入数据:insert into t_my_not_null values(uuid(),'3403021998xxxxxx','张三');创建表后添加非空约束:
create table t_my_not_null2(id varchar(50) primary key,cardNo char(18),name varchar(20)
);alter table t_my_not_null2 modify cardNo char(18) not null;
alter table t_my_not_null2 modify name varchar(20) not null;

3.唯一约束

不允许重复数据。
create table t_my_unique(id varchar(50) primary key,cardNo char(18) not null,name varchar(20)not null,tel varchar(20)unique
);插入数据:insert into t_my_unique values(uuid(),'3403021998xxxxxx','张三','13914767897');insert into t_my_unique values(uuid(),'3403021998xxxxxx','张三','13914767898');创建表之后设置唯一约束:
create table t_my_unique2(id varchar(50) primary key,cardNo char(18) not null,name varchar(20)not null,tel varchar(20)
);alter table t_my_unique2 modify tel varchar(20) unique;

4.外键约束

从表【有外键的表】中的某一列引用主表【被引用的表】中的某一列,让两张以上的表产生关联和约束。
//从表
create table student_foreign(id varchar(50) primary key,name varchar(20),sex int,weight double,cid varchar(50),foreign key(cid) references class_primary(id)
);//主表
create table class_primary(id varchar(50) primary key,name varchar(20),info varchar(20)
);插入数据:
insert into class_primary values(uuid(),'Java班','java就业班级');insert into student_foreign values(uuid(),'张三',1,75.2,'002ffed8-f905-11ec-b824-a85e45a0cbb0');
insert into student_foreign values(uuid(),'李四',0,55.2,'002ffed8-f905-11ec-b824-a85e45a0cbb0');删除数据:
---不能删除,因为数据被引用。
delete from class_primary where id = '002ffed8-f905-11ec-b824-a85e45a0cbb0';
---可以删除,因为删除的是从表的数据。
delete from student_foreign where id = '63bbae66-f905-11ec-b824-a85e45a0cbb0';创建表之后如何添加外键:
create table student_foreign2(id varchar(50) primary key,name varchar(20)
);
---新建一个列
alter table student_foreign2 add cid varchar(50);
---将新建的列设置为外键。
alter table student_foreign2 add foreign key(cid) references class_primary(id);

四.事务

事务是用来保证数据的完整性和操作性的。一个业务由若干个一次性的操作组成,
这操作要么都成功,要么都失败。事务就是用于解决在一个业务中需要操作
多条sql的时候,sql没有全部被执行成功。
那么就需要将执行成功的sql语句设置成未操作的形态。
这种方式我们成为:回滚。
如果所有sql都执行成功则将数据持久化
这种当时我们成为:提交。Mysql的存储行为是,先将数据存储在内存,然后当用户
进行了commit操作之后,才会将数据从内存的缓存区刷新
到磁盘,进行持久化。Mysql的提交方式是默认开启的。查看自动提交状态:
show variables like 'autocommit%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | ON    |   自动提交开启状态
+---------------+-------+关闭自动提交:
set autocommit = off;
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | OFF   |   自动提交关闭状态
+---------------+-------+commit; 提交      将数据从缓存区刷新到磁盘
rollback; 回滚    将数据从缓存区更新。比如:转账1.从A账户中减去转账额度。2.从B账户中增加转账额度。

事务的特性:

称为事务的ACID:
  • Atomcity【原子性】

    原子性是指事务在操作中,所有的操作要么全部成功,要么全部失败。
    事务一旦成功后,必须完全应用到数据库,如果操作失败则不能对数据库有任何的影响。
    
  • Consistency【一致性】

    一致性是指事务从一个状态转换到另一个状态。
    也就说事务从执行前到执行后都在一致性的状态。
    通俗的说,不管操作失败还是成功,数据是保持一致的。
    
  • Isolation【隔离性】

    隔离性是指当多个用户发送并发访问数据库时,操作了同一张表,
    数据库会为每一个用户开启一个事务,事务与事务之间不能相互影响。
    多个并发的事务要相互隔离。
    
  • Durability【持久性】

    事务一旦被提交,那么对于数据来说就是永久性的。
    哪怕服务器宕机,或者损坏。数据都不会发生改变。
    

五.存储引擎【了解】

1.什么是存储引擎?表的最终形式生成一个文件保存在磁盘上,那么这个表的数据结构就由存储引擎来决定。存储引擎指的就是表的存储机制,索引方案,不同的存储引擎由于处理的方式不同,会带来不同的功能。2.查看mysql的存储引擎show engines;3.常用的存储引擎
  • InnoDB

    该引擎是Mysql首选引擎,支持事务安全表,支持行多和表锁定。
    该引擎是默认使用的引擎。主要特性有:
    1.具有提交,回滚和崩溃恢复能力。
    2.为处理巨大数据量大最大性能而设计的。
    3.支持外键完整性约束。
    4.经常被部署在众多需要高性能的大型站点上。
    使用该引擎创建的表会在数据库文件夹下创建一个以.frm为结尾的文件,该文件用于存储数据和数据结构。
    其它数据库引擎都不支持事务,只有它支持。
    
  • MyISAM

    它是在web、数据仓储和其它应用环境下使用的存储引擎之一,
    它拥有较高的插入,查询速度,但是不支持事务。
    主要特性:
    1.在支持大文件的文件系统和操作系统上被支持。
    2.适合读多写少的应用场景。
    3.非事务引擎。使用该引擎创建的表会在数据库文件夹下创建三个以.frm【数据结构】 .myd【数据】 .myi【索引】 文件。
    create table t_myisam(id int,name char(2)
    )engine = MyISAM;
    
  • MEMORY

    查询速度极快。
    数据不能被持久化。
    所有的数据都放在内存中。
    不支持blob 和 text类型。create table t_memory(id int,name char(2)
    )engine = MEMORY;
    

六.索引

1.什么是索引

索引是对数据库表中的一列或者多列的值进行排序的一种结构,
使用索引可以快速访问数据库中的数据。本质上就是数据的目录。

2.索引的原理

在没有对数据添加索引的时候,Mysql默认是全表扫描。
一行一行的对数据进行匹配。有多少条数据就扫描多少次。
然后找到将匹配到数据放入结果集知道全表扫描完毕。、而建立索引之后,会将建立索引的 'key' 值放入一个B+Tree上。
因为B树的特点就是适合找东西。每次以索引进行条件查找时,会去树上根据key值直接进行搜索。

3.索引的优点

1.建立索引可以有效缩短数据的检索时间。
2.建立索引可以加快表与表之间的连接
3.建立索引可以加快对表中数据的排序和查找。

4.索引的缺点

1.创建索引和维护索引需要时间成本,这个成本会随着数据量的增大而增大。
2.创建索引需要空间成本,每一条索引都需要占用数据库物理存储空间,数据量越大,占用空间越大。
3.索引会降低表的增删改的效率,因为每次数据的状态发生改变,都需要维护索引,导致时间变长。

5.索引的分类

1.普通索引【单列索引】
2.复合索引【组合索引】
3.唯一索引
4.主键索引

6.创建普通索引

---直接创建
create index empnoIndex on emp(empno);
---查看表中有哪些索引。
show index from emp;

7.索引的演示

1.导入t100w.sql
2.添加索引alter table t100w add index numIndex(num);
3.删除索引drop index numIndex on t100w;

七.视图

1.什么是视图?视图本质上就是一张虚表,是一组数据的逻辑展示。实质是对应一条复杂的SQL语句,它是一个映射到基表的一个查询语句。当基表的数据发生编号,视图的数据也会随之变化。可以理解为视图就是封装了一条非常复杂的查询语句。2.创建视图
create view v_emps_empm
as
selecte.ename 雇员姓名,d.dname 部门名称,m.ename 领导姓名,s.grade
fromemp e join dept d
one.deptno = d.deptno
joinemp m
one.mgr = m.empno
joinsalgrade s
one.sal
between s.losal and s.hisal
wheree.sal > (select avg(sal) from emp);

八、练习

1. 以首字母大写,其他字母小写的方式显示所有员工的姓名2. 将员工的职位用小写字母显示3. 显示员工姓名超过5个字符的员工名 4. 用#来填充员工职位job的结尾处,按10个字符长度输出。5. 去除字符串'  hello world  '两边的空格,并将单词间的空格改为','逗号。6. 以指定格式显示员工的奖金(格式:allen's comm is 300) 注:如果奖金为null显示为null,如smith 's comm is null。7. 显示在一个月为30天的情况所有员工的日薪,忽略余数8. 显示员工在此公司工作了几个月9. 显示所有12月份入职的员工10. 显示员工的年薪11. 显示所有员工的姓名、加入公司的年份和月份,并且按照年份升序排列12. 查询任职日期超过30年的员工,显示时将月薪加10%后显示```

Mysql学习笔记day3 --三天学完mysql所有知识点相关推荐

  1. Mysql学习笔记day1 --三天学完mysql所有知识点

    Mysql 超全MySQL学习笔记,三天就可以学会熟练运用SQL语句,干货满满,文章末尾有相应的练习题,可以多练练加深印象,希望我的文章对你有所帮助 一.服务器 1.什么是服务器?用于提供共享资源文件 ...

  2. PHP + MySQL 学习笔记(三)--- 分页显示 MySQL 资料表,使用 PHP 程式做分页 page 画面输出,PHP\HTML\MySQL 的穿插使用

    我在 "PHP + MySQL 学习笔记(一)- 延续前期 HTML + CSS 规划 插入 PHP 程式做画面输出" 这篇笔记里做了一个卜卦的 HTML 画面,也做了一个 MyS ...

  3. Mysql学习笔记(一)学完就出师系列哈哈哈

    本篇笔记是参照书籍<SQL基础教程>撰写的,MICK著,孙淼.罗勇译 文章目录 第一章 数据库和SQL 1.1 DBMS 1.2 SQL 第二章 查询基础 2.1 select语句基础 2 ...

  4. Mysql学习笔记(二)学完真可以出师系列第二弹

    文章目录 第五章 5.1 视图 5.2 子查询 5.3 关联子查询 第六章 函数 谓词 case表达式 6.1 函数 6.2 谓词 6.3 case表达式 第七章 集合运算 7.1 表的加减法 7.2 ...

  5. Mysql学习笔记(三)运算符和控制流函数

    原文:Mysql学习笔记(三)运算符和控制流函数 本章学习内容: 1.操作符 2.控制流程函数 操作符: i.圆括号.. 简单的介绍一下圆括号,圆括号的使用的目的是规定计算表达式的顺序...这个想必大 ...

  6. MySQL学习笔记01【数据库概念、MySQL安装与使用】

    MySQL 文档-黑马程序员(腾讯微云):https://share.weiyun.com/RaCdIwas 1-MySQL基础.pdf.2-MySQL约束与设计.pdf.3-MySQL多表查询与事务 ...

  7. MySQL学习笔记(基础篇未完待补充)

    一.MySQL数据库基 目录 一.MySQL数据库基础篇 1.数据库概述与MySQL安装篇 第1章:数据库概述 1.为什么要使用数据库 2. 数据库与数据库管理系统 2.2 数据库与数据库管理系统的关 ...

  8. 分享:MySQL 学习笔记(三)

    四,锁的算法 我们先来看一下我们测试用的表,t2,这张表有一个主键索引.我们插入了 4 行数据,主键值分别是 1.4.7.10.为了让大家真正理解这三种行锁算法的区别,我们需要了解一下三种范围的概念. ...

  9. 阿里P8的《MySQL学习笔记》火了,完整版开放下载!

    伴找我要一些 MySQL基础资料,于是我翻箱倒柜,把这份阿里大牛总结的 MySQL 归纳笔记找出来,免费共享给大家! 据说有小伙伴靠这份笔记顺利进入 BAT 哦,所以一定要好好学习这份资料! 资料介绍 ...

最新文章

  1. websocket python爬虫_python实现基于websocket协议的网络爬虫
  2. python输入名字、输出欢迎你_python笔记3-输出输入、字符串格式化
  3. 初识Hibernate之关联映射(一)
  4. linux常用的内核镜像格式
  5. libsvm学习 all
  6. java项目嗖嗖移动业务大厅项目报告_晋江市撰写节能评估报告的报告机构立项范本-文瑞...
  7. java操作Excel之POI(3)
  8. Linux上搭建h2引擎加载h2文件
  9. ABAP Netweaver体内的那些寄生式编程语言
  10. 为什么C语言函数不能返回数组,却可以返回结构体?
  11. HTML5原生拖拽/拖放(drag drop)详解
  12. linux可以用dos命令是什么意思,Linux系统常用命令与DOS命令的类似之处和本质区别各是什么?...
  13. 你真的了解Python吗?这篇文章可以让你了解90%,赶紧收藏!
  14. Python练习:期末测评
  15. beta冲刺7-咸鱼
  16. idea拦截了html中的静态资源,IDEA配置静态资源热加载操作(Springboot修改静态资源不重启)...
  17. sql 复合键_SQL复合键
  18. arch模型的思路_ARCH模型介绍.ppt
  19. 用云服务器架设好服务器显示无法连接
  20. 概念:蓝筹主板创业板新三板科创板

热门文章

  1. .net core 使用阿波罗配置中心
  2. 5种常用的四轴飞行器PID算法讲解集合
  3. 在bug的边缘疯狂试探之mybatis
  4. 如何用手机在图片上标箭头_如何在手机上快速给图片做标记?
  5. 数据比赛资料(杂合)
  6. 蓝桥杯 ALGO-1003 礼物
  7. 注意力机制-多头注意力
  8. 牛牛的跳跳棋(贪心)
  9. 安卓获取手机唯一码工具类
  10. python头像教程_微信好友头像全家福详细教程python版