zoukankan      html  css  js  c++  java
  • 数据库(二)自动增长列,添加表数据,修改数据,删除数据,where条件,%通配符,is,查询数据(查询全表,指定列查询,排序查询),聚合查询(平均、最大、最小、行数、求和)

    通过选中表进行导入、到处操作进行数据表备份

    自动增长列:数据表的主键应具备唯一性,每次写入不同主键值会比较麻烦,使用自动增长列替换主键值是常用的方式

    CREATE TABLE `user`(
    userId PRIMARY KEY AUTO_INCREMENT
    )

    自动增长列默认从1开始,修改起始值使用以下方式
    ALTER TABLE 表名 AUTO_INCREMENT=起始值

    创建一张表:

    create table users
    (
        userid int auto_increment,
        userName varchar(20) not null, -- 非空约束
        birthday datetime,
        email varchar(50) default 'xxx@geekhome.com', -- 默认约束
        detail text,
        constraint pk_userid primary key(userid)
    );

    增加数据的方法:数据表中写入的数据以行为单位

    增加数据的语法(一):根据指定列写入值
      insert   into  表名(列名)   values(值)

        只有varchar 、文本 加单引号,其余的值都直接写

        写入的列名和后面要写入的信息要对应

        非空约束的信息必须要写入

        如果主键是自动增长列,此时主键是可以不写的,但是如果不是自动增长的,则必须要写因为非空

      注意要点:

        1.写入的值的数量必须和列的数量匹配
        2.写入的值和列的数据类型必须匹配
        3.非空约束的列必须写在指定列中
        4.主键必须写在指定列中
        5.写入的值必须满足该列的check约束

    insert into users(username,brithday,detail) values('tom',now(),'tom的个人信息') ;
    
    --如果指定的日期则按照字符串写入,系统会自动转换成时间格式
    insert into users(username,brithday,detail) values('jack','1992-4-5','jack的个人信息');
    
    --写入是列名和数据顺序要对应
    insert into users(username) values('white');

    增加数据的语法(二):根据指定列写入值

      INSERT   INTO  表名  VALUES(值)

      注意:因为没有列明,所以一定要将所有的数据写全,(添加主键和默认值将会失效),因为系统会按顺序写入,不会识别写入

      1.表中所有列都必须写入
      2.表中如果存在默认值则使用 default 替入
      3.如果某列不需要写入数据则使用 null 替入

    insert into users values(100,'jerry','1994-11-12','jerry@sina.com','jerry的个人信息');

      防止主键失效的方法:在对应位置上写入null

    -- 防止主键失效的方法:在对应位置上写入null
    insert into users values (null'zake','1993-5-6','zack@sina.com','zack的个人信息')

      防止默认值失效的方法:在有设置默认值的地方写入default,就会显示默认值

    insert into users(null,'marry','1992-12-10',default,'marry 的个人信息')

    建表时添加数据:(只是将数据写入,非空会写入,主键和其他约束都没有)

      create  table  表名2  as  select  *  from  表名1      -- 将表1内容新增到创建的表2中

    -- 将users的数据添加到新创建的backup_user表中
    create  table  backup_user as select * from users

    修改数据语法:

      主键能用update修改但是尽量不改
      主键被其他表引用是,如果其中内容被引用了则不能修改,如果没有被引用的是可以修改的

      update  表名  se t 列  =  值  [where 条件]   -- where条件可写可不写,不写where条件则表示删除这一列的搜友数据

    alter table users add age int-- 新增一列
    alter table users add sex varchar(10);-- 新增一列
    修改数据:
    -- 不写where是代表整个表的这一列全部数据都更改为统一数据
    update users set age =20;

     同时修改多个列的内容:

    -- 同时对多个列的数据进行修改
    update users set age=22,sex='';

    where条件的使用:
      where语句后应为一个表达式,且表达式返回是或否的结果
      where后的表达式可以为一个或多个使用逻辑运算符and和or关联

      关系运算符:> , < , >= , <= , = , != , between and  , in ,  like , is,is not

    指定修改某一行的某一列数据
    update users set sex =''  where userid=103--将用户的编号为1-3(三种表述方式)的用户年龄更改为25
    update user set age=25 where betweem 1 and 3;
    
    update user set age=26 where userid>=1 and userid<=3;
    
    -- int可以添加不连续的数据
    update user set age=27 where userid int(1,2,3);

    %通配符:通过一个数据中包含的部分数据信息查找整条数据

    -- 将姓名以t开头的用户,将他的邮箱清空
    -- %通配符,表示匹配任意长度的任意字符
    update users set email =null where username like 't%';
    
    -- 将姓名中包含ac的用户,将他们的升入设为1995-10-1
    update users set birthday ='1995-10-1' where username like '%ac%'-- 将所有QQ邮箱的用户将他的年龄增加5岁
    update users set age=age+5 where email like '%qq.com%';

    is :判断是否非空

    --将所有没有填写过资料的用户将其用户信息变更为'待注销用户'
    
    用等号代表填入的内容是否是null
    update users set detail ='待注销用户' where detail=null;
    
    用is代表是否有填入数据
    update users set detail ='待注销用户' where detail is null;
    
    -- 将所有填写过邮箱并且性别为男的用户,变更其年龄为20
    update users set age =20  where email is not  null and sex='';

    删除数据:

      delete  from  表名 [where  条件]

      例子:删除backup_user表中的所有数据

        delete和truncate两者的区别:

          * truncate table与delete的区别在于delete是逐行执行,每次执行将执行事务,并将数据操作记录日志

          * truncate table是整个数据块删除为写入日志无法恢复数据,且自动增长列重置

        方法一: delete将表中的数据逐行删除,不添加条件就是删除整个表中的所以数据,

            delete每次执行将执行事务,并将数据操作记录日志,可以恢复

    delete from backup_user;

        方法二:truncate不是逐行删除,是将整个数据块全部删除,且不能写where条件

            是整表数据删除为写入日志,无法恢复数据,且自动增长列也会重置

    truncate table backup_user;

    删除其中一行数据:写where条件

    -- 删除编号是3的整行数据
    delete fron backup_user where uesrid=3;

    查询数据:

      1.查询全表       select * from 表名

      2.指定列名查询       select  列  as  显示列名  from  表名

      查询语法注意事项:

        1.* 表示表中所有的列,也可以单独查看指定的列,用列名将*替换掉;

        2. 查询所有的列比较影响性能,会将所有数据库中的每一行进行每一列的删选,所以要尽量根据业务需要的数据列进行查询

    一、查询全表

    -- 查询姓、名、工资和工作id
    select first_name,last_name,salary,job_id from emp;
    -- 查员工编号为100的 姓、名、工资和工作id
    select first_name,last_name,salary,job_id from emp where employee_id=100;
    -- 查询部门编号为50的所有员工的姓名和薪水
    select first_name,last_name,salary from emp where department_id=50;

    对日期进行判断条件:

    -- 查询薪资超过8000并且入职时间早于2015年的员工姓名、邮箱、入职时间、所在部门的编号
    select first_name,last_name,hire_date,salary,department_id from emp where salary>8000 and hire_date<'2015-1-1';

    二、指定列名查询:

      select  列  as  显示列名  from  表名

      例子:查询员工的姓,增加500后的薪水

        方法一:这样查询只能查看增加后的结果,但是不能持久保存,且列名是  ‘salary+500’

    select  first_name ,salary+500  from  emp;

        方法二:对数据列起别名(as 新列名),这样就对数据进行了保存,可以通过别名对数据进行查询

    select  first_name ,salary+500  as  salary  from  emp;

      对表取别名,便于在已经查询的数据中进行二次查询

    select  e.employee_id  ,e.salary  ,e.manager_id   from  emp  as  e;

      将两列数据合并到一起concat查询:

    select  concat(first_name,last_name)  as   empname  from  emp;

    排序查询:

      select  列名  from  表名  where  条件  order  by  列

        升序排序    asc(默认值)

        降序排列    desc

    --根据工资由高到低查看部门编号为50的员工姓名和薪资
    select  concat(first_name,last_name)  as  empname, salary from emp  where   department_id=50  order   by   salary   desc;

      新建一张表数据,进行排序测试:

    create table test
    (
        A varchar(10),
        B varchar(10) 
    )
    insert into test values(50,22);
    insert into test values(50,42);
    insert into test values(50,32);
    insert into test values(60,45);
    insert into test values(50,78);
    insert into test values(60,19);
    insert into test values(50,20);
    insert into test values(50,34);
    insert into test values(60,43);
    insert into test values(80,89);
    insert into test values(50,26);
    insert into test values(70,36);
    insert into test values(70,93);
    insert into test values(50,73);
    insert into test values(70,63);
    insert into test values(80,54);
    insert into test values(50,82);

      进行数据排序测试:

    -- 对test表中的ab字段进行排序,对a和b都进行降序排序
    
    -- 将a列进行降序排列
    select *from test order by a desc;
    
    -- 先对a进行升序排列,如果a有重复的数据,在重复的过程中对b进行升序排列
    -- 当对多列进行排序时,将排序前一个列的值,如果前一个列的值有出现重复的情况,才会对第二个列继续排序
    select *from test order by a,b; -- 此时a升序,b降序,因为desc值作用于b列 select *from test order by a,b desc; -- 对a和b列进行降序,如果a重复再对b列进行降序 select *from test order by a desc,b desc;

    高级查询

      聚合函数:

        sum:求和

        avg :平均值

        max:最大值

        min:最小值

        count:行数

    -- 查询部门编号为40的员工薪资的总和
    -- sum的结果只有一个值,如果出现非聚合列,则只会出现第一个,不允许这么写
    select  sum(salary)  from  emp  where  department_id = 50 ;
    
    -- 查询所有员工的平均工资
    select avg(salary) from emp;
    
    -- 查询所以员工的工资汇总和平均工资
    select sum(salary) as sum_salary,avg(salary)  as avg_salary from emp;
    
    -- 查询最早入职员工的入职时间
    select  min(heir_date) from emp;
    
    -- 查询部门编号为50的最高的薪资
    select  max(salary) from emp where department_id=50;
    
    -- 查询员工表中有多少员工信息 -- 只要这个行中只有一个列中有数据,写*也会统计进去 select count (*) from emp; -- 107 select count (first_name) from emp; -- 107 -- 其中一个数据的数值为null select count (manager_id) from emp; -- 106

    课上练习:(在数据修改前将表格进行备份)

      修改编号为100的员工的薪资,增加500块
      修改姓名中包含s(不区分大小写)的员工,将其部门调整到编号为50的部门中
      调整老板的薪资增加5000
      将所有薪资低于6000的员工薪资上浮500

    -- 创建备份数据
    create table location as select * from locations;
    create table emp as select * from employees;
    create table dep as select * from departments;
    
    -- 修改编号为100的员工的薪资,增加500块
    update emp set salary=salary+500 where employee_id=100;
    
    -- 修改姓名中包含s(不区分大小写)的员工,将其部门调整到编号为50的部门中
    update emp set department_id=50 where concat(forst_name,last_name) like '%s%' or concat(forst_name,last_name) like '%S%';
    
    -- 调整老板的薪资增加5000
    update emp set salary=salary+5000 where manager_id is null;
    
    -- 将所有薪资低于6000的员工薪资上浮500
    update emp set salary=salary+500 where salary<6000;
    
    -- 查看数据表信息
    select * from location;
    select * from emp;
    select * from dep;
  • 相关阅读:
    消除QQ表情小游戏
    图片排序
    自定义字体
    随机图片滚动
    生成500个0-1000的随机数&&数组查找—小练习
    文字搬运
    查找 替换
    BeginInvoke和EndInvoke方法
    MVC HtmlHelper用法大全
    30分钟LINQ教程 【转载】
  • 原文地址:https://www.cnblogs.com/gfl-1112/p/12702629.html
Copyright © 2011-2022 走看看