初识MySQL(二)

MySQL相关函数

字符串相关函数

请添加图片描述

数学函数

请添加图片描述

日期相关函数

请添加图片描述
1.DATE_ADD() 中的 interval 后面可以是 year minute second day 等
2.DATE_SUB() 中的 interval 后面可以是year minute second hour day等
3.DATEDIFF(date1,date2)得到的是天数,而且是date1-date2的天数,可以取负
4.(还有DATE())这四个日期函数的日期类型可以是date,daterime或者timestampTIMEDDIFF('10:11:11','06:10:10') FROM DUAL;

--返回的是1970-1-1到现在的秒数
unix_timestamp() from dual;

-- %Y-%m-%d 格式是规定好的,表示年月日
-- %Y-%m-%d %H:%i:s格式是规定好的,表示年月日
form_unixtime() 可以把一个unix_timestamp 秒数,转成指定格式的日期

请添加图片描述
在实际开发中,我们也经常使用int来保存一个unix时间戳
然后用from_unixtime()进行转换

加密函数和系统函数

SELECT USER() FROM DUAL;–可以查看登录到MySQL的有哪些用户,以及登录的IP
SELECT DATABASE() FROM DUAL;–查询当前使用数据库名称
MD5(str) 为字符串算出一个MD5 32的字符串,常用于用户密码加密
PASSWORD(str)–加密函数

流程控制函数

IF(expr1,expr2,expr3) 如果expr1为True,返回expr2 否则返回expr3
IFNULL(如果expr1不为NULL,则返回expr1 否则返回expr2)
SELECT CASE WHEN expr1 THEN expr2
WHEN expr3 THEN expr4
ELSE expr5
END;
如果expr1为TRUE,则返回exor2,如果expr3为true,返回expr4,否则expr5

查询加强

在MySQL中,日期类型可以直接比较,需注意格式

select * from emp
 where '1992-01-01' < hiredata;

查询第三个字符为O的

select * from emp
  where name like '--O%';
分页查询

基本语法
select … limit start,rows
表示从start + 1 行开始取出rows行,start 从0开始计算
在这里插入图片描述
总结:
如果select语句同时包含group by,having,limit,order by
那么他们的顺序是 group by,having,order by,limit

多表查询

在这里插入图片描述
在进行多表查询的时候,查询的条件不能少于 表的个数-1,否则会出现笛卡尔集

自连接

指同一张表当作两张表来使用
请添加图片描述
查询员工和他上级的名字

SELECT worker.ename AS '职员名', boss.ename AS '上级名'
       FROM emp worker,emp boos       --自连接 别名
       WHERE worker.mgr = boss.empno;

在这里插入图片描述

子查询

子查询是指 嵌入在其他sql语句中的select语句,也叫嵌套查询

单行子查询是指 返回一行数据的子查询语句

在这里插入图片描述
在这里插入图片描述

多行子查询是指 返回多行数据的子查询 使用关键字 in

查询和号部门的工作相同的雇员的
名字,岗位,工资,部门号,但是不包含部门自己的雇员

1.查询号部门有哪些工作
2.把上面查询的结果当作子查询

在这里插入图片描述
在这里插入图片描述

子查询当作临时表使用

在这里插入图片描述

把子查询当作一张临时表

all操作符

显示工资比部门30的所有员工的工资高的员工的姓名,工资部门号
在这里插入图片描述

any操作符

显示工资比部门30的其中一个员工的工资高的员工的姓名,工资部门号
同上

多列子查询

是指 子查询返回多个列数据
在这里插入图片描述

子查询联系
例1.查询本部门中工资大于本部门平均工资的所有员工的资料
1.
select deptno , AVG(sal) AS avg_sal
       from emp
            group by deptno
2.
select * 
     from emp,(
     select deptno , AVG(sal) AS avg_sal
       from emp
            group by deptno
     ) temp
     where emp.deptno = temp.deptnp AND emp.sal > temp.avg_sal;2.查找每个部门工资最高的人的详细信息
