zoukankan      html  css  js  c++  java
  • 数据操作-对数据的增删改查-单表查询和多表查询

    补漏:mysql> select id from course where cname = '物理'; 这个得出来的结果显示是一个表,其实是mysql为了显示好看设计出来的,
    结果就是一个数据类型,比如id就是一个整型。


    1.上课笔记

    today my level is one

    difficult knowledge

    1.only_full_group_by
    sql语句不区分大小写
    对数据操作
    1.增删改
    方法:查询记录当作结果传入新表
    权限操作
    select * from tableG 逐行显示
    Host:% 所有的ip都行,代表账号可以在任意的主机上都能链接
    2.单表查询(*******)
    完整语法(语法级别关键字顺序)
    select distinct 。。。 from tables
    where整体筛选
    group by查询出来的结果按照规定分类
    having分完组过滤(分类后筛选) ==》运行distinct
    order by 排序的字段
    limit 限制显示的条数
    去重是针对一个字段
    表头 as改表头名字
    concat('年龄:',name,'姓名:',name)***
    concat_ws(':',name,age) name和age之间用:拼接起来

    between 10 and 15 包含10和15
    where没有明确条件
    分组之后才能用聚合函数
    select max(age) from emp;可以使用max(),因为没有where,默认为True,自动成一组
    group by


     1、跟权限有关的几张表
    user->db->table_priv->columns_priv

     2、只创建账号
    create user tom@"客户端的ip" identified by "123";
    create user tom@"192.168.15.%" identified by "123";
    create user tom@"%" identified by "123";

    客户端:192.168.15.13 服务端:192.168.15.90

    create user tom@"192.168.15.13 " identified by "123";
    mysql -utom -p"123" -h 192.168.15.90 -P 3306

     3、创建账号并且授权(只有root账号才能为其他账号授权grant)
     *.* ===> mysql.user
    grant all on *.* to "tom"@"192.168.15.90" identified by "123";#all代表除了grant以外的所有权限

     db1.* ===> mysql.db
    grant all on db1.* to "jack"@"192.168.15.90" identified by "123";#all代表除了grant以外的所有权限

     db1.t1 ===> mysql.tables_priv
    grant all on db1.t1 to "rose"@"192.168.15.90" identified by "123";#all代表除了grant以外的所有权限

     db1.t1(id) ===> mysql.columns_priv
    grant select(id),update(name) on db1.t1 to "lili"@"192.168.15.90" identified by "123";


     修改完权限一定要
    flush privileges;


    drop user "tom"@"192.168.15.90";
    drop user "jack"@"192.168.15.90";
    drop user "rose"@"192.168.15.90";
    drop user "lili"@"192.168.15.90";
    flush privileges;

    1、完整语法(语法级别关键字的排列顺序如下)
    select distinct 字段1,字段2,字段3,... from 库名.表名
    where 约束条件
    group by 分组依据
    having 过滤条件
    order by 排序的字段
    limit 限制显示的条数
    ;
     必须要有的关键字如下:
    select * from t1;


     关键字执行的优先级
    from
    where
    group by
    having
    distinct
    order by
    limit


    def from():
    pass

    def where():
    pass

    def group():
    pass

    def having():
    pass

    def distinct():
    pass

    def order():
    pass

    def limit():
    pass

    def select():
    f=from()
    res1=where(f)
    res2=group(res1)
    res3=having(res2)
    res4=distinct(res3)
    res5=order(res4)
    limit(res5)

     


    1、简单查询
    select * from t1;
    select id,name,sex from t1;
    select distinct post from emp;
    select name,salary*12 as annual_salary from emp;

    select concat('名字: ',name) as new_name,concat("年龄: ",age) as new_age from emp;
    select concat(name,":",age) from emp;

    select concat(name,":",age,":",sex) from emp;
    select concat_ws(":",name,age,sex) as info from emp;


    SELECT
    (
    CASE
    WHEN NAME = 'egon' THEN
    NAME
    WHEN NAME = 'alex' THEN
    CONCAT(name,'_BIGSB')
    ELSE
    concat(NAME, 'SB')
    END
    ) as new_name
    FROM
    emp;

    2、where
    select * from emp where id >= 10 and id <=15; # 等同于select * from emp where id between 10 and 15;
    select * from emp where id = 6 or id = 9 or id = 12; # 等同于select * from emp where id in (6,9,12);

    _代表任意单个字符
    %代表任意无穷个字符
    select * from emp where name like "__";
    select * from emp where name like "jin%";
    select * from emp where id not in (6,9,12);
    select * from emp where id not between 10 and 15;


    3、group by分组
     什么分组:按照所有记录相同的部分进行归类,一定区分度低的字段
     为何要分组:当我们要以组为单位进行统计时就必须分组,分组的目的是为了以组为单位进行统计的,再去考虑单条记录毫无意义


     set global sql_mode="strict_trans_tables,only_full_group_by";
     注意:分组之后,只能查到分组的字段以及组内多条记录聚合的成果

    select * from emp group by post;

     聚合函数
    max
    min
    avg
    sum
    count


    select post,count(id) from emp group by post;
    select post,max(salary) from emp group by post;
    select post,avg(salary) from emp group by post;
    select sex,count(sex) from emp group by sex;

     统计出每个部门年龄30以上的员工的平均薪资
    select post,avg(salary) from emp where age >= 30 group by post;

     注意:分组是在where之后发生的
    mysql> select * from emp where max(salary) > 3000;
    ERROR 1111 (HY000): Invalid use of group function

     group_concat
    select post,group_concat(name,':',age) from emp group by post;

     4、having 过滤条件

     where是在分组之前的过滤,即在分组之前做了一次整体性的筛选
    having是在分组之后的过滤,即在分组之后专门针对聚合的结果进行进一步的筛选

    select post,avg(salary) from emp group by post having avg(salary) > 10000;
    select post,avg(salary) from emp group by post ;

    5、order by排序

    select * from emp order by age asc; # 默认asc升序-》从小到大
    select * from emp order by age desc;# desc降序-》从大到小

    select * from emp order by age asc,salary desc; # 先按照age升序排列,如果age相同则按照salary降序排

    select post,avg(salary) from emp group by post order by avg(salary);

    6、limit 限制显示的条件
    select * from emp limit 3;

    薪资最高那个人的详细信息
    select * from emp order by salary desc limit 1;

    分页显示
    select * from emp limit 0,5; # 从0开始往后取5条
    select * from emp limit 5,5; #从5开始往后取5条

    正则表达式
    select * from emp where name regexp "^jin.*(g|n)$";

    多表查询
    1、笛卡儿积
    select * from emp,dep;

    select * from emp,dep where emp.dep_id = dep.id;

    select * from emp,dep where emp.dep_id = dep.id and dep.name = "技术";

    2、内连接:只取两张表有对应关系的记录
    select * from emp inner join dep on emp.dep_id = dep.id;
    select * from emp inner join dep on emp.dep_id = dep.id
    where dep.name = "技术";


    3、左连接: 在内连接的基础上保留左表没有对应关系的记录
    select * from emp left join dep on emp.dep_id = dep.id;

    4、右连接: 在内连接的基础上保留右表没有对应关系的记录
    select * from emp right join dep on emp.dep_id = dep.id;

    5、全连接:在内连接的基础上保留左、右面表没有对应关系的的记录
    select * from emp left join dep on emp.dep_id = dep.id
    union
    select * from emp right join dep on emp.dep_id = dep.id;

    子查询
    子查询:就是将一个查询语句的结果用括号括起来当作另外一个查询语句的条件去用


    select * from emp where dep_id in (select id from dep where name = "技术" or name = "人力资源");


    每个部门最新入职的员工
    select t1.id,t1.name,t1.hire_date,t1.post,t2.* from emp as t1
    inner join
    (select post,max(hire_date) as max_date from emp group by post) as t2
    on t1.post = t2.post
    where t1.hire_date = t2.max_date
    ;

    select * from emp inner join dep on emp.dep_id = dep.id;

     

  • 相关阅读:
    使用NPOI导入导出标准Excel
    winform ListView应用之分组、重绘图标、网格线
    在网页中显示CHM
    动态表单(javascript实现)
    批量上传文件时,js验证文件名不能相同
    IE开发人员工具无法使用
    卸载方法 gnu grub version 0.97
    VS.Net 2003/VC6.0常用快捷键集合
    SQL SERVER 与ACCESS、EXCEL的数据转换
    通用获取父节点/子节点/子节点下所有节点ID的存储过程
  • 原文地址:https://www.cnblogs.com/Roc-Atlantis/p/9356686.html
Copyright © 2011-2022 走看看