查询关键字
limit 分页 :限制数据的显示行数
limit 数字1 :从第0行开始到第一个数字的行
limit 数字1 数字2 :从数字1行开始,显示数字2个行
多表查询
连表操作
两个表拼接在一起 然后单表查询 on 指定两个表拼接的依据 那个字段相等
inner join 内连接
left join 左连接
right join 右连接
select * from emp inner join dep on emp.dep_id = dep.id;
子查询
一条sql语句的查询结果用于另一条sql语句的条件
#分布操作 先干这个 在干那个
可视化软件使用
能够充当数据库客户端的可视化软件其实也有很多
操作MySQL最为方便的当属Navicat(收费 破解版)
"""该软件底层操作其实还是SQL语句"""
1.连接数据库
2.查看数据库 表 记录
3.创建数据库 表 记录
4.设计表
5.添加外键(还支持修改SQL)
6.逆向数据库到模型
7.转储SQL文件
-- 7、 查询没有报李平老师课的学生姓名
#需要老师表 课程表 成绩表 学生表
#先找李平老师课程id
-- select course.cid from teacher INNER JOIN course on teacher.tid=course.teacher_id WHERE teacher.tname='李平老师'
#通过课程id去成绩表找上了李平老师课程的同学id
-- select distinct student_id from score where course_id in (select course.cid from teacher INNER JOIN course on teacher.tid=course.teacher_id WHERE teacher.tname='李平老师')
#通过id 去找没有
-- 8、 查询没有同时选修物理课程和体育课程的学生姓名
#需要三张表
#先找物理课和体育课程的课程id
-- select cid from course WHERE cname in ('物理','体育')
#在成绩表找有 物理课程和体育课程学生的id
-- select student_id as a1 from score WHERE course_id in (select cid from course WHERE cname in ('物理','体育')) GROUP BY student_id having COUNT(course_id)=1
-- select sname from student where sid in (select student_id as a1 from score WHERE course_id in (select cid from course WHERE cname in ('物理','体育')) GROUP BY student_id having COUNT(course_id)=1
-- )
--
-- 9、 查询挂科超过两门(包括两门)的学生姓名和班级
#两张表
#先找挂科超过两门的学生id
-- select student_id from score where num <60 GROUP BY student_id HAVING count(num)>=2
#通过班级id 找对应班级
select student.sname,class.caption from class INNER JOIN student on student.class_id=class.cid where student.sid in (select student_id from score where num <60 GROUP BY student_id HAVING count(num)>=2)
python 也叫做 胶水语言、调包侠(贬义词>>>褒义词)
python厉害的是他的模块、软件
#python代码操作mysql 主要使用了一个叫做 pymysql的模块
import pymysql #导入pymysql模块
#定义一个连接对象
conn=pymysql.connect(
host='127.0.0.1',
port=3306,
user='root',
password='123',
charset='utf8', #这里不能写utf-8 语法规范
database='db5_1'
)
#定义一个游标 类似于cmd mysql 里面等你输入sql语句的命令行 (里面的保证了cursor.fetchall 获取的是字典)
cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)
#定义sql语句
sql="select * from userinfo"
#执行sql语句
aa=cursor.execute(sql) #返回值是受影响的行数 execute 执行sql语句
print(aa)
#获取执行结果 是服务端返回给我们的结果 再进行二次过滤,获取全部 或者一行或者几行 取文件是根据光标取得 读取一次光标移动一次
cursor.scroll(1,'relative') #相对当前位置移动一格 光标在1 获取是从2开始获取
# cursor.scroll(0,'absolute') #相对开始位置移动0格
#res=cursor.fetchall() #fetchall 获取执行结果 返回列表套字典
#res=cursor.fetchone() #fetchone 获取返回结果的第一行数据 返回字典
res=cursor.fetchmany(2) #fetchmany 获取执行结果两行 数字是几就返回几行 返回列表套字典
print(res)
import pymysql #导入pymysql模块
#定义一个连接对象
conn=pymysql.connect(
host='127.0.0.1',
port=3306,
user='root',
password='123',
charset='utf8', #这里不能写utf-8 语法规范
database='db5_1'
)
#定义游标对象
cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)
while True:
#获取用户名密码
#sql注入其实就是通过一些特殊符号的组合,达到某些特定目的,避免常规的逻辑
username=input('请输入用户名:').strip() #zhang '-- asdasdasd 发现输入用户名就可以登录
password=input('请输入密码:').strip() # zhang ' or 1=1 -- asdasdasd 用户名错误可以登录
#组成sql语句 核心数据不要自己拼接 交给execute方法来筛选拼接 只支持%s
# sql="select * from userinfo where name='%s' and password='%s'"%(username,password)
sql="select * from userinfo where name=%s and password=%s"
print(sql)
#判断是否存在 excute 可以解决sql注入问题
res=cursor.execute(sql,(username,password))
res1=cursor.fetchall()
if res1 : #res 或者res1 都可以 返回值
print("登陆成功")
else:
print('账号或者密码错误')
import pymysql #导入pymysql模块
#定义一个连接对象
conn=pymysql.connect(
host='127.0.0.1',
port=3306,
user='root',
password='123',
charset='utf8', #这里不能写utf-8 语法规范
database='db5_1',
autocommit=True #二次确认增删改操作
)
#定义游标
cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)
#编写sql语句
sql1='select * from userinfo'
sql2='insert into userinfo(name,password) values(%s,%s)'
sql3='update userinfo set name=%s where id=1'
sql4='delete from userinfo where id=2'
#执行sql语句
# cursor.execute(sql1)
#cursor.executemany(sql2,[('zhang111',123),('zhang222',321),('zhang333',222)])
# #多次执行一条sql语句 比如添加 但是添加内容不同 可以用这个
res=cursor.execute(sql2,('uzi',666))
#
# res=cursor.execute(sql3,('rng'))
#
# res=cursor.execute(sql4)
#获取执行结果
res1=cursor.fetchall()
print(res)
print(res1)
conn.close
def register(cursor):
#获取用户名密码
username=input('请输入你要注册的用户:').strip()
#先判断用户是否存在
sql='select * from userinfo where name=%s'
cursor.execute(sql,(username,))
res=cursor.fetchall()
#如果不存在
if not res:
#设置添加sql语句
password = input('请输入密码:').strip()
sql1 ='insert into userinfo(name,password) values(%s,%s)'
cursor.execute(sql1,(username,password))
print('用户%s注册成功'%username)
else:
print('用户已存在')
def login(cursor):
#获取用户名
username=input('请输入你要登录的用户:').strip()
#查询用户名是否存在
sql='select * from userinfo where name=%s'
#执行sql语句
cursor.execute(sql,(username,))
res=cursor.fetchall()
if res:
password = input('请输入密码:').strip()
sql1='select * from userinfo where name=%s and password=%s'
cursor.execute(sql1,(username,password))
res1=cursor.fetchall()
if res1:
print('用户%s登录成功'%username)
else:
print('密码错误')
else:
print('用户%s不存在'%username)
# def login(cursor): #第二种登录方法
# # 获取用户名和密码
# username = input('username>>>:').strip()
# password = input('password>>>:').strip()
# # 先获取是否存在用户名相关的数据
# sql = 'select * from userinfo where name=%s'
# cursor.execute(sql, (username,))
# res = cursor.fetchone()
# #res = cursor.fetchall()
# #也可以写fetchall 那样得到的就是一个列表套字典
#
# if res:
# # 校验密码
# # real_dict = res[0] #列表第一个元素取出来,是一个字典
# # if password == str(real_dict.get('password')): 获取字典的key==password和输入的密码比较
# if password == str(res.get('password')):
# print('登录成功')
# else:
# print('密码错误')
# else:
# print('用户名不存在')
def loginout(cursor):
print('退出成功')
exit()
def get_conn():
import pymysql
#创建连接对象
conn=pymysql.connect(
host='127.0.0.1',
port=3306,
user='root',
password='123',
charset='utf8',
database='db5_1',
autocommit=True
)
#创建游标对象
cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)#数据自动组织成字典
return cursor
func_dic={
'1':register,'2':login, '3' : loginout}
while True:
print('''
1.注册功能
2.登录功能
3.退出
''')
cursor=get_conn()
choise= input("请输入你选择的功能:").strip()
if choise in func_dic:
func_name=func_dic.get(choise)
func_name(cursor)
else:
print("你输入的编号有误,请重新输入")