zoukankan      html  css  js  c++  java
  • mysql数据库基本操作(四)

    表纪录操作

           同样,表纪录也有增删改查的操作,但是一般我们大概70%的操作都是在查数据,所以查的操作需要单独说清楚,先简单看看增删改。

    表纪录的增、删、改

         1.增加一条纪录的方式:

    insertinto] tab_name (field1,filed2,.......) values (value1,value2,.......);

          上一篇我们已经创建了一张员工表,现在简单一点,就留下名字和年龄信息,重新重建一张员工表:

    create table emp_new(
                     id int primary key auto_increment,
                     name varchar(20) not null unique,
                     birth varchar(20),
                     salary float(7,2)
                                 );

          创建好之后,我们开始增加数据,增加数据的方式有很多:

    单条插入:

    insert into emp_new (id,name,birth,salary) values
                         (1,'pengfy','1993-01-01',20000);
    
    insert into emp_new values
           (2,'pyq','1992-12-12',10000);
    
    insert into emp_new(name,salary) values
           ('xiaojiang',3000);

         单条插入的时候,我们可以和键一一对应的写进去,也可以不写键名(默认全部键)直接插入对应顺序的值,也可以指定键名写入对应的值,这里id设为自增,不用填写也会自己增加。

    多条插入:

    insert into emp_new values
           (4,'pyq1','1992-06-20',8000),
           (5,'pyq2','1994-06-20',9000);

          现在我们已经插入了五条数据,可以通过select * from emp_new先看看有没有插入成功:

           2.修改一条表纪录:

    修改表记录  update tab_name set field1=value1,field2=value2,......[where 语句]
    
        /*      UPDATE语法可以用新值更新原有表行中的各列。
                SET子句指示要修改哪些列和要给予哪些值。
                WHERE子句指定应更新哪些行。如没有WHERE子句,则更新所有的行。*/

          现在发现pyq的生日写错了,就可以通过where单独修改pyq的生日,pengfy 的工资也太低了,老板加了6000工资:

    update emp_new set barth='1992-9-11'where id=2;  #修改pyq的生日
    update emp_new set salary=26000 where name='pengfy';  #修改pengfy的工资

          现在看看有没有修改成功:

          其实用set也可以增加一条纪录:

    insert into emp_new set id=12,name="pyq3",salary=8800;

          3.删除一条表纪录

    delete from tab_name [where ....]
    
            /*    如果不跟where语句则删除整张表中的数据
                delete只能用来删除一行记录
                delete语句只能删除表中的内容,不能删除表本身,想要删除表,用drop
                TRUNCATE TABLE也可以删除表中的所有数据,词语句首先摧毁表,再新建表。此种方式删除的数据不能在
                事务中恢复。*/

          删除表纪录也很简单,按照条件删除就行了:

           我们先把最后set增加的名字为pyq3的删除掉:

    delete from emp_new where name='pyq3';

         也可以删除表中所有纪录,删除表中所有纪录有两种方法:

    -- 删除表中所有记录。
     delete from emp_new;                
    -- 使用truncate删除表中记录。
      truncate table emp_new;

           那这二者的区别在哪里?一起看一下:

         

         

          

            两份表的数据完全一样,唯一的区别在于delete删除是一条一条删除的,所以在第一张图里面可以看到5行被影响(5 rows affected,而truncate在删除的时候,是直接把整个表删除后再重新建一张名字一样的空表,所以在数据很大的时候,我们用右边的truncate去做删除表的动作,时间会更短。还有一点需要注意的是:之前设置id里的auto_increment没有被重置:alter table employee auto_increment=1;所以表中如果有数据三条,id分别为1,2,3,突然插入一个id=7,那么下次作为主键的字增长的id会从7开始增加。

    表纪录之查(单表查询)

           表查询表达式

       SELECT *|field1,filed2 ...   FROM tab_name
                      WHERE 条件
                      GROUP BY field
                      HAVING 筛选
                      ORDER BY field
                      LIMIT 限制条数

          我们重新创建一张表,是一张学校的成绩单,然后输入一些数据,有一个好习惯就是把sql命令都写成大写的,虽然sql不区分大小写,但这样可读性更强。

    CREATE TABLE Result(
    
       id INT PRIMARY KEY  auto_increment,
       name VARCHAR (20),
       Chinese DOUBLE ,
       English DOUBLE ,
       Math DOUBLE
    );
    
    
    INSERT INTO Result VALUES  (1,"pengfy",100,99,98),
                                   (2,"pyq",80,95,80),
                                   (3,"xiaojiang",43,59,22),
                                   (4,"pyq2",80,86,82),
                                   (5,"pyq3",82,90,90);

          表单创建好之后,我们就开始查询了:

    1.普通方式查询

    select [distinct] *|field1,field2,......   from tab_name
                -- 其中from指定从哪张表筛选,*表示查找所有列,也可以指定一个列
                -- 表明确指定要查找的列,distinct用来剔除重复行。

           我们上面再增删改里面也说过一条select * from table_name,就是查询表中所有信息,就不用演示了。现在我们来查询所有学生的姓名和对应的英语成绩:

    select name,english from result;

          从图片看到,只显示了我们需要的名字和英语成绩,而且表头的名字大小写也和我们select命令中的显示一致。接下来我们再试一下过滤功能,我们插入两行和pengfy一样的内容,然后过滤一下:

    insert into result values (6,'pengfy',100,99,98),
                                      (7,'pengfy',100,99,98);
    select distinct chinese,name from result;

          上面演示的是过滤掉了语文成绩和名字一样的信息,如果单独过滤语文成绩不一样的,那么80也会只保留从上往下的第一个,可以试一试。

    2.表达式查询

    select 也可以使用表达式,并且可以使用: 字段 as 别名或者:字段 别名

           现在我要给每个学生的成绩加上10分,就可以这样写:

    select name,chinese+10,english+10,math+10 from result;

          要注意的是,这仅仅是显示的给我们看的时候加上了10分,实际的成绩是没有变的,我们查看实际成绩还是select * from result。我们再看看学生的总分:

    select name,chinese+english+math from result;

           根据表达式所说的,我们可以使用别名来显示,比如我把name和chinese+english+math显示成中文:

    select name as 姓名,chinese+english+math as 总成绩 from result;

           再次强调,我们改变的是我们查看的方式,并没有影响数据本身,否则那就不要查看,叫修改喽。还有需要注意的是记得在查找不容的内容之间加上逗号,你可以试试不加逗号是怎样的。

    3.使用where子句,进行过滤查询

          我们在修改表纪录的时候也简单使用了where子句,那这里同样可以,首先我们查一下名字是pengfy 的成绩:

    select * from result where name='pengfy';

          这就把名字为pengfy的成绩全找到了,当然,我们使用id或者成绩也可以找到,比如where Chinese=100,因为只有pengfy是10嘛,但我还是习惯用name,因为条件是找名字是pengfy的信息。除了这种,我们还可以做判断,比如找到英语成绩大于90分的人:

     select name,english from result where english>90;

            也可以配合上面的表达式使用, 比如找到总分大于260分的人,只显示名字和总分:

    select name,chinese+english+math from result where chinese+english+math>260;

            这时候你可能有疑问,为什么不把chinese+english+math换一个别名,然后where就不用写那么长一大串了,先告诉你这样会报错的,具体为什么,就是运行的优先级问题,后面再讲。除了这些,在where中还可以使用这些:

    比较运算符:
                  > < >= <= <> !=
                  between 80 and 100 值在10到20之间
                  in(80,90,100) 值是10或20或30
                  like 'pengfy%'
    
                            /*
                            pattern可以是%或者_,
                            如果是%则表示任意多字符,此例如唐僧,唐国强
                            如果是_则表示一个字符唐_,只有唐僧符合。两个_则表示两个字符:__
                            */
    
    逻辑运算符
                  在多个条件直接可以使用逻辑运算符 and or not

            这里可能有点问题的是like,这里就举一个例子,现在要找到名字是p开头的所有信息:

     select * from result where name like 'p%';

           这里可以看到%可以代表任意长度的字符,但如果你要定长的字符,就要使用下划线_,比如要查找名字p开头且4个字节的所有信息:

    select * from result where name like 'p___';

          看着这个下划线有点长,其实是三个,一个就代表一个字符,加上p就一共4个字符。

    4.Order by 指定排序的列  

    Order by 指定排序的列,排序的列即可是表中的列名,也可以是select 语句后指定的别名。
    
                  -- select *|field1,field2... from tab_name order by field [Asc|Desc]
    
                  -- Asc 升序、Desc 降序,其中asc为默认值 ORDER BY 子句应位于SELECT语句的结尾。

           除了上面的操作,我们在现实中遇到的情况也有很多是排序显示的,现在我们按语文成绩排序来显示:

    select * from result order by chinese;

         可以看到默认的是从小到大来显示的,如果要从大到小,只需要在最后加上一个desc即可:

    select * from result order by chinese desc;

         我们再按总成绩排个名看看,在这之前先加入一个插班生lily,Lily这个时候还没有考试,所以还没有成绩:

    insert into result (id,name) values (8,'lily');
    
    select name,chinese+english+math as 总成绩 from result order by 总成绩 desc;

          细心的朋友就发现了,怎么这里就可以弄个别名放在order后面用呢,where确不可以,还是优先级的事。不过这里先看一个问题,Lily是没有成绩的,但成绩应该是一个数字,放一个null算怎么回事,怎么办?在排序前先做一个判断,看是不是空,是空就变为0:

     select name,(ifnull(chinese,0)+ifnull(english,0)+ifnull(math,0)) as 总成绩 from result order by 总成绩 desc;

          这还没完,如果我只要名字p开头的总成绩排名怎么办?怎么放置where和order呢?

    select name,(ifnull(chinese,0)+ifnull(english,0)+ifnull(math,0)) as 总成绩
        -> from result where name like 'p%'
        -> order by 总成绩 desc;

         搞定了,order放在后边。查询的方式可不止这些,下一篇继续查看表单的其他方式。

     

  • 相关阅读:
    maven 仓库配置 pom中repositories属性
    CentOS下SVN服务的启动与关闭
    python爬虫登录
    git pull“No remote repository specified”解决方法
    更新到mysql 5.7后解决0000-00-00日期问题
    maven仓库中有jar包pom还报错
    navicat链接mysql 8 出现 2015 authentication plugin 'caching_sha2_password' 错误
    Confluence JIRA快速入门
    SilverLight:基础控件使用(2)-ComboBox,ListBox控件
    SilverLight:基础控件使用(1)
  • 原文地址:https://www.cnblogs.com/pengfy/p/10898668.html
Copyright © 2011-2022 走看看