mysql-1-DQL查询

使用

关键字 说明
as 或 省略as 空格后加别名 取别名
distinct 去重
+ 只做数值加,有字符先尝试转换成数值再加,加null都等于null
in 子查询
group by 分组字段 分组
order by 排序字段 【asc/desc】 排序 asc=升序(默认) desc=倒序
having 条件 查询后的条件筛选,一般和group by 一起使用

where 后面要跟的是数据表里的字段,而having只是根据前面查询出来的是什么后面就可以接什么。

条件查询

一般在where后使用:

条件 运算符
条件运算符 < 、=、 != 、<>【表示不等于】、>= 、<=
逻辑运算符 && 、|| 、! 、and 、or、not
模糊查询 like 、between and、in 、is null或is not null
安全等于 <=> 即可判断null值也可以判断普通数值

常见函数

函数可以嵌套使用,一个函数的结果可以作为另一个函数的参数

单行函数

字符函数:

方法 说明
LENGTH(字段) 字段值字节长度
CONCAT(xx,xx,xx) 拼接,用逗号分隔
ISNULL(判断字段,空时取值) 判断是否为空
UPPER('xxx') 变大写
LOWER('xxx') 变小写
SUBSTR('xxx',索引) 截取索引及其后面的字符,myslq索引从1开始
SUBSTR('xxx',索引,索引2) 截取索引1到索引2的字符
INSTR('xxx','子串') 返回子串第一次出现的索引
TRIM('xxx') 去前后空格
TRIM('指定字符','xxx') 去前后指定字符
LPAD('xxx',number,'指定字符') 左填充,用指定字符填充字符串到指定长度
RPAD('xxx',number,'指定字符') 右填充,用指定字符填充字符串到指定长度
REPLACE('字符串','被替换值','替换值') 替换

数学函数:

方法 说明
ROUDN(number) 四舍五入
ROUDN(number,保留精度位数) 四舍五入
CEIL(number) 向上取整
FLOOR(number) 向下取整
TRUNCATE(number,保留位数) 截断,
MOD(num1,num2) 取余

日期函数:

