sql相关

关系型数据库

mysql
理论基础:关系代数 + 集合论
特点:用二维表组织数据
行 - 记录
列 - 字段
主键 - 唯一性确定一条记录的列
特点:
组织和管理数据 方便CRUD操作(增查改删) 
能够避免重复无效的数据
编程语言:SQL(结构化查询语言)
多的一方添加外键列

非关系型数据库


关系型数据库的数据完整性


-- 1、实体完整性 - 每个实体都是独一无二的、没有冗余的记录(每条记都是独一无二的)
-- 实体完整性依靠主键 / 唯一索引 / 唯一约束来保证
-- 2、参照完整性(也叫引用完整性) - 列的数据要参照其他表的列的数据(主键)
-- 依靠外键
-- 3、域完整性 - 表中的数据都是有效的数据
-- 依靠数据类型 / 非空约束 / 默认值约束 / 检查约束(mysql中不生效)

数据库就是用来存储数据的,一个数据库就是一个完整的业务单元,可以包含多张表,数据被存储在表中

数据库解决的问题:持久化存储,优化读写,保证数据的有效性

数据库主要分为两类

1.文档型 :如sqlite,就是一个文件,通过对文件的赋值完成对数据库的复制

2.服务器型:如mysql、postgre。数据存储在一个物理文件中,但是需要使用中断以tcp/ip协议进

行连接,进行数据的读写操作

数据库的三范式

第一范式:列不可拆分

第二范式:唯一标识

第三范式:引用主键

当前的物理数据库都是按照E-R模型进行设计的,其中E代表实体,R代表关系,关系描述两个实体之间的对用规则,包括一对一、一对多、多对多

主要操作

	数据库的操作:包括创建、删除

	表的操作:包括创建、修改、删除

	数据的操作:包括增(insert)、删(delete)、改(update)、查(select),简称

能存储的数据类型

1.数字:int、decimal      decimal(5,2)表示一个五位数,小数包含2位,这里的5和2是指最大能表

	示的位数,小于也是能表示的

2.字符串:char、varchar、text 

	varchar是可变的,例如varchar(10)   “12345”,char(10) "12345     "

	text存的是大量的字符串

3.日期:datetime

4.希尔:bit      只有0和1
数据自增长:collid int not null auto_increment comment '学院编号'

当前时间的获取selectdate datetime comment '选课时间日期',     now()

约束

1.主键是唯一的    只能有一个

2.非空not null

3.唯一unique   可以有多个,物理上存储的结构室友主键维护的

4.默认default   

5.外键:foreign key

6.自参照约束  参照同一表中的其他列

图形窗口操作

创建数据库、创建表、添加字段、逻辑删除(一般在数据库中不直接删除数据,直接删除的数据不

	不能找回,一般都是采用逻辑删除-----新建一个bit类型的字段,设置0位不删除,1为删除,查看

	的时候进行过滤就行了)

Mysql基本命令

​ 1、启动服务:net start 数据库名

​ 2、停止服务

​ 3、连接数据

​ 输入密码

​ 4.退出登录(断开连接)

​ quit或者exit

-- SQL (Structured Query Language)
-- DDL (Data Definition Language) - 数据表和数据库
-- create / drop / alert
-- DML (data Manipulation Language) - 数据
-- insert / delete / update
-- DQL (Data Query Language) -- 查询
-- selsect
-- DCL (Data Control Language) -- 权限
-- grant(授权) / revoke(召回权限) 

数据库操作

1、创建数据库


-- 创建名为school的数据库并设置默认字符集为utf-8
create database school default charset utf8;

2、删除数据库

drop database 数据库名 -- 如果数据库不存在则报错
-- 如果存在名为school的数据库就删除它
drop database if exists school;

表操作

1、查看当前数据库中所有表

​ show tables;

2、创建表

CREATE TABLE table_name (column_name column_type);


-- 创建学生表(td_student)
create table td_student
(
stuid int not null, -- not null:非空约束
stuname varchar(4) not null,
stusex bit default 1, -- default 1:默认约束,默认为1
stuaddr varchar(50),
primary key (stuid) -- 主键约束
);

3、删除表

​ DROP TABLE 表名

-- 删除数据表,如果没有数据表则报错
-- drop table tb_student;
-- 如果有数据表则删除。没有则不删除
-- drop table if exists tb_student;

​ 4、查看表结构

​ 5、查看建表语句

​ 6、重命名表名

4、修改表

