补充:
exist存在EXISTS关字键字表示存在。在使用EXISTS关键字时,内层查询语句不返回查询的记录,而是返回一个真假值,True或False。
当返回True时,外层查询语句将进行查询当返回值为False时,外层查询语句不进行查询。
select * from emp where exists (select id from dep where id > 203);
一。NAVICAT
navicat是一个数据库管理工具,可以管理数据库,简化数据库的操作。
下载地址:https://pan.baidu.com/s/1bpo5mqj
navicat需要熟悉以下操作:
#1. 测试+链接数据库 #2. 新建库 #3. 新建表,新增字段+类型+约束 #4. 设计表:外键 #5. 新建查询 #6. 建立表模型 #注意: 批量加注释:ctrl+?键 批量去注释:ctrl+shift+?键
之前哪些语句都被navicat给封装了,点点鼠标就可以操作数据库。
在这里要注意,建立数据库时要选择编码utf8,而utf8mb4可以存表情。
设置主键的时候不要忘记自增选项:
二。pymysql
在pycharm中有专门与mysql连接的模块,就是pymysql。
下载模块后,就可以编写语句连接数据库了:
conn = pymysql.connect( host = '127.0.0.1', port = 3306, user = 'root', password = '123456', database = 'day38', charset = 'utf8' )
导入模块之后,先使用connect关键字配置数据库连接,
通过连接可以设置光标cursor执行语句:
cursor = conn.cursor(pymysql.cursors.DictCursor) sql = 'select * from teacher' res = cursor.execute(sql)
其中pymysql.cursors.DictCursor是将输出的结果打印成字典格式
cursor.execute()执行SQL语句
cursor.fetchone()取出一条语句
cursor.fetchall()取出所有语句,以列表+字典形式输出
cursor.scroll(1,‘absolute’)将光标滚动至第一条数据后,绝对位置
cursor.scroll(1,‘relative‘)将光标向后滚动一行,相对位置
三。sql注入问题。
利用下述的方法,可以实现用户的注册于登录,但是原理是将用户直接输入的字符串拼接后放入sql语句中执行。
name = input('用户名>>>:') pwd = input('密码>>>:') sql = "select * from user where name = '%s' and password = '%s'"%(name,pwd) res = cursor.execute(sql) if res: print(cursor.fetchall())
但是,当用户输入一些sql特殊意义的字符也会照样执行,比如:‘or 1=1 -- ",就可以将用户所有的数据都打印出来,为了解决这方法,pymysql有特有的方法:
name = input('用户名>>>:') pwd = input('密码>>>:') sql = "select * from user where name = %s and password = %s" res = cursor.execute(sql,(name,pwd)) if res: print(cursor.fetchall())
execute除了执行sql语句之外,还可以拼接sql中的%s字符串,可以自动识别sql中%s替换成输入的内容,而不需要“”
四。pymysql增删查改问题
在pycharm中使用增删改操作时,如果不加入conn.commit,就不能进行操作,需要加这个语句才行,而且每次操作都要使用。
sql2 = "insert into user(name,password) values('lzx32','1233')" res = cursor.execute(sql2) conn.commit()
这样是比较烦的,但是可以设置自动的。
conn = pymysql.connect( host = '127.0.0.1', port = 3306, user = 'root', password = '123456', database = 'day38', charset = 'utf8', autocommit = True )
在连接中设置autocommit恒等于True就行。