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;

建立表mysql

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 = "保定市" 

事务sql

事务(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
相关文章
相关标签/搜索