-- 修改名为td_student的表,添加行stutel
alter table td_student add stutel char(11);
alter table td_student add column stutel char(11);  -- 不加column也行
-- 修改名为td_student的表,删除行名为stutel的行
alter table td_student drop stutel
alter table td_student drop column stutel;
修改列[modife 列名]
alter table 表名 modify 列名 新类型 新参数【修改列类型】
例:alter table test modify gender char(4) not null default '';
②alter table 表名 change 旧列名 新列名 新类型 新参数【修改列名和列类型】
例:alter table test change pid uid int unsigned not null default 0;

删除表的几种情况

drop table 表名:删除全部数据和表结构,立刻释放磁盘空间
truncate table 表名 : 删除表全部数据,保留表结构,立刻释放磁盘空间 
delete from 表名 : 删除表全部数据,表结构不变
delete from table_name where 条件 : 带条件的删除,表结构不变
delete 操作以后,使用 optimize table table_name 会立刻释放磁盘空间
delete from 表以后虽然未释放磁盘空间,但是下次插入数据的时候,仍然可以使用这部分空间。
总结:
1、当你不再需要该表时, 用 drop;
2、当你仍要保留该表,但要删除所有记录时, 用 truncate;
3、当你要删除部分记录时, 用 delete。

数据的操作

对数据进行查询的时候,需要考虑完善(有时当值为NULL时,数据不会被查询出来,但是我们需要统计它的个数或者值为0,此时可以使用ifnull(列,0) -- 当列的值为NULL时,让他的值为0,有时查询最大的值,但是可能最大值的个数不一定只有一个,此时不能使用limit 1取第一个)

INSERT INTO table_name

       ( field1, field2,...fieldN ) 

        VALUES                      

       ( value1,   value2,...valueN );

delete 语句用于删除表中的数据, 基本用法为:

	delete from 表名称 where 删除条件;

	以下是在表 students 中的实例:

	删除 id 为 3 的行: delete from students where id=3;

	删除所有年龄小于 21 岁的数据: delete from students where age<20;

	删除表中的所有数据: delete from students;
	
	删除一个范围里的数据:delete from students where stuid between 1001 and 1010;

update 表名称 set 列名称=新值 where 更新条件;  ------------------ 更新条件不写就是默认修改所有列的值
当我们需要将字段中的特定字符串批量修改为其他字符串时,可已使用以下操作:
以下实例将更新 runoob_id 为 3 的runoob_title 字段值的 "C++" 替换为 "Python":
UPDATE runoob_tbl SET runoob_title = REPLACE(runoob_title, 'C++', 'Python') where 
runoob_id = 3;

SELECT column_name,column_name 

	FROM table_name 

	WHERE Clause[ OFFSET M]

	
  • 查询语句中你可以使用一个或者多个表,表之间使用逗号(,)分割,并使用WHERE语句来设定查询条件。
  • SELECT 命令可以读取一条或者多条记录。
  • 你可以使用星号(*)来代替其他字段,SELECT语句会返回表的所有字段数据
  • 你可以使用 WHERE 语句来包含任何条件。
  • 你可以使用 LIMIT 属性来设定返回的记录数。
  • 你可以通过OFFSET指定SELECT语句开始查询的数据偏移量。默认情况下偏移量为0。
  • select * : 返回所有记录
  • ** limit N : 返回 N 条记录
  • ** offset M : 跳过 M 条记录, 默认 M=0, 单独使用似乎不起作用
  • ** limit N,M : 相当于 offset N limit M , 跳过 N 条记录开始, 返回 M 条记录
link从句:SQL LIKE 子句中使用百分号 %字符来表示任意字符,类似于UNIX或正则表达式中的星号 *。

如果没有使用百分号 %, LIKE 子句与等号 = 的效果是一样的。

以下是我们将 runoob_tbl 表中获取 runoob_author 字段中以 COM 为结尾的的所有记录:
mysql> SELECT * from runoob_tbl  WHERE runoob_author LIKE '%COM';
以下是 SQL SELECT 语句使用 LIKE 子句从数据表中读取数据的通用语法:

SELECT field1, field2,...fieldN 
FROM table_name
WHERE field1 LIKE condition1 [AND [OR]] filed2 = 'somevalue'

like 匹配/模糊匹配,会与 % 和 _ 结合使用。

'%a'     //以a结尾的数据
'a%'     //以a开头的数据
'%a%'    //含有a的数据
'_a_'    //三位且中间字母是a的
'_a'     //两位且结尾字母是a的
'a_'     //两位且开头字母是a的
查询以 java 字段开头的信息。
SELECT * FROM position WHERE name LIKE 'java%';

