zoukankan      html  css  js  c++  java
  • MySQL创表--分页--自关联--

    
    

    创建表book

    create table t_book(
      id int unsigned auto_increment primary key,
      bookName varchar(255) default null,
      price decimal(6,2) default null,
      author varchar(255) default null,
      bookTypeId int(11) default null
    ); 
    insert into t_book values(1, '追风筝的人', '29.00', '胡赛尼', 1);
    insert into t_book values(2, '计算机', '45.00', 'Harold', 2);
    insert into t_book values(3, '代码大全', '128.00', '史蒂夫', 2);
    insert into t_book values(4, '哥德尔 ', '88.00', '侯世达', 3);
    insert into t_book values(5, '呵呵', '4.50', '[中]老子', 4);
    
    create table t_bookType(
      id int(11) auto_increment not null primary key,
      bookTypeName varchar(10) default null
    );
    insert into t_bookType values(1, '小说类');
    insert into t_bookType values(2, '编程类');
    insert into t_bookType values(3, '哲学类');
    insert into t_bookType values(5, '艺术类');

    分页查询: limit

    # limit 后的参数:第一个表示 起始位置(下标从0开始),第二个参数是显示的个数(表示本次基于起始位置显示多少个)
    select * from t_hero limit 0,3
    
    # 结合where条件:只显示state不为null 的结果
    select * from t_hero where state is not null limit 0,20
    
    +----+-----------------------------------------------------+--------+----------------------------------------------------------+------------+----+--------------+
    | id | bookName                                            | price  | author                                                   | bookTypeId | id | bookTypeName |
    +----+-----------------------------------------------------+--------+----------------------------------------------------------+------------+----+--------------+
    |  1 | 追风筝的人                                          |  29.00 | [美] 卡勒德·胡赛尼                                       |          1 |  1 | 小说类       |
    |  2 | 计算机程序的构造和解释 : 原书第2版                  |  45.00 | [美]Harold Abelson、Gerald Jay Sussman、Julie Sussman    |          2 |  2 | 编程类       |
    |  3 | 代码大全(第2版)                                   | 128.00 | [美] 史蒂夫·迈克康奈尔                                   |          2 |  2 | 编程类       |
    |  4 | 哥德尔、艾舍尔、巴赫 : 集异璧之大成                 |  88.00 | [美] 侯世达                                              |          3 |  3 | 哲学类       |
    |  5 | 道德经                                              |   4.50 | [中]老子                                                 |          4 |  4 | 艺术类       |
    +----+-----------------------------------------------------+--------+----------------------------------------------------------+------------+----+--------------+
    
    
    - - - - - - - 连接查询: 表示多个表之间的关联查询
    
    1. 内连接:INNER JOIN ON
    #连接查询:表示查询所有数据的非NULL部分
    #默认是内连接
    SELECT *
    FROM t_book, t_bookType
    WHERE t_book.bookTypeId = t_bookType.id;
    
    select * from t_book, t_bookType where t_book.bookTypeId = t_bookType.id;
    
    
    # 隐式连接中
    
    
    # 给每张表起别名用:as
    SELECT tb.bookName, tb.price, tby.bookTypeName
    FROM t_book as tb, t_bookType as tby
    WHERE tb.bookTypeId = tby.id;
    
    
    # 显式连接
    SELECT tb.bookName, tb.price, tby.bookTypeName
    FROM t_book as tb
    INNER JOIN t_bookType as tby
    ON tb.bookTypeId = tby.id;
    
    交集: 属于A集合,也 属于B集合 的数据, A & B
    并集: 属于A集合 和 属于B 的数据的全部集合, A | B(重复数据只保留一个)
    
    
    2. 左连接 : LEFT JOIN    ON
    # 两张表连接查询,无论二者是否有数据缺失,一定会把左边的表数据全部显示出来
    SELECT *
    FROM t_book
    LEFT JOIN t_bookType
    ON t_book.bookTypeId = t_bookType.id
    
    SELECT tb.bookName, tb.price, tb.author, tby.bookTypeName
    FROM t_book as tb
    LEFT JOIN t_bookType as tby
    ON tb.bookTypeId = tby.id
    
    
    3. 右连接: RIGHT JOIN    ON
    # 两张表连接查询,无论二者是否有数据缺失,一定会把右边的表数据全部显示出来
    SELECT *
    FROM t_book
    RIGHT JOIN t_bookType
    ON t_book.bookTypeId = t_bookType.id
    
    SELECT tb.bookName, tb.price, tb.author, tby.bookTypeName
    FROM t_book as tb
    RIGHT JOIN t_bookType as tby
    ON tb.bookTypeId = tby.id
    
    
    4. 全连接: UNION :
    # 两张表连接查询,无论二者是否有数据缺失,一定会都显示表数据全部显示出来
    
    SELECT tb.bookName, tb.price, tb.author, tby.bookTypeName
    FROM t_book as tb
    LEFT JOIN t_bookType as tby
    ON tb.bookTypeId = tby.id
    UNION
    SELECT tb.bookName, tb.price, tb.author, tby.bookTypeName
    FROM t_book as tb
    RIGHT JOIN t_bookType as tby
    ON tb.bookTypeId = tby.id
    
    
    SELECT tb.bookName,tb.author,tby.bookTypeName FROM t_book tb,t_bookType tby WHERE tb.bookTypeId=tby.id AND tb.price>30;
    
    
    
    - - - -  子查询
    
    1. 子查询: IN
    #在  select 语句的返回值的集合里里查找,复合集合里的数据的部分,才会匹配成功。
    SELECT *
    FROM t_book
    WHERE bookTypeId
    IN (SELECT id FROM t_bookType);
    
    
    2. 子查询: NOT IN:
    # 和  in相反,不在集合里的数据,才会匹配成功
    SELECT *
    FROM t_book
    WHERE bookTypeId
    NOT IN (SELECT id FROM t_bookType);
    
    
    3. 子查询:EXISTS 返回Bool值,如果子查询语句里查询成功,则返回True,否则返回False
    SELECT *
    FROM t_book
    WHERE EXISTS
    (SELECT * FROM t_bookType);
    
    4. 子查询:NOT EXISTS: 对子查询语句返回的结果取反。
    
    SELECT *
    FROM t_book
    WHERE NOT EXISTS
    (SELECT * FROM t_bookType);

    自关联 查询

    文件名: areas.sql

    创建数据库

    mysqlcreate database china charset utf8;

    切换数据库

    mysqluse china;

    创建表

    create table areas (
      aid int(11) primary key,
      atitle varchar(20) default null,
      pid int(11) default null
    );

    执行指定sql文件的数据插入

    mysqlsource ./Desktop/areas.sql

    查找 河北省 下面的所有城市

        SELECT city.*   
        FROM areas as city 
        INNER JOIN areas as province
        ON city.pid = province.aid  
        WHERE province.atitle='河北省' "
    
    
        SELECT city.*
        FROM areas as city 
        INNER JOIN areas as province   
        ON city.pid = province.aid  
        WHERE province.atitle='内蒙古自治区';

    查找 保定市 下面的所有区县

    select dis.*          
    FROM areas as dis     # 别名1:表示区县
    INNER JOIN areas as city  # 别名2:表示城市
    ON dis.pid=city.aid        #内连接条件:区县的pid 和 城市 aid 相同
    WHERE city.atitle = "保定市"  # 查询结果条件:城市名为 "保定市"
    
    select dis.*         
    FROM areas as dis    
    INNER JOIN areas as city 
    ON dis.pid=city.aid       
    WHERE city.atitle = "保定市" 

    事务

    事务(Transaction)是并发控制的基本单位。
    所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,
    它是一个不可分割的工作单位。
    例如,银行转帐工作:从一个帐号扣款并使另一个帐号增款,
    这两个操作要么都执行,要么都不执行。
    所以,应该把他们看成一个事务。
    事务是数据库维护数据一致性的单位,在每个事务结束时,都能保持数据一致性
    
    为什么要有事务
    事务广泛的运用于订单系统、银行系统等多种场景
    例如:
    A用户和B用户是银行的储户,
    现在A要给B转账500元,那么需要做以下几件事:
    
    检查A的账户余额>500元;
    A账户扣除500元;
    B账户增加500元;
    正常的流程走下来,A账户扣了500,B账户加了500,皆大欢喜。
    那如果A账户扣了钱之后,系统出故障了呢?
    A白白损失了500,而B也没有收到本该属于他的500。
    以上的案例中,隐藏着一个前提条件:
    A扣钱和B加钱,要么同时成功,要么同时失败。
    事务的需求就在于此
    
    事务四大特性(简称ACID)
    原子性(Atomicity):
    事务中的全部操作在数据库中是不可分割的,要么全部完成,要么均不执行
    
    一致性(Consistency):
    几个并行执行的事务,其执行结果必须与按某一顺序串行执行的结果相一致
    
    隔离性(Isolation):
    事务的执行不受其他事务的干扰,事务执行的中间结果对其他事务必须是透明的
    
    持久性(Durability):
    对于任意已提交事务,系统必须保证该事务对数据库的改变不被丢失,即使数据库出现故障
    
    事务命令
    要求:表的引擎类型必须是innodb类型才可以使用事务,这是mysql中表的默认引擎
    查看表的创建语句,可以看到engine=innodb
    
    show create table students;
    开启事务:
    执行insert、update、delete语句时,变更会维护到本地缓存中,而不维护到物理表中
    begin;
    
    提交事务:将缓存中的数据变更维护到物理表中
    commit;
    
    回滚事务:放弃缓存中变更的数据
    rollback;
    
    示例1:提交
    步骤1:打开两个终端,连接mysql,使用同一个数据库,操作同一张表
    终端1
    select * from students;
    终端2:开启事务,插入数据
    begin;
    insert into students(sname) values('张飞');
    步骤2
    终端1:查询数据,发现并没有新增的数据
    select * from students;
    步骤3
    终端2:完成提交
    commit;
    终端1:查询,发现有新增的数据
    select * from students;
    示例2:回滚
    步骤1:打开两个终端,连接mysql,使用同一个数据库,操作同一张表
    终端1
    select * from students;
    终端2
    begin;
    insert into students(sname) values('张飞');
    步骤2
    终端1:查询数据,发现并没有新增的数据
    select * from students;
    步骤3
    终端2:完成回滚
    rollback;
    终端1:查询数据,发现没有新增的数据
    select * from students;

    mysql与Python交互

    # coding=utf-8
    import MySQLdb
    
    def insert_data():
        # 指定一个SQL语句
        # 插入数据
        #sql = "INSERT INTO t_book(bookName, price, author, bookTypeId) VALUES ('三体1', 55.60, '[中]刘慈欣', 8)"
        # 更新数据
        #sql = "UPDATE t_book set price = 100.00 where bookTypeId=8"
        # 删除数据
        sql = "DELETE FROM t_book where bookName like '%三体%'"
        try:
            # 创建MySQL数据库连接对象
            conn = MySQLdb.connect(
                host = "localhost", # 指定数据库所在的ip
                port = 3306,       # 指定数据库的端口号
                user = 'root',      # 指定登录数据库的用户
                passwd = 'mysql', # 登录数据库的用户密码
                db = 'db_book',     # 指定的操作的数据库名称
                charset = 'utf8'    # 指定字符集,和数据库字符集相同
            )
    
            # 创建数据库操作游标,可以用来执行SQL语句
            cursor = conn.cursor()
            # 使用游标执行SQL语句
            cursor.execute(sql)
            # 因为在MySQL和Python交互,都是事务,所以要用commit()提交事务
            conn.commit()
        except Exception, e:
            print e
            # 如果出错,则回滚之前的操作
            conn.rollback()
        finally:
            # 先关闭游标
            cursor.close()
            # 再关闭数据库连接
            conn.close()
            print "LOG: 执行结束!"
    
    
    if __name__ == "__main__":
        insert_data()
    
    fetchall()执行查询时,获取结果集的所有行,一行构成一个元组,再将这些元组装入一个元组返回
    
    fetchone()执行查询语句时,获取查询结果集的第一个行数据,返回一个元组
    
    reCount=cur.execute('select * from admin')#返回本次操作影响的记录数  
    print reCount  
    data=cur.fetchall()#获得  'select * from admin'语句 返回的结果集  
    print data  
    cur.scroll(0,mode='absolute')#光标回到初始位置0处(绝对定位)  
    print cur.fetchone()#此时,光标位置为0;返回位置为0的记录  
    print cur.fetchone()#返回位置为1的记录  
    cur.scroll(1,mode='absolute')#光标回到1处(绝对定位)  
    print cur.fetchone()#返回位置为1的记录  
    cur.scroll(-2,mode='relative')#光标回退2步(相对定位)  
    print cur.fetchmany(3)#从光标所在的位置(此时,光标位于0处),连续读取3条记录  
    cur.scroll(1,mode='relative')#光标前进1步(相对定位)  
    print cur.fetchone()#返回光标(位于4处)指向的那一条记录 
    
    # coding=utf-8
    import MySQLdb
    
    def main():
        sql = "select *  from t_hero;"
        try:
            conn = MySQLdb.connect(
                host = "localhost", 
                port = 3306,       
                user = 'root',     
                passwd = 'mysql', 
                db = 'db_sanguo',     
                charset = 'utf8'  
                )
    
            cursor = conn.cursor()
            cursor.execute(sql)
            data = cursor.fetchall()
            for i in data:
                if list(i)[0] == 6:
                    print list(i)[0],list(i)[1]
            # cursor.scroll(6,mode='absolute')
            # cursor.scroll(2,mode='relative')
            # wer = cursor.fetchone()
            # print list(wer)[0],list(wer)[1],list(wer)[2],list(wer)[3]
            # cursor.scroll(-2,mode='relative')
            # print cursor.fetchmany(3)
            # cur.scroll(1,mode='relative')
    
            
            conn.commit()
    
    
        except Exception, e:
            print e
            # 如果出错,则回滚之前的操作
            conn.rollback()
        finally:
            # 先关闭游标
            cursor.close()
            # 再关闭数据库连接
            conn.close()
            print "LOG: 执行结束!"
    
    
    
    if __name__ == "__main__":
        main()
     

    传参的方式

      # coding=utf-8
    import MySQLdb
    
    def insert_data():
        try:
            # 创建MySQL数据库连接对象
            conn = MySQLdb.connect(
                host = "localhost", # 指定数据库所在的ip
                port = 3306,       # 指定数据库的端口号
                user = 'root',      # 指定登录数据库的用户
                passwd = 'mysql', # 登录数据库的用户密码
                db = 'db_sanguo',     # 指定的操作的数据库名称
                charset = 'utf8'    # 指定字符集,和数据库字符集相同
            )
            name = raw_input("请输入英雄的大名:")
            age = raw_input("请输入英雄的年龄:")
            wer = [name,age]
    
            # 创建数据库操作游标,可以用来执行SQL语句
            cursor = conn.cursor()
            # 使用游标执行SQL语句
            qw = cursor.execute("insert into t_hero(name,age) values(%s,%s)",wer)
            print qw
            # 因为在MySQL和Python交互,都是事务,所以要用commit()提交事务
            if qw = 1:
              conn.commit()
        except Exception, e:
            print e
            # 如果出错,则回滚之前的操作
            conn.rollback()
        finally:
            # 先关闭游标
            cursor.close()
            # 再关闭数据库连接
            conn.close()
            print "执行结束!ok"
    
    
    if __name__ == "__main__":
        insert_data()

    私有化

    # coding = utf-8
    
    class Test():
      def __init__(self):
          self.num = 10
          self.__string = "hello world"
    
      def __PrivateFunc(self):
          print self.num
          print self._string
    
      def PublicFunc(self):
          print self.num
          print self._string
    
    if __name__ == "__main__":
        t = Test()
        #t.PublicFunc()
        #print t.num
    
        #t.__PrivateFunc()
        print t._string

     

  • 相关阅读:
    织梦会员注册邮箱验证发送邮件配置教程
    垃圾回收
    0910
    0909
    vs2008 打包中添加卸载工具
    CLR
    委托
    软考之存储方式
    软考之面向对象-关系
    软考之合同法
  • 原文地址:https://www.cnblogs.com/zhichao123/p/11252910.html
Copyright © 2011-2022 走看看