• PYTHON1.day18_SQL(增删改查)



    回顾
    1.数据库基本概念
       1)数据库管理系统(DBMS):专门管理数据的软件系统,提供了很多功能:
           -科学,高效的额数据存取操作
           -提供友好的操作界面
           -提供给开发语言访问接口
           -提供丰富的工具(备份/恢复,性能优化)
       2)关系模型概念
         -关系:规范的二维表
         -实体:实现中
         -元组:二维表中一行称为一个元组
         -属性:元组中
         -键:能够区分实体唯一的属性
         -主键:从多个键中选取一个,作为关系(表)中逻辑上唯一确定实体的依据
                非空,唯一

    2.MySQL操作
       1)安装:
         linux:MySQL-server,mysql-client
               libmysqclient-dev
         windows:记住root口令,添加用户 名称/密码,端口

      2)安装确认
         查看端口:netstat -an|grep 3306
         管理脚本:/ect/init.d/mysql[status|start|stop|restart]
       3)服务管理:同管理脚本
       4)客户端连接服务器
         -mysql(客户端),mysqld(服务器)
         -连接:
              mysql -h主机 -u用户 -p密码
       5)库管理
         -查看库:show databases;
         -进入某库:use 库名
         -查看当前库:select database();
         -创建库:creat database 库名
         -删除库:drop database 库名
       6)表管理
         -查看库中有那些表:show tables;
         -创建表:create table 表名
                    (字段1   类型,
                    ..)[设置库属性]
         -查看表结构:desc 表名称
         -查看建表语句:show create table 表名
         -删除表:drop table 表名
        7)数据操作
          -插入
           insert into acct values
           ('78901','sehngjia','c0001',1,now(),1,1200.00),
           ('78902','sehng','c0002',1,now(),1,1200.00);

          insert into acct(acct_no,acct_name)valuse('78904','jia')
           -查询
            select * from acct;
            select * from acct where acct_type=1

           select * from acct where acct_type =1 or acct_type=2

           select acct_no "账户",acct_name as "名为" from acct  (投影)

           select acct_no , balance/10000 from acct

    今天
    1.数据类型
       1)主要数据类型
         -数值类型:整数,浮点数
         -字符类型:对应程序里的字符串
         -日期时间类型
         -枚举类型:具有固定取值范围
                   例如:性别,账户类型
       2)数值类型:
           类型         大小     范围
         -TINYINT       1 Byte   0~255(无符号)
                                 -128~127(有符号)
         -INT/INTEGER   4 Byte   0~2^32-1(无符号)
                                 -2^31~2^31-1(有符号)
         BIGINT         8 Byte   0~2^64-1(无符号)
                                 -2^63~2^63-1(有符号)
         DECIMAL        可变     存储精确数字
                                 可指定最长长度,小数位数
                
        eg:数值类型使用示例
         create table num_test(
         --显示3位无符号整数,左边0填充
         card_type int(3) unsigned zerofill,
         dist_rate decimal(10,2)
         );
         insert into num_test values(1,0.80);
         insert into num_test values(100,23.456);
         insert into num_rest values(1000,23.444);
         imsert into num_rest values(2,3);

        unsigned #无符号整数
         说明:
             -当字段使用unsigned修饰时,值只能是整数
             -定义整数时指定长度,仅仅是指定显示宽度存储的值得大小由数据类型决定
             -zerofill表示长度不足时左边用0填充
             -整数值超过类型的范围,插入时会报错
             -当浮点数小数部分超过指定长度,自动进行四舍五入

      3)字符串类型
         -定长: char (使用较少)
          最大存储255个字符
          如果长度不足指定的长度,右边以空格填充
          如果不指定长度,默认长度为1
          超过长度,无法存入

        -变长字符串: varchar (常用)
          最大能存储 65535 个字符
          根据数据的实际大小分配存储空间
          超过长度,无法存入

        -大文本类型:text
          字符数大于 65535 时使用

       -char 和 varchar 特点比较
          char 类型性能较高,但浪费存储空间
          varchar 节省存储空间,但效率低于 char
          一般情况下使用 varchar

      4)枚举
         -ENUM:从指定的值中选取一个
         -SET:  从指定的值中选取一个或多个

       eg:创建一个含有枚举类型的表
            create table enum_test(
            name varchar(32),
            sex enum('boy','girl'),
            course set('music','dance','paint')
            );
            inset into enum_test values
            ('jia','girl','music,dance');

        
         说明:

      5)日期时间类型
         -日期:date,'1000-01-01'~'9999-12-31'
         -时间:time,'00:00:00'~'23:59:59'
         -日期时间:datetime,年月日时分秒
         -时间戳:timestamp
         -相关函数
          now()/sysdate() 取系统时间
          curdate()/curtime() 取当前日期/时间
          year()/mouth()/day() 单独取日期中年月日
          date()/time() 单独取日期时间中的日期/时间

        示例:
              select now(),sysdate();
              select now(),sysdate(),curdate(),curtime();
              select year(now()),month(now()),day(now());
              select date(now()), time(now());


    2.修改记录
       1)update 表名 set 字段1 = 值,字段2 = 值,where 条件表达式
         示例:
             修改某一个账户的状态
             update acct set status = 2 where acct_no='78901';
             update acct set status = 3,balance=balance-100 where acct_no='78901'
    ;
         注意事项:
         限定好条件!!!
         如果不适用where 限定条件,则修改所有数据
         修改的值得类型要和定义的值一致
    3.数据删除
      1)语法:
         delete from 表名 where 条件
         delete from acct where acct_no='78902';

         -注意事项
          限定号条件!!!
          删除之前做好备份!!!
    4.运算符操作
       1)比较运算符:>,<,>=,<=,<>(!=),=
        eg:查询账户余额大于2000.00的记录
            select * from acct where balance > 2000;
            查询账户类型不为2的记录
            select * from acct where acct_type <> 2;

       2)逻辑运算符
         - and:多个条件同时满足
         - or: 多个条件至少满足一个
         eg:多个条件的组合
            selece * from acct where(acct_name='shengjia'or acct_name='jia'and status=1);

       3)范围比较
         - between ... and ..在..和..之间
         - in:在某个集合内
         - not in:不在某个集合内
        eg:查询所有金额在3000~6000之间的记录
            select * from acct
            where balance between 3000 and 6000;
         eg:利用in操作查询指定户名的账户
            select * from acct
            where acct_name not in('shengjia','jia9');
          
    4)模糊查询
         - 格式 :where 字段名称 like 通配字串
         - 通配符 单个下划线(_)匹配单个字符
                             %匹配多个字符

        eg:查询账户名称已D开头的记录
            select acct_no from acct where acct_name like 'D%';
            查询账户名称已D开头S结尾的记录
            select acct_no from acct where acct_name like 'D%s';
           
            select acct_no from acct where acct_name like '%h%';

           
    5)空/非空判断
       -判断为空:is null
       -判断非空:is not null
      eg:查询acct_type为空/非空的记录
          selece * from acct
          where acct_type is null;
        
    5.查询字句:排序,分组,筛选
       1)order by 子句
         将查询结构按照某个字段排序
         格式:order by 排序字段[ASC/DESC]
               ASC升序(默认)
               DESC降序
         select acct_no,acct_name,balance from acct order by balance desc;

       2)limit子句
         - 作用:限定查询结果显示的笔数
        - 格式:limit n 只显示前面的n笔
                limit m,n 从第m笔显示,共显示n笔

        eg:显示账户信息前2笔
            select acct_no,acct_name,balance from acct limit 2;
         eg:显示账户余额最大的前2笔
            select acct_no,acct_name,balance from acct order by balance desc limit 2;
         eg:查询账户,按照金额倒序排列,从第二笔开始,共显示3笔
         select acct_no,acct_name,balance from acct    order by

         分页示例:
               创建简单表
                create table page_demo(no varchar(8),name varchar(32));
               
                insert into page_demo values
                ('1','Jerry'),('2','tom'),
                ('3','robot'),('4','dekie'),
                ('5','steven'),('6','emma'),
                ('7','yuhua'),('8','jia'),
                ('9','nine'),('10','ten');
                分页查询,每页3笔数据
                select * from page_demo limit 0,3;
                select * from page_demo limit 3,3;
                select * from page_demo limit 6,3;
                select * from page_demo limit 9,3;
             页数从1开始,第n页的查询语句
             m = (页码-1)*每页笔数
             n = 每页笔数
             select * from page_demo limit m,n;

    3)聚合函数
         - max/min : 查询最大/最小值
        eg:查询余额最大值
            select max(balance) from acct;
            select min(balance) from acct;

         - avg:求平均值
           eg:求所有账户的平均值
              select avg(balance) from acct;

         - sum:求和
         -count:统计
         select count(*) from acct;
          *注意:count后的括号中,跟字段名称该字段值为空的数据不参与统计
         
       
    分组格式: group by 分组字段名称
    eg:分组统计各状态账户的数量
        select ststus "状态",count(*) "数量" from acct group by ststus,acct_type;

        注意:根据那些字段分组,则需要先将字段查出来
    eg:分组统计各类型账户中,余额最大值
         select acct_type "类型",max(balance) "余额" from acct group by acct_type;

    5)having 子句
       -作用:对分组聚合的结果进行过滤,需要和group by 配合使用
       -示例:
            eg:按照账户类型统计余额总和,过滤掉账户类型为空的数据
            select acct_type ,sum(balance)from acct group by acct_type having acct_type is not null
            order by acct_type desc
            limit 1;
           
            insert into acct values
            ('78904','sheng4','c0002',3,now(),1,200.00),
            ('78905','sehng5','c0002',1,now(),1,1300.00),
            ('78902','sehng6','c0002',2,now(),1,3500.00);

        -执行顺序:(难点)
          第一步:from acct
                 首先执行from 语句,找到数据源
          第二步:where
                  执行 where 子句,选出满足条件的数据
          第三步:group by acct_type
                 按照指定字段分组
          第四步:sum(balance),acct_type
                 按照分组进行聚合
          第五步:having acct_type is null
                  对分组聚合后 的数据进行过滤
          第六部 :order by acct_type
                  排序
          第七部:limit
                  限制显示笔数

                 
    作业:

    1. 创建数据库eshop,并指定为utf8编码
    2. 创建订单表(orders,utf8字符集),包含
       如下字段
       order_id    订单编号,字符串,32位
       cust_id     客户编号,字符串,32位
       order_date  下单时间,datetime类型
       status      订单状态,枚举类型,枚举范围
                   ('1','2','3','4','5','6','9')
                   1-待付款,2-待发货
                   3-已发货,4-已收货
                   5-申请退货,6-已退货
                   9-废弃
       products_num 包含的商品数量,整数型
       amt         订单总金额,浮点,两位小数
      
    3. 在orders表中至少插入5笔数据
       数据看上去尽量真实

    4. 编写SQL语句,实现如下功能:
      1)查找所有待付款订单
      2)查找所有已发货、已收货、申请退货的订单
      3)查找某个客户待发货的订单
      4)根据订单编号,查找下单日期、订单状态
      5)查找某个客户所有订单,按下单时间倒序排列
      6)统计每种状态订单笔数
      7)查询订单金额最大值,最小值,平均值,总金额
      8)查询金额最大的前3笔订单
      9)修改某个订单状态为“已收货”
      10)删除已废弃的订单 

      1.建库:create database eshop
                dafault charset-utf8;
               
        2.建表:create table orders(order_id varchar(32),
                    cust_id varchar(32),
                    order_date datetime,
                    status enum('1','1','3','4','5','6','9'),
                    products_num(16,2))default charset=utf8;
                   
        3.插入数据:insert into orders values
                   ('201801010001','0001',now(),'1',2,100);
                   insert into orders values
                   ('201801010002','0002',now(),'1',1,200);
                   insert into orders values
                   ('201801020001','0001',now(),'1',4,70);
                   insert into orders values
                   ('201801010003','0002',now(),'2',3,450.26);
                   insert into orders values
                   ('201801020007','0003',now(),'1',4,10.12);
                  
        4.查询
              1)select * from orders where status='1';
              2)select * from orders where status in ('3','4','5');
              3)select * from orders where cust_id = '0002'and status='2';
              4)select order_date,status from orders where order_id='201801010001';
              5)select * from orders where cust_id ='0002' order by order_date desc;
              6)select status "状态",count(*)"笔数"from orders group by status;
              7)select max(amt),min(amt),avg(amt),sum(amt)from orders;
              8)select * from orders order by  amt desc limit 3;
              9)update orders set status = '4' where order_id='201801010001';
              10)delete from orders where status='9';

  • 相关阅读:
    利用for循环 修改精灵图背景位置
    添加列表项 避免浏览器反复渲染 Fragment
    向元素添加属性名和属性值
    分割文本节点
    查询、回显 基本功能
    获取注释
    合并文本节点
    Node(节点)的4个操作方法
    setTimeout与setInterval
    javascript循环
  • 原文地址:https://www.cnblogs.com/shengjia/p/10385535.html
Copyright © 2020-2023  润新知