查询包含 java 字段的信息。
SELECT * FROM position WHERE name LIKE '%java%';

查询以 java 字段结尾的信息。
SELECT * FROM position WHERE name LIKE '%java';

投影和别名(as) -- as可以省略

-- 投影就是可以在selec和from之间添加列名,查找特定数据
select stuid, stuname stusex from tb_student;
-- 别名查询----- 列被别名后在查询时会显示被修改后的名字
select stuid as 学号, stuname as 姓名, stusex as 性别
from tb_student;

别名的高级用法

1、case stusex when 1 then '男' else '女' end as 性别 -- 将stusex作为实例,当stusex的值为1时,那么将其别名为男,否则将其别名为女,end表示结束,最后将stusex别名为性别
-- case when then else end 通用于所有数据库
select stuid as 学号, stuname as 姓名, 
case stusex when 1 then '男' else '女' end as 性别
from tb_student;

2、if(列名, name1, name2) -- 此时的列名是bit值,当为1是别名为name1,为0时别名为name2
-- if不通用于其他数据库,只能用于mysql

处理查询结果时的运算

-- 处理查询结果,可以对数据进行运算处理(加减乘除)
select stuid*2 as 学号, stuname as 姓名, 
if(stusex, '男', '女') as 性别
from tb_student

筛选

-- 通过where 条件对查询结果进行筛选
-- mysql中的逻辑运算符 >、>=、<、<=、=、<>

-- 查询学号为1001的学生的所有信息
select * from tb_student where stuid=1001;

-- 投影 别名 筛选
select stuname as 姓名, stuaddr as 籍贯 
from tb_student where stuid=1001;

-- 当判断条件有多个时,需要用and或者or进行连接
-- 查找学号为1001到2000之间的学生
select stuname as 姓名, stuaddr as 籍贯 from tb_student 
where stuid>1001 and stuid<2000;

-- 查询学号为1001或者学号大于2000的学生信息
select stuid as 学号, stuname as 姓名, stuaddr as 籍贯 from tb_student 
where stuid=1001 or stuid>=2000;

-- 查询一个范围的数据 -- between a and b -- 查询a-b之间的数据
-- 会查询到1000和2000之间的所有学生,包括1001和2000
select stuid as 学号, stuname as 姓名, stuaddr as 籍贯 from tb_student 
where stuid between 1001 and 2000;

-- 查询在一个元祖中的数据 in ()
-- 查询学号在1001,1002,1003组合中的学生的信息
-- select stuid as 学号, stuname as 姓名, stuaddr as 籍贯 from tb_student 
where stuid in (1001,1002,1003);

-- 当值为null时,不能用=、或者<>去判断,应该使用is null 和 is not null
-- 查询学生姓名、课程名称以及考试成绩
select stuname, cname, score from tb_student, tb_course,tb_score
where stuid=sid and courseid=cid and score is not null;

排序

- 排序
-- 默认为esc,升序
select * from tb_student order by stubirth;
-- 降序排序
select * from tb_student order by stubirth desc;
-- 排序可以执行多个排序,先按第一个关键字排序,然后依次排后面的关键字
select * from tb_student order by  
stusex asc, stubirth desc;

分组查询

-- 分组查询
--分组后的筛选不能用where,需要用 having 
select case stusex when 0 then '女' else '男' end as 性别, count(stusex)
from tb_student
group by stusex;

-- 查找男生和女生中各自生日最小的
select case stusex when 0 then '女' else '男' end as 性别, min(stubirth) as 出生日期
,stuname from tb_student
group by stusex;

-- 查找学生课程编号对应的平均分
select cid, avg(score) from tb_score group by cid

-- 按照学号和平均分查找
select sid as '学号', avg(score) as '平均成绩' from tb_score group by sid;

-- 查询平均成绩大于等于80分的学生的学号和平均成绩
select sid, avg(score) as avg from tb_score  -- 加前缀,表名查的是sec中的表
where sid between 1000 and 1999
group by sid  having avg>=80 
order by avg desc;

分页查询

-- 查询年龄最大的3名学生信息
-- limit 限制 --- mysql特有
select * from tb_student order by syubirth limit 3;

-- offset 偏移量
-- 跳过6个取三个
select * from tb_student order by syubirth limit 3
offset 6;

-- 跳过10个取3个,如果超出会取到能取的数据,不会报错
select * from tb_student order by syubirth limit 3
offset 10;

-- 跳过6个取4个
select * from tb_student order by syubirth limit 6,4;

