操作表数据

1.INSERT 向表中添加数据
  INSERT[LOW_PRIORITY|DELAYED|HIGH_PRIORITY][IGNORE]
    [INTO] tb1_name[(col_name,...)]
    values({expr|DEFAULT},...),(...),...
    [NO DUPLICATE KEY UPDATE col_name=ecpr,...]
  或
  INSERT [LOW_PRIORITY|DELAYED|HIGH_PRIORITY][IGNORE]
    [INTO] tb1_name
    SET col_name={ecpr| DEFAULT},...
    [ON DUOLICATE KEY UPDATE col_name=expr,...]
  或
  insert[LOW_PRIORITY|HIGH_PRIORITY][IGNORE]
    [INTO] tb1_anme[(col_naem,...)]
    SELECT...
  输入的数据要求与字段的定一的数据类型保持相同 数据的大小应该在列的规定范围之内 例如,不能够将320个长度的字符串存放在长度为32的name字段中 在values中列出的数据的位置必须要与加上的列的排序位置相对应 如果地段是日期类型 需要使用单引号,比如'2016-11-13' 插入空值在不给列赋值的情况下默认该列的值为空(null) 如果我们在往表中所有的字段插入数据,则可以省略哥哥字段名

  eg:
    create table students(
      id int primary key auto_increment,
      name varchar(32),
      gender bit default 1,
    );
  向表中所有的字段添加数据:
    insert into students(id,name,gender)values(1,'lily',0);
    or:
    insert into students values(2,'luck',0);
    or:
    insert into students values(null,'tom',1);
    重点注意: 如果我们往自增长的主键中存入null值,则会同样按着自己的方式增长,而不会把null值存入
  向表中指定的字段添加数据:
    insert into students(name) value('siri');

  ********** mysql中的乱码问题 *********
    查看所有的字符集
      show variables like 'character%';
      mysql中有六处使用了字符集,分别是:client,connection,database,results,server,system
        client:是客户端使用的字符集
        connection:是间接数据库的字符集设置类型,如果程序没有指明链接数据库的字符集类型,就按照默认的字符集设置
        database:是数据库服务器中某个数据库实例使用的字符集设定,如果创建数据库实例的时候没有指明,则将使用服务器默认的字符集设定
        results:是数据库给客户端返货结果时使用的字符集设定,如果没有指明,就按照默认的字符集设定
        server:是服务器安装时指定的字符集设定
        system:是数据库系统使用的字符集设定(utf8 不可修改)
      设置当前端口指定的字符集(将会影响到) client, connection,results
        set names gbk;
      通过修改mysql安装目录下的my.ini文件中的支付及来进行修改


      创建一张emp表 并且插入几条数据
        create table emp(
          id int primary key auto_increment,
          name varchar(32),
          gender char(2),
          age int,
          position varvahr(32),
          salary double,
          resume text
                            );

        insert into emp values(1,'唐老三','男',18,'总经理',15000,'老子上面有人');
        insert into emp values(2,'孙猴子','男',500,'市场总监',15000,'擅长各种人际关系');
        insert into emp values(3,'猪刚鬣','男',1500,'公关部经理',15000,'喜欢各种娱乐场所');
        insert into emp values(4,'沙悟净','男',800,'业务骨干',15000,'勤勤恳恳,老老实实');
        insert into emp values(5,'小白龙','男',300,'渠道经理',15000,'跑得快');

        select * from emp;


