一、子查询

子查询嵌入到其他查询语句中查询语句,子查询只能出现在from,where中 子查询不要用select *,exists除外

select title
from forum
where uid in (select id from php_user where name='王琨' );

二、多表查询

多表连接必须要有连接条件,否则结果没有意义 多表连接有两种写法:隐式(标准sql)和显式内连接

隐式(标准sql)连接 : 连接条件写到where字句中

“`
select title,content,name,publish_time
from user u,forum f #给表起一个别名,方便书写
where u.id = f.uid; 在where写链接条件
select title,content,name,publish_time
from user u,forum f
where u.id = f.uid and name=’王琨’;
select a.username,b.name ,c.title
-> from bbs_user a,bbs_category b,bbs_forum c
-> where b.cid = c.cid and c.uid = a.uid;
“`
显示内连接(inner join)
mysql> select a.uid,username,title,content
-> from bbs_user a inner join bbs_forum b on a.uid =b.uid #关联条件
-> where a.uid < 5; #过滤条件
select username,name,title
-> from bbs_user a inner join bbs_forum c on c.uid =a.uid
-> inner join bbs_category b on c.cid = b.cid;

表的自身连接

“`
select c2.name
from category c1,category c2
where c1.pid = c2.cid;

//表的字段可以直接连接

select * from zzl_student where sno = monitor and class=’95031’;

“`

三、外连接

两张表关联查询时,根据以那种表为主可以分为左外连接和右外连接

左外连接

以左表为主,如果右边的表里没有匹配的记录,则添加一个万能记录(各个字段都为null)与之连接

select *

from user u left join forum f

on u.id =f.uid;

右外连接

以右表为主,如果左边的表里没有匹配记录,则增加一个万能记录与之连接

四、集合操作

可以使用union将两个查询结果合并,mysql只支持并,不支持差和交

两个结果集中字段数一样,对应字段类型兼容 自动去除重复记录,不去除重复记录可以用 union all

order by 放到最后
select * from student where class = '95031'
union all
select * from student where ssex='女';

五、数据控制

5.1 事务

事务把一组操作看做一个整体,要不都操作成功,要不都操作失败 。

表的数据库引擎必须是innodb,innodb支持事物,myisam不支持事务

修改表引擎:alter table 表名 engine = innodb
“`~
查询是否为自动提交
select @@autocommit (1为自动提交 0为手动提交)
关闭自动提交
set autocommit = 0
start transaction /begin
一组操作
commit/rollback
commit 提交 会把数据写到硬盘
rollback 回滚 撤销操作
“`~
5.2 授权管理(了解)
创建用户
create user '用户名'@'服务器地址' identified by '密码'
删除用户
drop user '用户名'@'服务器地址'
修改密码
修改当前登录用户
set password = password('123456');
一般管理员可以修改任意用户密码
set password for 'db'@'localhost' = password('2333');
刷新
flush privileges
授权
grant 权限 on 数据库.表 to '用户名'@'服务器地址'
grant all on *.* to 'dd'@'localhost'
*.* 所有数据库的所有表
all 代表所有权限
权限包括:select、update、delete、alter
回收
revoke select on test.stars from 'db'@'localhost';
六、索引
索引就像图书的目录,可以加快查询速度
where和order by经常出现的字段可以添加索引 频繁修改、删除、插入的表不要加索引 索引会占用磁盘空间
普通索引
create index 索引名 on 表名(字段 asc/desc) 默认asc升序
唯一索引
在唯一索引所在列不能有重复值,增加和修改会受影响。
create unique index 索引名 on 表名(字段 asc/desc) 默认asc升序
主键索引
创建表,主键索引会自动添加,要求在主键上不能有重复值,不能有空值
全文索引(了解)
一般会用全文索引服务器,不会直接创建全文索引
create FULLTEXT index 索引名 on 表名(字段 asc/desc)
删除索引
drop index 索引名 on 表

查看索引