子查询

-- 子查询(把一个查询的结构作为另外一个查询的结构的一部分来使用)
-- 查询年龄最大的学生的姓名
select stuname from tb_student where stubirth=(
select min(stubirth) from tb_student);

-- 查询选修了Python程序设计的最高分的学生的姓名
select stuname from tb_student where stuid in 
(select sid from tb_score where score=(select 
max(score) from tb_score where cid=(select 
courseid from tb_course where cname='Python程序设计')) and 
cid=(select courseid from tb_course where cname='Python程序设计'));

-- 查询选了三门及以上的课程的学生姓名
select stuname from tb_student where stuid in (
select sid from tb_score group by sid having count(sid)>=3);

需要查询的数据在多个表时

-- 连接查询的时候,将大表放左表中,小表放右表中
可以通过以下方法进行查询:
1、外键进行连接查询
-- 没有加限定就是笛卡尔积
select cname, ccredit, tname, ttitle from tb_course,tb_teacher;

-- 通过外键进行连接查询 --- 需要进行条件判断
-- 查询课程名称、学分、授课老师的名字和职称
select cname, ccredit, tname, ttitle from tb_course,tb_teacher
where tid=teacherid;

-- 查询学生姓名、课程名称以及考试成绩
-- 和null做比较时,不能使用=和<> -- 要使用is null 和 is not null
select stuname, cname, score from tb_student, tb_course,tb_score
where stuid=sid and courseid=cid and score is not null;

-- 查询选课学生的姓名和平均成绩
-- 创建一个临时表,放在主查询中
select stuname,avgg from tb_student inner join 
(select sid, avg(score) as avgg from tb_score group by sid) as tb_nco
where stuid=sid;

2、内连接 -- inner join on
-- 内连接不能查到数据为null的数据
-- 查询课程名称、学分、授课老师的名字和职称
select cname, ccredit, tname, ttitle from tb_course
inner join tb_teacher on tid=teacherid;

-- 查询学生姓名和所在学院的名称
-- 两个表的关联列名相同,所以需要对表进行别名,用来区分
select stuname, collname from tb_student t1 inner join
tb_college t2 on t1.collid=t2.collid;

-- 查询学生姓名、课程名称以及考试成绩
-- 和null做比较时,不能使用=和<> -- 要使用is null 和 is not null
-- 两张表的中间表在中间
select stuname, cname, score from tb_student inner join 
tb_score on stuid=sid inner join tb_course on courseid=cid
where score is not null;

-- 查询每个学生的姓名和选课数量
-- 内连接 --- 不能查到选课为0的学生
select stuname, ifnull(total,0) from tb_student inner join
(select sid, count(sid) as total from tb_score group by sid)
as tb_temp on stuid=sid;
3、外连接
-- 外连接分为左连接、右连接、全连接(前面的为左,后面的为右,全连接是左右都选) 
-- 左外连接 -- left outer join -- 可以将左边(也就是前面)的表中不满足条件的记录也要提出来)
-- 右外连接 -- right outer join -- 可以将右边(也就是后面)的表中的不满足条件的记录也提出来
-- 注意 -- mysql不支持全连接 -- full outer join

-- 查询每个学生的姓名和选课数量
-- 左外连接 --- 可以查到查到选课为0的学生
select stuname, ifnull(total, 0) as '选课数量' from tb_student left outer join
(select sid, count(sid) as total from tb_score group by sid)
as tb_temp on stuid=sid;

查询的效率

-- 一般情况下不推荐使用去重(distinct)和集合(in ();),当数据多的时候,效率会很低
select distinct mgr from tbemp where mgr is not null;
-- 推荐使用exists / not exists取代in / not in和distinct查询,效率高
-- 查询到表行数个'x'
select 'x' from tbemp;

-- 查询主管的姓名和职位
select ename, job from tbemp t1 where exists (select 'x'
from tbemp t2 where t1.empno=t2.mgr);

聚合函数

-- 聚合函数(max/min/sum/avg/count)
-- 支持任何关系型数据库
-- 统计所有学生的个数
select count(stuid) from tb_student;
-- 统计学生中的女生的个数
select count(stuid) from tb_student where stusex=0;

-- 求平均数
select avg(score) from tb_score where cid=1111;

-- 求最大分数
select max(score) from tb_score where cid=1111;

-- 求成绩的总数
select sum(score) from tb_score where cid=1111;

-- 求最小分数
select min(score) from tb_score where cid=1111;

-- 求生日最大的
select max(stubirth) from tb_student ;

