zoukankan      html  css  js  c++  java
  • day41.txt

    修改表:这里首先要提到的是Mysql对大小写是不敏感的,也就是说在sql语句中大小写没有什么明确的界限

    修改表有以下几个操作:
    修改表名:alter table 表名 rename 新表名;
    增加字段:alter table 表名 add 字段名 字段类型(宽度) 约束条件;
    删除字段:alter table 表名 drop 字段名;
    修改字段:alter table 表名 change 旧字段名 新字段名 字段类型(宽度) 约束条件;

    复制表:我们通过查询或者筛选的得到的结果也是一张表,只不过我们没办法在文件中找到它,他是一张虚拟表(这个知识点很重要,是后面查询的 基础)

    create table 表名 select * from 旧表(不能复制主键 外键)


    查询表:为什么把这个知识点单独拿出来呢,因为我们对数据库做的最多的操作就是查询,是的你没有听错,无论是我们编写的应用程序还是对数据 库的操作查询永远是我们的主流操作,下面我们就来接触一下查询表操作。

    为了方便我在这里为大家提供一个已经写好的数据库建库以及添加数据语句

    create table emp(
    id int not null unique auto_increment,
    name varchar(20) not null,
    sex enum('male','female') not null default 'male', #大部分是男的
    age int(3) unsigned not null default 28,
    hire_date date not null,
    post varchar(50),
    post_comment varchar(100),
    salary double(15,2),
    office int, #一个部门一个屋子
    depart_id int
    );

    #插入记录
    #三个部门:教学,销售,运营
    insert into emp(name,sex,age,hire_date,post,salary,office,depart_id) values
    #以下是教学部
    ('tom','male',78,'20150302','teacher',1000000.31,401,1),
    ('jenny','male',18,'19000301','teacher',30000,401,1),
    ('sank','male',48,'20101111','teacher',10000,401,1),
    #以下是销售部门
    ('哈哈','female',48,'20150311','sale',3000.13,402,2),
    ('呵呵','female',38,'20101101','sale',2000.35,402,2),
    #以下是运营部门
    ('程咬金','male',18,'19970312','operation',20000,403,3),
    ('程咬银','female',18,'20130311','operation',19000,403,3),

    当表的字段特别多显示杂乱的时候可以使用G分行展示,在语句的结尾加上即可。

    首先我们来想一下我们之前在介绍的时候我们使用的语句是怎样的结构

    select id,name from emp where id > 3 这条语句的意思是查找emp表中id大于三的数据的id name 两个字段

    纳闷根据对上面语句的翻译我们可以得出语句中关键字的执行顺序,即from->where->select 顺序

    where筛选条件:是对整体数据的一个筛选
    exp:查询id大于3小于6的数据
    select * from emp where id between 3 and 6;
    查询薪资是20000或者18000或者17000的数据
    select * from emp where salary in (20000,18000,17000);
    查询员工姓名中包含字母o的员工的姓名和薪资
    select name ,salary from emp where name like "%o%";
    (在这里插入一个小知识点即模糊查找like,"_"匹配任意单个字符,"%"匹配任意多个字符)
    sql语句是允许进行数学意义上的与或非运算的,大家可以自己尝试一下使用语句查询。

    group by分组:我们通过一个需求来引入这个概念,例如我们现在需要每个部门的平均薪资,每个部门的男女比例,男性朋友们的工资最高值,通过 这些要求我们发现我们所需要的数据即在这个表中,也脱离了这个表能够搜索的范畴,因此我们需要对原表进行分组。

    按照部门分组:select * from emp group by post;
    值得一提的是分组之后 最小可操作单位应该是组 还不再是组内的单个数据
    上述命令在你没有设置严格模式的时候是可正常执行的 返回的是分组之后 每个组的第一条数据 但是这不符合分组的规范:分组之后不应该考虑单个数据 而应该以组为操作单位(分组之后 没办法直接获取组内单个数据)
    如果设置了严格模式 那么上述命令会直接报错

    接下来我们结合我们的需求得到了我们什么时候需要分组,当遇到每个 平均 最高 最低 等关键字的时候,我们就要做好分组的准备了。
    同时分组之后我们对组内数据的操作是可以使用聚合函数的,max min sum count avg等。

    1.获取每个部门的最高薪资
    select post,max(salary)from emp group by post;
    2.获取每个部门的最低薪资
    select post,min(salary)from emp group by post;
    3.获取每个部门的平均薪资
    select post,avg(salary) from emp group by post;
    4.查询分组之后的部门名称和每个部门下所有的员工姓名,并且将名字改为原名+大帅比(dsb)的形式
    select post,group_concat(name,'_DSB') from emp group by post;
    在有group by的查询语句中,select指定的字段要么就包含在group by语句的后面,作为分组的依据,要么就包含在聚合函数中。
    group_concat不单单可以支持你获取分组之后的其他字段值 还支持拼接操作

    分组需要注意的事项:
    我们已经对分组有了一定的了解了,接下来我们来看一下需要我们注意的事。
    关键字where和group by同时出现的时候group by必须在where的后面
    where先对整体数据进行过滤之后再分组操作
    where筛选条件不能使用聚合函数

    查询每个部门所有年纪大于30的所有人的薪资平均值
    select post,avg(salary) from emp where age>30 group by post;

    having方法:having的语法根where是一致的只不过having是在分组之后进行的过滤操作即having是可以直接使用聚合函数的。
    select post,avg(salary) from emp
    where age>30
    group by post
    having avg(salary) > 10000
    ;


    distinct去重:去重的两条数据必须完全一致完全一致完全一致。为什么会强调多次完全一致呢,大家不要忽视了主键,即使两个数据所有内容都一致,但是主键肯定不同,所以一般情况下不存在完全一致的两条数据。
    而我们一般是不会去直接使用sql语句,而是会使用别人封装好的方法。
    ORM 对象关系映射 让不懂SQL语句的人也能够非常牛逼的操作数据库
    表 类
    一条条的数据 对象
    字段对应的值 对象的属性

    你再写类 就意味着在创建表
    用类生成对象 就意味着再创建数据
    对象点属性 就是在获取数据字段对应的值
    目的就是减轻python程序员的压力 只需要会python面向对象的知识点就可以操作MySQL


    oderby排序:order by默认是升序 asc 该asc可以省略不写,也可以修改为降序 desc

    limit限制展示条数:针对数据过多的情况我们一般选择分页限制每一页数据的个数来让我们的显示显得不是那么杂乱。
    select * from emp limit 3; 只展示三条数据

    select * from emp limit 0,5; 第一个参数是起始位置,第二个是查询条数。


    多表操作:对于多个表我们有时会想将多个表融合为一个表,这就出现了表的拼接的需求。

    select * from dep,emp; 当我们直接这样去操作表的时候我们得到的是一个笛卡尔积

    MySQL也知道 你在后面查询数据过程中 肯定会经常用到拼表操作
    所以特地给你开设了对应的方法
    inner join 内连接 只拼接两张表中公有的数据部分
    left join 左连接 左表所有的数据都展示出来 没有对应的项就用NULL
    right join 右连接 右表所有的数据都展示出来 没有对应的项就用NULL
    union 全连接 左右两表所有的数据都展示出来

    子查询:子查询就是我们平时解决问题的思路
    分步骤解决问题
    第一步
    第二步
    ...
    将一个查询语句的结果当做另外一个查询语句的条件去用,这就是基于我们查询得到的结果是一个虚拟表而操作的。

  • 相关阅读:
    DHCP服务器搭建
    Nginx Web服务器
    ansible批量管理工具
    同网段存活IP公钥分发脚本
    inotify事件监控工具
    搭建云yum仓库和本地定时yum仓库
    NFS网络文件共享系统
    shell 脚本的讲解 与应用
    awk 命令精讲
    ACL权限控制 及特殊权限
  • 原文地址:https://www.cnblogs.com/Jicc-J/p/12839047.html
Copyright © 2011-2022 走看看