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';

原文地址:https://www.cnblogs.com/shengjia/p/10385535.html