zoukankan      html  css  js  c++  java
  • 数据库查询

    数据库查询

    增删改查

    insert into 表名  (column1, column2) values (value1,value2)
    

    delete from 表名  where  条件
    

    update 表名 set column1=value1, column2=value2  where 条件
    

    select * from 表名
    

    查询语句

    通配符:
    	%		匹配0个或任意多个字符
    	_		下划线, 匹配一个字符
    	=		精准匹配
    	like	模糊匹配
    	regexp	使用正则表达式来匹配
    
    排序:
    	order by  排序,默认升序
    	order by  字段  asc		升序排序
    	order by  字段  desc 		降序排序
    
    其他:
    	group by	聚合
    	having		对结果筛选 
    	distinct	去除重复的行
    	limit		限制
    	
    聚合函数:
    	count 	计数
    	sum		求和
    	max		求最大值
    	min		求最小值
    	avg		求平均值
    where语句没法与聚合函数同时使用。 可以使用having 对结果进行筛选
    	
    比较运算符:
    	> , < , = , !=  
    	或者 <>, >= , <=
    	
    	in (values1, values2....)
    	between v1 and v2  在v1 到 v2 直接(包含v1,v2)
    

    1. between A and B 用法

    查询是否在 A - B 之间, 包含A B

    # 1. 取值3000-5000 之间的值
    select  * from  emp  where  sal>=3000 and sal <=5000;
    
    # 2. 取值3000-5000 之间的值
    select * from emp  where sal between 3000 and 5000;
    
    # 3. 不在3000与5000之间的值
    select * from emp where sal not between 3000 and 5000
    

    2. 基本查询语句

    select 基本查询

    # 查询 emp 表中 所有数据
    select * from  emp;
    select empno, ename from emp;  # 查询指定列
    select empno 工号, ename 姓名, job 工作, sal 工资 from emp;  给列别名增加可读性
    

    3. 正则使用

    查询中的正则 regexp 使用正则表达式来匹配

    # 使用正则关键字
    # 查询name 以a 开头的人的所有信息
    select * from emp  where name regexp '^a';
    

    4. 逻辑运算

    # 逻辑运算   and  (&&)  |  or  (||)       |  not 
    #      两个条件同时满足  |  满足其中一个条件 |   一个都不满足(取反)
    
    select * from  t1 where  math >=60  and english >=60 ;   # 同时满足两个条件
    select * from  t1 where  math >=60  or  english >=60	 #  满足其中一个就行
    select * from  t1 where  math >=60  and  not english >= 60;  # and 两个同时满足,后面not 取反 english <60
    

    5. 排序

    # 关键字 order by      asc (默认升序)  |     desc (降序)
    
    select * from emp order by deptno;    # 关键字后面跟需要排序的 字段
    select * from emp order by deptno  asc ; # 按照deptno 列升序排序 (默认)
    select * from emp order by deptno  desc;  # 按照deptno 列降序排序
    
    

    6. 去重

    关键字 destinct

    # 关键字  destinct
    select distinct deptno from  emp;   
    select distinct(deptno) from emp ;  # 这样好像也可以
    
    

    7. group by 分组 和 having

    group by 根据给定数列的每个成员对查询结果进行分组统计,最终得到一个分组汇总表。

    注: 一般情况下group 需要与统计函数(聚合函数)一起使用才有意义

    • max 最大值
    • min 最小值
    • sum 求总数和
    • avg 求平均值
    • count 求总行数
    查找每个部门的最高工资:
    select deptno,max(sal) from emp group by deptno;
    
    # 查找每个部门最高工资和最高工资人数
    select deptno,max(sal),count(*) from emp group by deptno;
    
    # 查找部门在 10,20 中对 部门分组, 查最高工资,和最高工资人数
    select deptno, max(sal),count(*) from emp where deptno in (10,20) group by deptno;
    
    # 分组后面没法跟where语句, having对结果进行筛选
    select deptno,max(sal),count(*) from emp group by deptno having count(*)>5;
    
    # 查找工资加提成大于2000的人 信息
    select empno,ename,sal+ifnull(comm,0) sum from emp having sum >2000;
    
    

    总结:
    having 与where区别:
    1、having与where类似,根据条件对数据进行过滤筛选
    2、where针对表中的列发挥作用,查询数据
    3、having对查询结果中的列发挥作用,筛选数据

    多表查询

    表的连接 : 纵向连接、内连接、左连接、右连接

    • left join 左连接
    • right join 右连接
    • inner join 内连接
    • union 纵向连接, 合并
    常规表查询:
    查询表中所有字段
    select * from emp, dept where emp.deptno=dept.deptno;
    查询某个字段
    select dept.deptno,dept.dname, emp.ename,emp.job from emp,dept where emp.deptno=dept.deptno;
    
    
    

    表的连接:纵向连接/内连接/左连接/有链接


    左连接 left join

    # 左连接 【以左表为标准连接右表】
    select emp.ename, emp.job,dept.deptno from dept left join emp on emp.deptno=dept.deptno;
    

    右连接 right join

    # 右连接 【以右表为标准连接左表】
    select emp.ename,emp.job,dept.deptno from dept right join emp on emp.deptno-dept.deptno;
    

    内连接: inner join

    # 内连接:取多表之间的交集
    select emp.ename, emp.job, dept.deptno from emp inner join dept on emp.deptno=dept.deptno;
    

    纵向连接,合并 union

    # 表结构相同。  不相同,可以伪造相同
    select name,math, english , "" as "chinese" from t2 union select name,math,english ,chinese from t3;
    

    例题:

    查询英语前三名

    select * from t3 order by english desc limit 3;
    

    查询总分,以降序排列

    select * , math + english + chinese  as total  from t3  order by total desc ;
    

    查询总分第一名

    select * ,math +english+chinese as total from t3 order by total desc limit 1;
    

    查询英语最高分的姓名及分数

    select  name,english from t3 order by  english desc limit 1;
    

    查询总成绩的平均分第一名:

    select * ,  (math+english + chinese )/3 as avg from t3 order by avg desc  limit 1;
    
  • 相关阅读:
    微信端支付
    flex布局
    最近的一些计划
    工作中遇到的一些小问题
    获取url参数
    localStorage中使用json
    倒计时函数(单个和多条)
    刚进入页面强制刷新
    [模板][倍增] ST算法 RMQ 区间中最大得值
    [思维]奇数码问题
  • 原文地址:https://www.cnblogs.com/aaak/p/15251370.html
Copyright © 2011-2022 走看看