show index from 表
其它创建索引的方式
alter table 表 add index(字段1,字段2,...)
alter table 表 add primary key(字段1,字段2,...)
alter table 表 add unique(字段1,字段2,...)
alter table 表 add fulltext(字段1,字段2,...)

七、外键

如果表A的主关键字是表B中的字段,则该字段称为表B的外键,表A称为主表,表B称为从表

数据库引擎必须是innodb 主表和从表相关的外键字段类型必须兼容

创建外键

ALTER TABLE 从表名

ADD CONSTRAINT 外键名称 FOREIGN KEY (从表的外键列) REFERENCES 主表名 (主键列)
[ON DELETE reference_option]
[ON UPDATE reference_option]
reference_option:

RESTRICT | CASCADE | SET NULL | NO ACTION

1. CASCADE: 从父表中删除或更新对应的行,同时自动的删除或更新子表中匹配的行。ON DELETE CANSCADE和ON UPDATE CANSCADE都被InnoDB所支持。

2. SET NULL: 从父表中删除或更新对应的行,同时将子表中的外键列设为空。注意,这些在外键列没有被设为NOT NULL时才有效。ON DELETE SET NULL和ON UPDATE SET SET NULL都被InnoDB所支持。

3. NO ACTION: InnoDB拒绝删除或者更新父表。

4. RESTRICT: 拒绝删除或者更新父表。指定RESTRICT(或者NO ACTION)和忽略ON DELETE或者ON UPDATE选项的效果是一样的。

删除外键

ALTER TABLE 从表 DROP FOREIGN KEY 外键名

八、视图

有时候经常会遇到复杂的查询,写起来比较麻烦,这时候我们可以使用视图简化查询。视图就是固化的sql语句,可以不把视图当做基本表使用

不要在视图上进行增、删、改

创建视图

create view 视图名(字段列表) as

select子句

删除视图

drop view 视图名

九、pymysql操作mysql数据库

安装pymysql

pip install pymysql

9.1 pymysql操作数据库的五行拳

连接数据库

使用Connect方法连接数据库

pymysql.Connections.Connection(host=None, user=None, password='', database=None, port=0, charset='')

参数说明:

host – 数据库服务器所在的主机。

user – 登录用户名。

password – 登录用户密码。

database – 连接的数据库。

port – 数据库开放的端口。(默认: 3306)

charset – 连接字符集。

返回值:

返回连接对象

例子:

link = pymysql.Connect(host='localhost', port=3306, user='root', password='123456', db='zzl', charset='utf8')

连接对象方法

方法

说明

begin()
开启事务
commit()
提交事务
cursor(cursor=None)
创建一个游标用来执行sql语句
rollback()
回滚事务
close()
关闭连接
select_db(db)

选择数据库

2. 创建游标

cursor = link.cursor()
print(cursor.rowcount) #打印受影响行数
方法
说明
close()
关闭游标
execute(query, args=None)
执行单条语句,传入需要执行的语句,是string类型;同时可以给查询传入参数,参数可以是tuple、list或dict。执行完成后,会返回执行语句的影响行数。
fetchone()
取一条数据
fetchmany(n)
取多条数据
fetchall()
取所有数据
3. 执行sql语句
# 执行sql语句
sql = 'select * from user1'
# 执行完sql语句,返回受影响的行数
num = cursor.execute(sql)
获取结果集
result1 = cursor.fetchone()
print(result1)
关闭连接
cursor.close()
link.close()
注意:
写完代码后,需要将py文件添加可执行权限
sudo chmod +x conndb.py
./conndb.py
9.2 pymysql中事务处理
pymysql默认是没有开启自动提交事务,所以我们如果进行增、删、改,就必须手动提交或回滚事务。
sql = 'delete from user where id=%s' % user_id
# 如果要执行增删改语句的时候,下面的就是固定格式
try:
cursor.execute(sql)
# 如果全部执行成功,提交事务
link.commit()
print(cursor.lastrowid) #获取最后插入记录的自增id号
except Exception as e:
print(e)
link.rollback()
finally:
cursor.close()
link.close()