-- 求生日最小的
select min(stubirth) from tb_student;

约束


SQL Server 常见五种约束:
   外键约束和自我参照约束一般可以不加就不加,因为有外键或者自己参照的数据库在操作数据的时候,会联动到其他的数据,导致数据库性能低下。
  Primary Key  --主键约束
  Foreign Key  --外键约束
  Unique     --唯一约束
  Default     --默认值约束
  Check     --条件约束(逻辑判断约束)
  自我参照性约束
--创建主键约束,语句: alter table 表名 add constraint [主键名称] primary key (主键字段)
alter table Grade Add constraint [PK_Grade] primary key (Id)

--创建唯一约束,语句: alter table 表名 add constraint [约束名称] unique (字段 排序)
alter table Grade add constraint [IX_Grade_Name] unique (Id asc)

--创建外键约束,语句: alter table 表名 add constraint [外键名称] foreign key (字段) references 外链表名(字段)
alter table Student Add constraint FK_Student_Cid foreign key (Id) references Grade(Id)

--创建Default约束,语句:alter table 表名 add constraint [约束名称] default (默认值) for (字段)
alter table Student add constraint DF_Student_Gender default (N'男') FOR [Gender]

--创建Check约束,语句:alter table 表名 add constraint [约束名称] check (逻辑表达式) 
alter table Student add constraint CK_Student_Gender CHECK (([Gender]=N'男' OR [Gender]=N'女'))

-- 添加自参照性约束
alter table TbEmp add constraint fk_mgr foreign key (mgr) 

--删除约束,语句: alter table 表名 drop constraint [约束名称]
alter table Student drop constraint IX_Student_Name

MySQL UNION 操作符

SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions]
UNION [ALL | DISTINCT]
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions];
expression1, expression2, ... expression_n: 要检索的列。

tables: 要检索的数据表。

WHERE conditions: 可选, 检索条件。

DISTINCT: 可选,删除结果集中重复的数据。默认情况下 UNION 操作符已经删除了重复数据,所以 DISTINCT 修饰符对结果没啥影响。

ALL: 可选,返回所有结果集,包含重复数据。
下面的 SQL 语句从 "Websites" 和 "apps" 表中选取所有不同的country(只有不同的值):

实例
SELECT country FROM Websites
UNION
SELECT country FROM apps
ORDER BY country;
下面的 SQL 语句使用 UNION ALL 从 "Websites" 和 "apps" 表中选取所有的country(也有重复的值):

实例
SELECT country FROM Websites
UNION ALL
SELECT country FROM apps
ORDER BY country;

带有 WHERE 的 SQL UNION ALL

下面的 SQL 语句使用 UNION ALL 从 "Websites" 和 "apps" 表中选取所有的中国(CN)的数据(也有重复的值):

实例
SELECT country, name FROM Websites
WHERE country='CN'
UNION ALL
SELECT country, app_name FROM apps
WHERE country='CN'
ORDER BY country;

MySQL 的 WHERE 子句的字符串比较是不区分大小写的。 你可以使用 BINARY 关键字来设定 WHERE 子句的字符串比较是区分大小写的。

SELECT * from runoob_tbl WHERE BINARY runoob_author='runoob.com';

SELECT * from runoob_tbl WHERE BINARY runoob_author='RUNOOB.COM';

新用户的操作

-- 删除名为hellokitty的用户
drop user hellokitty;

-- 创建一个名为hellokitty的新用户,如果需要制定地址进入,就在后面添加地址
create user 'hellokitty'@'%' identified by '123456';

-- 给hellokitty用户权限
-- 给hellokitty hrs数据库的权限
grant all privileges on hrs.* to hellokitty@'%';
-- 几种权限方式 --> *.*给所有权限, hrs.*给hrs数据库的所有权限, hrs.tbemp
    给予用户hrs数据的tbemp表的权限
-- 如果想要让用户获得和root一样的权限的话,还需要加with grant option,允许用户将获得的权限给其他人
grant all privileges on *.* to 'hubiao'@'%' with grant option

-- 从hellokitty召回权限
-- 召回权限时需要注意:撤销的对象要和给予的对象一致,例如给了*.*只能撤销*.*。否则报错
revoke insert,delete,update on hrs.* from hellokitty@'%';

数据库备份


视图

视图是查询结果的快照
-- 创建视图
create view 视图名 as 查询的代码
create view vw_emp as select empno, ename, job from tbemp;

-- 用视图查看结果
select * from 视图名
select * from vw_emp;