2,update语句
  Single-table语法:
    UPDATE [LOW_PRIORITY][IGNORE] tb1_name
    SET col_name=expr1 [,col_name2=expr2...]
    [WHERE where_definition]
    [ORDER BY...]
    [LIMIT row_count]
  Multiple-table语法
    UPDATE [LOW_PRIORITY][IGNORE] table_references
    SET col_name1=expr1 [,col_name2=expr2...]
    [WHERE where_definition]

  update语法可以用新值更行原有表行中的各列,set字句指示要修改那些列和要给予 那些值,where子句指定应更新那些行,如果没有where子句 则更新所有的行 如果指定了order by子句 则按照被指定的顺序对行进行更新 limit自己用于给定一个限定,限制可以被更新的行的数目

  update语句支持一下修饰符
    ·如果你使用low_priority关键字 则update的执行被延迟了,知道没有其他的客户端从表中读取为止
    ·如果你是用ignore关键之 则及时在更新过程中出现错误 更新语句也不会中断 如果出现了重复关键字冲突, 则这些行不会被更新 如果列被更新后 新值会导致数据转化错误 则这些行被更新为最接近的合法值
    如果你在一个表达式中通过tb1_name访问一列,则update使用列中的当前值

  将所有的员工工资改为8888
    update emp set salary=8888;
    重点:如果我们在更新的时候没有加上条件限定 则会修改整个列

  将猪刚鬣的薪资改为9999
    update emp set salary=9999 where name='猪刚鬣';

  将孙猴子的职位提升为副总,并且薪资增长10000;
    update emp set position='副总', salary=18888 where name='孙猴子';

  将唐老三的薪资增加20000
    update emp set salary=salary+20000 where name='唐老三';

 

3delete语句
  单表达式
    delete [low_priority] [quick] [ignore] from tb1_name
      [where where_definition]
      [order by...]
      [limit row_count]
  多表达式
    delete [low_priority] [quick] [ignore]
      from tb1_name[.*] [,tb1_name[.*]...]
      using table_references
      [where where_definition]

  删除小白龙的记录
    delete from emp where name='小白龙';
  删除表中的所有数据
    delete from emp;
  使用truncate关键字删除表中的记录
    truncate table emp;
  删除表
    drop table emp;
  重点 区别 delete truncate drop
    delete:在删除数据的时候如果没有加上条件限定,则会一条一条的删除表中的所有数据,但会保留整体的表结构,删除操作是,是删除的整行数据,而不能通过逐列删除数据 这种方式很耗时 但是删除的数据可以找回
    truncate:删除的是表中所有的数据,保留表结构 其删除的本质是一次性摧毁一张表,然后按照原来的表结构在创建出来一张表
    drop: 是删除一张表 删除后 表结构也不复存在
  **** 建表 ****
    创建一个学生考试成绩表:
      create table exam(
        id int primary key aoto_increment,
        name varchar(32) not null,
        chinese int,
        math int,
        english int
      );

    -- 因为name的字段约束条件为not null 所以不能够为null
      -- field'name' doesn't have a default value
      -- insert into exam(id) value(null);

      insert into exam values(null,'lily',95,96,98);
      insert into exam values(null,'luck',89,95,92);
      insert into exam values(null,'jack',92,88,96);
      insert into exam values(null,'rose',86,85,82);
      insert into exam values(null,'tom',91,86,89);
      insert into exam values(null,'erci',82,88,82);

  
    把查询的结果插入到表中
      insert into 插入的表名(插入的字段) select 查询的字段 from 表名 条件