1.
select MAX(sal) 
    from emp
         group by deptno
2.
select * from emp,(
        select deptno ,MAX(sal) AS max_sal 
            from emp
              group by deptno 
        ) temp
        where emp.deptno = temp.deptno AND emp.sal = temp.max_sal;3.查询每个部门的信息和人员数量
1.各部门的信息 (部门名,编号,地址)来自 dept表
2.各个部门的人员数量 -> 构建一个临时表
select count(*),deptno
      FROM emp
      GROUP BY deptno;

select dname,dept.deptno,loc,temp.person_num AS '人数'
       FROM dept,(
            select count(*) AS person_num,deptno
            FROM emp
            GROUP BY deptno;
       ) temp
       WHERE dept.deptno = temp.deptno;
还有一种写法 表.*表示将该表所有列都显示出来 简化sql语句
在多表查询中,当多个表的列不重复时,才可以直接写出列名
select temp.*,dname,loc
       FROM dept,(
            select count(*) AS person_num,deptno
            FROM emp
            GROUP BY deptno;
       ) temp
       WHERE dept.deptno = temp.deptno;
表复制

自我复制数据(蠕虫复制)
为了对某个sql语句进行效率测试,我们需要白亮数据时,可以使用此法为表创建海量数据

表复制
CREATE TABLE my_tab01(
      id INT,
      `name` VARCHAR(32),
      sal DOUBLE,
      job VARCHAR(32),
      deptno INT);

自我复制
1.把emp表复制到my_tab01
INSERT INTO my_table01
         (id,`name`,sal,job,deptno)
         SELECT empno,ename,sal,job,deptno FROM emp;
2.自我复制
INSERT INTO my_tab01
         SELECT * FROM my_tab01;

如何删除掉一张表重复记录
1.先创建一张表 my_tab02,
2.让my_tab02有重复记录

CREATE TABLE my_tab02 LIKE emp;  -- 这个语句 把temp表的结构(列),复制到my_tab02
3.去重
思路
(1)创建一张临时表 my_temp,该表结构与my_tab02一样
(2)把my_temp的记录通过distinct关键字处理后复制到my_temp
(3)清除掉my_tab02的记录
(4)把my_temp表的记录复制到my_tab02
(5)drop 掉临时表

(1)CREATE TABLE my_temp LIKE my_tab02;
(2)INSERT INTO my_temp
          SELECT distinct * FROM my_tab02;
(3)DELETE FROM my_tab02;
(4)INSERT INTO my_tab02
          SELECT * from my_temp;
(5)DROP TABLE my_temp;
合并查询

合并多个select语句的结果,可以使用集合操作符号

1.union all
该操作符用于取得两个结果集的并集。当使用该操作符时,不会取消重复行
2.union 
会去重

MySQL表外连接

左外连接(如果左侧的表完全显示就是左外连接,左边的表与右边的表没有匹配记录,左边的表也会完全显示出来)
基本语法select..from table_name1 left join table_name2 on 条件

右外连接(如果右侧的表完全显示就是右外连接)

//使用左外连接显示所人的成绩,如果没有成绩,也要显示其信息为NULL
CREATE TABLE stu(
    name varchar(20),
    id int
    );
INSERT INTO stu
       VALUES('jack',1),('tom',2),('nono',3),('kiki',4);
CREATE TABLE exam(
     id INT,
     gread INT
);
INSERT INTO exam
       VALUES(1,56),(2,76),(11,8)
SELECT `name`,stu.id,gread
       FROM stu LEFT JOIN exam
       ON stu.id = exam.id;1.列出部门名称和这些部门的员工信息(名字和工作),
    同时列出那些没有员工的部门名称

SELECT deptno,ename,job
       from emp RIGHT JOIN dept
       ON emp.deptno = dept.deptno;
       

小结:在实际开发中,我们绝大多数情况下使用的是 前面学过的连接

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值