zoukankan      html  css  js  c++  java
  • python学习第37天

    一. 单表查询

    sql:查询语句的完整语法

    select .. from .. where .. group by .. having .. order by .. limit ..

    (1)where条件的使用

    功能: 对表中的数据进行筛选和过滤

    语法:

    	1.判断的符号:
    	= > >= < <= != <> 不等于
    	2.拼接条件的关键字
    	and or not
    	3.查询的区间范围值 between
    	between  小值  and 大值 [小值,大值] 查询两者之间这个范围内所有数据
    	4.查询具体某个值的范围 in
    	in(1,2,3) 指定范围
    	5.模糊查询 like "%" "_" 通配符
    		like "%a"  匹配以a结尾的任意长度的字符串
    		like "a%"  匹配以a开头的任意长度的字符串
    		like "%a%" 匹配含有a字母的任意长度的字符串
    		like "_a"  个数一共2个字符,必须以a结尾,前面的字符随意
    		like "a__" 个数一共3个字符,必须以a开头,后面的字符随意
    
    # (1) 单条件的查询
    # 查询部门是sale的所有员工姓名:
    select emp_name from employee where post = "sale";
    
    # (2) 多条件的查询
    # 部门是teacher , 收入大于10000的所有数据
    select * from employee where post="teacher" and salary > 10000;
    
    # (3) 关键字 between .. and ..
    # 收入在1万到2万之间的所有员工姓名和收入
    select emp_name,salary from employee where salary between 10000 and 20000;
    # 收入不在1万到2万之间的所有员工姓名和收入
    select emp_name,salary from employee where salary not between 10000 and 20000;
    
    # (4) null 关键字 在查询的时候,要用is进行判定,不要用=
    # 查询post_comment 是空的所有数据
    select * from employee where post_comment = null;
    select * from employee where post_comment = '';
    select * from employee where post_comment is null;
    select * from employee where post_comment is not null;
    
    update employee set post_comment = "" where id = 1
    select * from employee where post_comment = "";	
    
    # (5) 关键字 in 在..之中 查询
    # 查询收入是3000 ,4000 ,5000,8300 所有员工的姓名和收入
    select emp_name,salary from employee where salary=3000 or salary=4000 or salary=5000 or salary=8300;
    # 用in优化,在小括号里面具体指定某个值
    select emp_name,salary from employee where salary in (3000,4000,5000,8300);
    # 不在 not in ..
    select emp_name,salary from employee where salary not in (3000,4000,5000,8300);
    
    # (6) 模糊查询 like "%" "_" 通配符
    # (1) "%" 通配符  以on结尾的员工名搜一下
    select emp_name,age,post from employee where emp_name like "%on";
    # (2) "_" 通配符 可以限定具体的长度
    select emp_name,age,post from employee where emp_name like "a_e_";
    
    # (7) concat (as 起别名)
    select concat("姓名:",emp_name,"工资:",salary) as aa from employee;
    # concat_ws(拼接的符号,参数1,参数2,参数3 ... )
    select concat_ws(" : ",emp_name,salary) as bb from employee;
    # 计算年薪 可以在mysql中使用四则运算符(+ - * /)
    select concat_ws(" : ",emp_name,salary * 12) as cc from employee;
    

    (2)group by

    分组分类

    group by 字段 对数据进行分类 , by后面接什么字段,select就搜索什么字段

    select sex from employee group by sex;
    select post from employee group by post;
    
    # group_concat 按照分类的形式进行字段的拼接
    select group_concat(emp_name),post from employee where id >5  group by post;
    

    聚合函数

    	# count 统计总数 *所有
    	select count(*) from employee;
    	# max 统计最大值
    	select max(salary) from employee;
    	# min 统计最小值
    	select min(salary) from employee;
    	# avg 统计平均值
    	select avg(salary) from employee;
    	# sum 统计总和
    	select sum(salary) from employee
    

    一般情况下 分组 + 聚合函数 配合使用

    # 1. 查询部门名以及各部门的平均薪资
    select post,avg(salary) from employee group by post;		
    # 2. 查询部门名以及各部门的最高薪资
    select post,max(salary) from employee group by post;
    # 3. 查询部门名以及各部门的最低薪资
    select post,min(salary) from employee group by post;
    # 4. 查询公司内男员工和女员工的个数
    select sex , count(*) from employee group by sex;
    # 5. 查询部门名以及部门包含的所有员工名字
    select group_concat(emp_name) from employee group by post
    # 可以group by 两个字段,即可搜索两个字段
    select  emp_name , post from employee  group by post ,emp_name ;
    

    (3) having

    数据在分类分组之后,进行二次数据过滤,一般是配合group by 使用,分组之后在过滤

    # 找出各部门平均薪资, 并且大于10000以上的所有部门
    select post , avg(salary) from employee group by post having  avg(salary) > 10000;
    
    # 1.查询各岗位内包含的员工个数小于2的岗位名、查询岗位内包含员工名字、个数
    select post ,group_concat(emp_name),count(*) from employee group by post having count(*) < 2
    
    # 2.查询各岗位平均薪资小于10000的岗位名、平均工资
    select post,avg(salary) from employee  group by post having avg(salary) < 10000;
    
    # 3.查询各岗位平均薪资大于10000且小于20000的岗位名、平均工资
    select post,avg(salary) from employee group by post having avg(salary) between 10000  and 20000;# between 10000 和 20000本身这个值可以取到
    select post,avg(salary) from employee group by post having avg(salary) > 10000  and avg(salary) < 20000;
    

    (4)order by

    排序 , 按照什么字段进行排序

    # asc  升序: 从小到大 (默认)
    # desc 降序: 从大到小
    

    (5)limit 限制查询条数 (数据分页)

    limit m,n m代表从第几条数据查询,n代表查询几条, m=0 代表的是第一条

    (6)(了解)可以使用正则表达式查询数据 (不推荐使用,效率不高)

    select * from employee where emp_name regexp ".*on$" # .*? 问号?不识别
    select * from employee where emp_name regexp "^程";
    select * from employee where emp_name regexp "^程.*金";
    

    二. 多表查询

    内连接: (内联查询 inner join ) -> 两表或者多表满足条件的所有数据查询出来(两表之间共有的数据)

    # 两表查询
    select 字段 from 表1 inner join 表2 on 必要的关联条件
    # 多表查询
    select 字段 from 表1 inner join 表2 on 必要的关联条件1 inner join 表3 on 必要的关联条件2 ... 
    
    # 基本语法 inner join on .. on后面接必要的关联条件
    select * from employee inner join department on employee.dep_id = department.id;
    # 用as 起别名 (推荐)
    select * from employee as e inner join department as d on e.dep_id = d.id;
    # as 可以省略掉
    select * from employee e inner join department d on e.dep_id = d.id;
    
    # where 默认实现的就是内联查询的效果
    select * from employee , department where employee.dep_id = department.id;
    select * from employee as e , department as d where e.dep_id = d.id; 外连接
    

    外连接

    #(1) 左连接(左联查询 left join) 以左表为主,右表为辅,完整查询左表所有数据,右表没有的数据补null
    select * from employee left join  department on employee.dep_id = department.id;
    #(2) 右链接(右联查询 right join)以右表为主,左表为辅,完整查询右表所有数据,左表没有的数据补null
    select * from employee right join  department on employee.dep_id = department.id;
    #(3) 全连接(全连接 union) 所有的数据都合并起来
    select * from employee1 left join  department on employee1.dep_id = department.id
    union
    select * from employee1 right join  department on employee1.dep_id = department.id;
    

    三.子查询

    嵌套查询

    (1)sql语句当中又嵌套了另外一条sql语句,用括号()包起来,表达一个整体
    (2)一般应用在from 子句后面表达一张表, where子句后面表达一个条件
    (3)查询速度从快到慢 : 单表查询 -> 联表查询 -> 子查询
  • 相关阅读:
    D. Longest Subsequence
    线段树入门HDU_1754
    poj_2503(map映射)
    HDU_4826
    poj_2251
    day 44 单表查询,多表查询
    day43 字段的修改、添加和删除,多表关系(外键),单表详细操作(增删改查)
    day 42 数据库的配置、数据库与表的一些剩余操作、用户操作、数据库表的引擎、数据库的模式、mysql支持的数据类型、约束
    day41 数据库介绍、数据库基本操作
    day 40 线程队列、线程定时器、进程池和线程池、同步与异步、用多线程来写socket服务端与客户端
  • 原文地址:https://www.cnblogs.com/yunchao-520/p/13160707.html
Copyright © 2011-2022 走看看