4.select 数据(核心操作)

  1.基本查询
    查看所有学生的信息
      select id,name,chinese,math,english from exam;
      or:
      select * from exam;
      重点"*"表示通配符,匹配所有的列,当然也可以直接写出要查询的列

    查询所有学生的数学成绩,并且去掉重复数据
      第一步:
        select id,name, math from exam;
      第二步:
        select distinct math from exam;
      重点:关键字distinct是查询到的所有数据中去掉重复的数据

    在所有学生的所有学科分数上分别加上10分的卷面分
      select id,name,chinese+10,math+10,english+10 from exam;
      重点:这一种凡是不会改变数据本身,这是一种表象

    统计每个学生的总成绩
      select id,name,chinese+math+english from exam;
      or:
      select id,name as 姓名,chinese+math+english 总成绩 from exam;
      重点:关键字as是给字段取别名 可以省略不写而直接添加别名

  2.使用where 子句 进行过滤子查询
    查询姓名为lily的学生成绩
      select * from exam where name='lily';
    查询数学成绩大于90的学生信息
      select * from exam where math>90;
    查询总分大于270的学生信息:
      -- Unknown column '总成绩' in 'where clause';
      -- 这里是不能使用别名的,应为还没被查询出来
      -- select name as 姓名,(chinese+math+english) 总成绩 from exam where 总成绩>=270;
      select name as 姓名,(chinese+math+english) 总成绩 from exam where (chinese+math+english)>=270;
    查询语文成绩在85--95之间的学生信息:
      select name,chinese from exam where chinese>=85 and chinese<=94;
      or:
      select name,chinese from exam where chinese between 85 and 94;
      重点:between...and...在两者之间的所有
  
    查询所有语文成绩分别是91 92 93的学生信息:
      select name,chinese from exam where chinese=91 or chinese=92 or chinese=93;
      or:
      select name,chinese from exam where chinese in(91,92,93);
      重点:or关键字表示的或者关系
      in(数据范围)在...之内的条件

    查询所有语文,数学,外语成绩都在90分以上的学生信息
      select name,chinese,math,english from exam where chinese>=90 and math>=90 and english>=90;
      重点:and关键字表示并列的条件限定

    查询所有成绩不为252的学胜信息
      select name,(chinese+math+english) 总成绩 from exam where(chinese+math+english)!=252
      or:
      select name,(chinese+math+english) 总成绩 from exam where(chinese+math+english) <> 252
      重点:<> 符号表示为不等于的含义
      重点:区分符号 "!=" 和 "<>" 的区别(<>是官方的)(!=是非官方的)


    **** 创建表 ****
      create table employees(
        id int(11) not null auto_increment,
        name char(32) character set utf8 collate utf8_bin default null,
        gender bit(1) default 1,
        age int(11) default null,
        birthday data default null,
        entry_data data default null,
        position varchar(32) default null,
        salary double default null,
        resume text character set utf8 collate utf8_bin,
        bonus double default null,
        primary key (id)
        )engine=innodb auto_increment=31 default charset=utf8;


3.模糊子查询
  在employees表中查询所有姓赵的员工信息
    select * from employees where name like '赵%';
  查询employees表中所有姓名中带有三的员工信息
    select * from employees where name like '%三%';
  查询employees表中所有姓周并且只有两个字的员工信息
    select * from employees where name like '周_';
  查询employees表中第二个字是三的员工信息
    select * from employees where name like '_三%';

  重点:
    like 是模糊查询的关键字
    %通配所有的字符
    _统配单个字符
    \也表示转义字符 表示匹配\后面的一个字符

4.使用order by关键字对查询的结果进行排序
  asc:升序排序 这是默认的操作
  desc:降序排序

  employees表中对员工的年龄进行排序:
    select name,age from employees order by age;
    or:
    select name,age from employees order by age asc;
  在employees中对员工的年龄排序,并且去重
    select distinct age from employees order by age;

  按照employees表中的所有员工的年薪的降序排序查询所有的员工信息
    --如果某一个数和null进行运算,则会导致整个结果为null
    -- select name 姓名,(salary+bonus)*12 年薪 from employees order by 年薪 desc;
    select name 姓名,(ifnull(salary,0)+ifnull(bonus,0))*12 年薪 from employees order by 年薪 desc;
    重点:ifnull(字段名,代替值):在执行计算的时候,只要有null参与运算,就把null值替换掉

  查询所有姓赵的员工的职位和年薪 并且按照年薪降序排序
    select name 姓名,position 职位,(ifnull(salary,0)+ifnull(bonus,0))*12 年薪 from employees where name like'赵%' order by 年薪 desc;

