文章目录

  • MySQL相关函数
  • 字符串相关函数
  • 数学函数
  • 日期相关函数
  • 加密函数和系统函数
  • 流程控制函数
  • 查询加强
  • 分页查询
  • 多表查询
  • 自连接
  • 子查询
  • 单行子查询是指 返回一行数据的子查询语句
  • 多行子查询是指 返回多行数据的子查询 使用关键字 in
  • 子查询当作临时表使用
  • all操作符
  • any操作符
  • 多列子查询
  • 表复制
  • 合并查询
  • MySQL表外连接


MySQL相关函数

字符串相关函数

mysql怎么使用dual_mysql

数学函数

mysql怎么使用dual_mysql_02

日期相关函数

mysql怎么使用dual_MySQL_03


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 秒数,转成指定格式的日期

mysql怎么使用dual_mysql怎么使用dual_04


在实际开发中,我们也经常使用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开始计算

mysql怎么使用dual_mysql_05


总结:

如果select语句同时包含group by,having,limit,order by

那么他们的顺序是 group by,having,order by,limit

多表查询

mysql怎么使用dual_操作符_06


在进行多表查询的时候,查询的条件不能少于 表的个数-1,否则会出现笛卡尔集

自连接

指同一张表当作两张表来使用

mysql怎么使用dual_mysql_07


查询员工和他上级的名字

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

mysql怎么使用dual_操作符_08

子查询

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

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

mysql怎么使用dual_MySQL_09


mysql怎么使用dual_子查询_10

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

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

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

mysql怎么使用dual_mysql_11


mysql怎么使用dual_操作符_12

子查询当作临时表使用

mysql怎么使用dual_mysql_13

把子查询当作一张临时表

all操作符

显示工资比部门30的所有员工的工资高的员工的姓名,工资部门号

mysql怎么使用dual_操作符_14

any操作符

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

多列子查询

是指 子查询返回多个列数据

mysql怎么使用dual_操作符_15

子查询联系
例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`,,gread
       FROM stu LEFT JOIN exam
       ON  = ;
例1.列出部门名称和这些部门的员工信息(名字和工作),
    同时列出那些没有员工的部门名称

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

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