注意:在视图中想要操作数据库需要满意以下条件
更新视图就是更新表,如果背后的表能改变,既如果表时原来的表就能修改表
如果查询的视图做了统计或者是加了临时表的时候,视图的数据不能改变
-- 以下操作可以执行
create view vw_emp as select empno, ename, job from tbemp;
select * from vw_emp;
update vw_emp set ename='胡二刀' where empno=1359;

-- 以下视图不能进行修改,会报错
create view vw_max_sal as select ename, mgz, dname from TbDept inner join
(select ename,dno,(sal + comm) as mgz from TbEmp where (sal + comm) in
(select max(sal + comm) from TbEmp group by dno )) as TbG on dno=deptno;

select * from vw_max_sal;
update vw_max_sal set ename='黄小荣' where ename='黄蓉'

索引

--索引相当于是书的目录,可以用来加速查询(先插目录,定位搜索范围)
-- 索引是典型的空间换时间的策略,所有索引要创建在用作查询筛选的列上
-- 创建索引 -- 需要制定列 -- 查到的数据可以重复
create index idx_emp_name on tbemp(ename);

-- 唯一索引(不允许重复数据)
create unique index uni_idx_emp_name on tbemp(ename);

-- 删除索引 -- 需要跟上表名
drop index uni_que_emp_name on tbemp;

注意:添加了索引以后,数据查询的效率变快,但是数据的增删改会变慢,因为增删改以后索引需要刷新索引(重做目录)

小知识

被参照的列不能删,因为有儿子。 -- 可以使用触发器,删除儿子以后再删除参照列
-- 不推荐使用触发器,会造成锁表。导致操作性能低下。
-- 在添加外键约束的饿时候,可以进行设置
-- 添加外键约束 -- 删除被参考列时,将参照列的数据都删除
alter table TbEmp add constraint fk_dno foreign key (dno) 
references TbDept(deptno) on delete cascade on update cascade;

-- 删除被参照的列时,其绑定下的数据设置为null
alter table TbEmp add constraint fk_dno foreign key (dno) 
references TbDept(deptno) on delete set null on update cascade;

数据库事务

begin -- 开启事务环境

需要进行的sql操作

commit -- 提交事务,让事务生效(结束事务环境)
rollback -- 撤销事务(结束事务环境)

关系型数据库支持事务

事务:把多个操作当成一个原子性操作 要么全部成功 要么全部失败
事务的ACID特性:
A - Atomic - 原子性:不嫩拆分
C - Consistency - 一致性:事务前后数据状态要一致
I - Islation - 隔离性:事务不能看到彼此的中间状态
D - Duration - 持久性:事务完成后数据要持久化。

Python连接数据库

-- 在python中安装第三方库 -->pymysql
安装成功后倒入模块
con = pymysql.connect(host='主机/loaclhost(本地)或者ip地址', port=端口,
		db='数据库名字', user='用户名', passwd='密码', charset='utf8')
# connect中默认参数autocommit=False -->默认不提交,所以操作以后不会发生改变,,需要commit提交
# cursorclass=pymysql.cursors.DictCursor -->让查询到的数据以字典的形式出现。默认是元祖
此时可以不同导入模块
# 最好是默认是False,关系型数据库支持支持事务 -->事务:把多个操作当成一个原子性操作 要么全部成功 要么全部# # 失败
print(con)
如果输出不报错就代表连接成功

try:
    con.cursor() -- 创建游标对象    
    with con.cursor() as cursor:
        result = cursor.execute("SQL语句")
            if result == 1:
                print('删除成功')
            # 增删改不能直接提交,数据有可能提交失败,要捕获异常,查询不用进行判断
            con.commit()
     except pymysql.MySQLError as e:
     	 print(e)
     	 # 如果失败则回滚
     	 con.rollback()
     finally:
     	con.close()
-- 添加表 --> 需要加占位符%s
no = int(input('部门编号:'))
name = input('部门名称:')
loaction = input('部门所在地:')
result = cursor.execute("insert into tbdept values (%s, %s, %s)",(no, name, location))

-- 查询
cursor.execute("select * from tbdept")
# 拿所有结果,拿到一个元组(元组中的数据也是元组,一个元组就是一组数据)
print(cursor.fetchall())
# 拿一条数据
print(cursor.fetchone())
# 拿多条数据
print(cursor.fetchmany(拿取的个数))

ORM框架 - 自动生成增删改查操作
# SQLAlchemp
# peewee

127.0.0.1 -- 回环地址

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值