NOW() 返回当前日期+时间
CURADTE() 返回当前日期
CURTIME() 返回当前时间
YEAR(日期 或 '年-月-日') 返回日期中的年份
MONTH(日期 或 '年-月-日') 返回日期中的月份
MONTHNAME(日期 或 '年-月-日') 返回日期中的月份(英文)
日、时、秒、分......
str_to_date() 将日期格式的字符转换成指定格式的日期 如:STR_TO_DATE('9-13-1999' , %m-%d-%Y') 1999-09-13
date_format() 将日期转换成字符 如:DATE_FORMAT('2018/6/6 ,%Y年%m月%d日') 2018年06月06日

其他函数:

方法 说明
VERSION() 版本
DATABASE() 当前数据库
USER() 当前用户

流程控制函数:
IF('表达式',成立返回结果,不成立返回结果) 判断
CASE

case 要新的字段或表达式
when 常量1 then 要显示的值1或语句1(这里如果是值就不用分号);   
when 常量2 then 要显示的值2或语句2;
...
else 要显示的值n或语句n;
end

分组函数

统计使用,又称聚合函数或统计函数或组函数

sum() 求和
avg() 平均值
max() 最大值
min() 最小值
count() 统计个数

sum、avg不支持字符串类型
以上分组函数都忽略null值
可以和distinct搭配  如:SUM(DISTINCT xxx)
和分组函数一同查询的字段要求是group by 后的字段

效率:
MYISAM存储引擎下,COUNT(*)的效率高
INNODB存储引擎下,COUNT(* )和COUNT(1)的效率差不多,比COUNT(字段)要高一些

连接查询

完全连接 如:select * from table1,table2; 笛卡尔积

分类:

按年代:

sq192标准:仅仅支持内连接
sq199标准(推荐):支持内、外(左外和右外)、交叉

按功能:

  • 内连接:inner

    • 等值连接: 多表查询通过某字段相等作为条件
    # 例1 
      SELECT e.last_name,e.job_id,j.job_title
      FROM employees e,jobs j
      WHERE e.`job_id` = j.`job_id`;
      
      # 例2
      SELECT e.last_name,e.job_id,j.job_title
      FROM employees e
      INNER JOIN jobs j ON e.`job_id` = j.`job_id`;
      
      可接多个INNER JOIN ... ON
    
    • 非等值连接:
      # 例1
      SELECT e.last_name,e.job_id,j.job_title
      FROM employees e,jobs j
      WHERE e.`job_id` 等号外其余条件判断 j.`job_id`;
    
    • 自连接:
      #案例:查询员工名和上级的名称
      SELECT e.employee_id,e.last_name,m.employee_id,m.last_name
      FROM employees e, employees m
      WHERE e.'manager_id' =m.'employee_id`;
    
  • 外连接:outer

    # 语法
    select 查询列表
    from 表1 别名 [连接类型] join 表2 别名 on 连接条件
    [where筛选条件]
    
    外连接查询结果=内连接结果+主表中有而从表没有的记录 没匹配的显示null
    
    • 左外连接:left [outer]
    左边是主表 左表全显示
    
    # 例:
    SELECT b.name, bo.*
    FROM beauty b
    LEFT OUTER JOIN boys bo
    ON b.'boyfriend_id' = bo.'id';
    
    • 右外连接:right [outer]
    右边是主表   右表全显示
    
    # 例:和上面左外效果一样
    SELECT b.name, bo.*
    FROM boys bo
    RIGHT OUTER JOIN beauty b
    ON b.'boyfriend_id' = bo.'id';
    
    • 全外连接:full [outer]
    左表全显示 右表全显示  即:左右表字段全显示,两表重合,该null的位置就null
    
  • 交叉连接:cross join

    笛卡尔乘积
    

可记:from后为左表,join后为右边

子查询

操作符 含义
IN、NOT IN 等于列表中的任意一个
ANY、SOME 和子查询返回的某一个值比较
ALL 和子查询返回的所有值比较
  • 行子查询
# 例:查询员工编号最小并且工资最高的员工信息
SELECT *
FROM employees
WHERE(empioyee_id,salary) = (
	SELECT MIN(employee_id), MAX(salary)
    FROM employees
)
  • select后子查询
# 例:查询每个都门的员工个数
SELECT d.*,(
    SELECT COUNT(*)
    FROM employees e
    WHEREe.department_id = d.'department_id'
)个数
FROM departments d;
    
select后面子查询只能返回一行一列
  • from后子查询
SELECT *
FROM(
	SELECT AVG(salary) avgsalary,dep_id
    FROM dep
    GROUP BY dep_id
) avg
WHERE avg.avgsalary > 5000;
  • exists后子查询
SELECT EXTSTS(
    SELECT employee_id 
    FRoM employees 
    WHERE salary=300000
);

分页查询

LIMIT 开始索引,显示条数

page:第几页
size:每页显示几条
分页公式:(page-1) * size
  • 查询关键字及执行先后顺序说明
执行顺序 关键字

7--select 查询列表
1--from 表 
2--[连接类型] join 表2
3--on 连接亲件
4--whee 筛选条件
5--group by 分组列表
6--having 分组的筛选
8--order by 排序列表
9--1imit 偏移,条自数

每一条字句都会生成一个虚拟表格

联合查询

union 联合,合并,将多条查询语句结果合并成一个结果

# 例:查询中国用户中男性的信息以及外国用户中男性的用户信息
SELECT id,cnam,csex FROM t_ca WHERE csex='男';
UNION
SELECT t_idy tName,tGender FROM t_ua WHERE tGender='male';

结果:
id cname csex
2  小李   男
1  john  male
3  jack  male

联合查询中多条查询列数需要一致
多条查询语句查询的每列类型和顺序最好一致
联合查询默认去重,要显示所有用:union all

posted @ 2021-01-28 00:19  小艾影  阅读(86)  评论(0编辑  收藏  举报