5.函数

  1.count 用来统计符合条件的所有行数
    统计employees表*有多少条数据
      select count(*) from employees;
      select count(*) 员工总数 from employees;
    统计工资在10000以上的员工有多少个
      select count() from employees where salary>10000;
    统计年薪高于100000 的员工有多少个
      select count() from employees where(ifnull(salary,0)+ifnull(bonus,0))*12>1000000;
    统计公司共有多少个姓赵的员工
      select count(*) from employees where name like '赵%';

  2.sum:用来将符合条件的记录的指定的列进行求和操作
    统计公司一个月供要发放多少工资
      select sun(ifnull(salary,0)+ifnull(bonus,0)) from employees;
    求一年中公司要发放的薪资总数
      select sun(ifnull(salary,0)+ifnull(bonus,0))*12 人力成本 from employees;
    求公司员工平均年薪:
      select sun(ifnull(salary,0)+ifnull(bonus,0))*12/count(*) 平均年薪 from employees;
  3.avg:用来计算符合条件的记录的指定列的平均值
    求共识员工的平均工资
      select avg(salary+ifnull(bonus,0)) from employees;
    求公司全体职员的平均年龄
      select avg(age) from employees;
  4.max:用来获取符合条件的记录的指定列的最大值
    求公司中员工年龄最大的员工信息
      select max(age) from employees;
      or:
      select * from employees where age=(select max(age) from employees);
    求共识中年薪最高的员工信息
      select * from employees where (salary+ifnull(bonus,0))*12=(select max(salaru+ifnull(bonus,0))*12 from employees);
  5.min:用来获取符合条件的记录的指定列的最小值
    求共识中工资最低的员工信息
      select * from employees where (salary+ifnull(bonus,0))*12=(select min(salary+ifnull(bonus,0))*12 from employees);

  6.group by 分组查询
    对公司员工按照职位进行分类 并且求出每一类岗位工作人员的总人数和总工资
      select position 职位, count(position) 人数,sum(salary+ifnull(bonus,0)) 总工资 from employees grope by position;
    对公司员工按照职位进行分类 并且求出每一类岗位工作人员的总工资 并且降序排序
      select position 职位 ,sum(salary+ifnull(bonus,0)) 总工资 from employees grope by position order by 总工资 desc;
    对公司员工按照职位进行分类,并且求出总工资大于20000的每一类工作岗位的员工总工资 并且降序排序
      select position 职位, sum(salarty+ifnull(bonus,0)) 总工资 from employees grope by position having 总工资>20000 order by 总工资 desc;
      重点:having子句是对分组之后的结果进行条件过滤

  查询每一种职位上年龄在25岁以上的员工个数
    select position, count(position) from employees where age>25 group by position;
    -- Unknown column 'age' in having clause
    -- select position, count(position) from employees grope by position having age>25;
  对公司员工按照职位进行分类,并且要求员工年龄在25岁以上, 并且总工资大于20000的每一类工作岗位上的员工工资 并且降序排序
    select position 职位,sum(salary+ifnull(bonus,0)) 总工资 from employees where age>25 group by position having 总工资>20000 order by 总工资 desc;

  重点: 区分 where 和 having 的区别
    where 字句在分组之前进行过滤
    having 字句在分组之后进行过滤
    having 字句可以使用聚合函数 而 where 字句后面不能够使用聚合函数
    很多时候在where字句的地方都能使用having进行代替
  重点:
    sql的书写顺序
      select from where grope by having order by;
    SQL的执行语句
      from where select grope by having order by;

7.分页查询
  分页查询格式:
    limit 起始行 要查询几行
  起始行从0行开始
    分页:当前页 每页显示多少条数据
  分压查询当前页的sql命令
    select * from employees limit(当前页-1)*每页显示多少条数据, 每页显示多少条数据

  查询第1.2.3条记录
    select * from employees limit 0,3;
  查询第11,12,13,14,15条记录
    select * from employees limit 10,5;
  查询第28,29,30,31.32条记录(没有数据不显示)
    select * from employees limit 27,5;


  **** 数据库的备份与恢复 ****

    备份:
      cmd 窗口下,mysqldump -u -p 数据库名称>备份路径
      eg: mysqldump -u root -p mydb>c:/mydb.sql;
    恢复:
      在cmd窗口下,mysql -u root -p 数据库名称<文件路径
      eg: mysql -u root -p mydb<c:/mydb.sql;

    在mysql命令下: source 文件路径
      eg: source c:/mydb.sql;
      重点我们在进行数据库恢复的时候,只能够恢复数据本身,不能够恢复数据库实例,需要我们自己创建出数据库实例后才能进行数据库恢复

 

上一篇:Linux(CentOS)系统下搭建svn服务器


下一篇:visual.studio.15.preview5 编译器