1 mysql
1.1 mysql 语句
1.1.1 文件夹操作(数据库)
1 创建: 2 create database db_name; 3 create database db_name default charset utf8; 4 删除: 5 drop database db_name; 6 进入文件夹: 7 use db_name
1.1.2 文件操作(数据表)
创建: 单表: create table user_info( id int not null auto_increment primary key, name char(20), age int, gender char(1) )engine = innodb default charset=utf8; insert into user_info(name,age,gender) values('alex',19,'男'); 1. 列名 2. 数据类型 3. 是否可以问空(null,not null) 4. 默认值(default 1) 5. 自增(auto_increment) 一个表只能有一个自增列 6. 主键(primary key) 约束:数据不能为空、数据不能重复。 索引:加速查找(B树结构) 7. 外键: 对某列数据的内容进行约束。 约束:只能是某个表中某列已经存在的数据。 constraint 约束名称 foreign key(deparment_id) references dep_info(id) 含外键的关系成为1对多。 多表: 一对多: create table user_info( id int not null auto_increment primary key, name char(20), age int, gender char(1), deparment_id int, constraint 约束名称 foreign key(deparment_id) references dep_info(id))engine = innodb default charset=utf8; create table dep_info( id int not null auto_increment primary key, title char(32), )engine=innode default charset=utf8; 多对多:(关系表) create table boy( id int not null auto_increment primary key, name char(32))engine = innodb default charset=utf8; create table girl( id int not null auto_increment primary key, name char(32))engine = innodb default charset=utf8; create table b2g( id int not null auto_increment primary key, b_id int, g_id int, constraint 约束名称1 foreign key(b_id) references boy(id), constraint 约束名称2 foreign key(g_id) references girl(id))engine = innodb default charset = utf8;
删除:
drop table table_name;
1.1.3 应用场景
1、根据具体业务
2、HTML的场景
创建的时候只需要输入数据的情况下:单表
创建的时候必须要我们选择一个其他数据的场景下:一对多
创建的时候针对某些字段可以进行多选的情况下:多对多
1.1.4 文件内容操作(数据行)
插入: insert into table_name(field) values(value),(value2) --> 两个(value)表示插如多行数据 insert into table_name(cname) select field from table_name --> 把select查到的结果,当作数据来赋值给value 删除: 清空表: delete from table_name --> 自增列会继续之前的ID truncate table table_name --> 物理删除,速度快,重新计算ID 删除某一条: delete from table_name where filed = values and/or ... --> 只删除符合条件的数据 delete from table_name where filed in (1,2,3,4) delete from table_name where id between 5 and 10 修改: update table_name set field = 'value' --> 更新所有数据的field字段的值,加 where 只修改匹配到的行 update table_name set id = 8 , name = 'daxin' where age = 18; 查询: select * from table_name where id > 2 select field as '别名' from table_name --> 加别名 select * from table_name where id in (1,2) select * from table_name where cid in (select tid from teacher) 条件: select * from table_name order by field asc/desc(正序/倒序) select * from table_name order by field asc limit 1 取第一个值 select * from table_name limit 1,2(起始位置,找几个) select * from table_name where field like '%key%' --> 查找field字段包含key的数据 % 表示任意个任意字符, _表示任意一个字符 分组: select * from table_name group by field --> 分组显示,会去重,需要使用聚合函数来统计重复的次数 select field,count(id) from table_name group by field --> 对id字段进行聚合(其他的还有min(),max(),sum(),avg()等) 例子: 1、获取每个班级多少人 SELECT class.caption,count(sid) from class LEFT join student on student.class_id = class.cid group by class.caption 2、获取每个班级有多少人并且选出认识大于2的班级, 注意:如果针对 group by 的结果进行筛选,那么需要使用 having 不能在使用 where 了. SELECT class.caption,count(sid) as number from class LEFT join student on student.class_id = class.cid group by class.caption HAVING number >= 2 3、每个课程的不及格的人数。 select course.cname,count(sid) from score left join course on score.corse_id = course.cid where number < 60 group by course.cname 连表: select student.sid,student.sname,class.caption from student LEFT JOIN class on student.class_id = class.cid ; 把class表中的字段放在student表的左边,并且进行 student.class_id = class.cid 匹配后显示,数据量以from指定的表为基准 left join: 以 from 指定的表为基准,对数据进行显示 right join: -->不常用 以 join 后面的表为基准进行显示。 inner join:(join 使用的就是) 只保留连个表中都有数据的条目 例子: 1、id=1的老师任教的课程名称 2、老师姓名瞎猫任教的课程命令 3、已选课程id=1,所有学生的姓名 4、已选体育课,所有学生的姓名 5、已选波多任教任意课程,所有学生姓名 union: 把两个SQL的结果进行组合(上下合并) select * from student union / union all select * from teacher; 注意上下两个表中的列数要统一 注意: 1、如果所有数据都一致,那么union会对结果进行去重 2、union all ,会保存所有的
1.2 基本数据类型
MySQL的数据类型大致分为:数值、时间 和 字符串。 数字: 整数 tinyint 小整数,数据类型用于保存一些范围的整数数值范围。 smallint int bigint 小数 float 浮点型(长度越长越不精准) double 浮点型(双精度,精度比float稍高) 范围比float更大 decimal 精准(内部使用字符串进行存储的) -> 适合对精度有要求的 字符串 char(19)[字符长度] 定长字符串 --> 占用空间大,但是效率高 varchar(19)[字符长度] 不定长字符串 --> 占用空间是可变的,但是效率低 注意:最大可以存放255个字符 text() 65535个字符 mediumtext() 16777215个字符 longtext() 4294967254个字符 二进制: TinyBlob Blob MediumBlob LongBlob 存文件:虽然可以用二进制进行存储,但是一般是存储文件在服务器上的路径(URL) 时间: date YYYY-MM-DD time HH:MM:SS year YYYY DATETIME YYYY-MM-DD HH:MM:SS -->常用 TIMESTAMP 时间戳格式
2 python 操作数据库
连接数据库
#!/usr/bin/python # -*- coding:utf-8 -*- import pymysql conn = pymysql.Connect(host='192.168.175.131',port=3306,user='root',password='123456',database='stupy',charset='utf8') cursor = conn.cursor() res = cursor.execute('select * from student') #受影响的行数 # print(res) res1 = cursor.fetchall() #通过游标去拿到所有数据 # res1 = cursor.fetchone() #通过游标去拿到一条数据 #res1 = cursor.fetchmany(3) #通过游标去拿到三条数据 print(res) cursor.close() conn.close()
增删改
#!/usr/bin/python # -*- coding:utf-8 -*- import pymysql conn = pymysql.Connect(host='192.168.175.131',port=3306,username='root',password='123456',database='stupy',charset='utf8') cursor = conn.cursor() v = cursor.execute('insert into userinfo (username,password) values (%s,%s)',['eric','9999'])
##v = cursor.execute('delete username from userinfo where username = %s', ['eric'])
#v = cursor.execute('update userinfo set username = %s where username = %s ', ['eric666','eric'])
conn.commit() cursor.close() conn.close()
查询数据格式
#!/usr/bin/python # -*- coding:utf-8 -*- import pymysql conn = pymysql.Connect(host='192.168.175.131',port=3306,user='root',password='123456',database='stupy',charset='utf8') cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) #修改查询出来的值得格式 cursor.execute('select * from student') res = cursor.fetchall() print(res) cursor.close() conn.close()
用户登录
#!/usr/bin/python # -*- coding:utf-8 -*- import pymysql user = input('请输入用户名:').strip() pwd = input('请输入密码:').strip() conn = pymysql.Connect(host='192.168.175.131',port=3306,user='root',password='123456',database='stupy',charset='utf8') cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) # sql = 'select * from userinfo where username = "%s" and password = "%s"' %(user,pwd,) 这样容易sql注入,所以不推荐这么写。pymysql帮你处理了sql注入 v = cursor.execute('select * from userinfo where username= %s and password = %s',[user,pwd]) res = cursor.fetchone() print(res) cursor.close() conn.close()
两张表操作
#!/usr/bin/python # -*- coding:utf-8 -*- import pymysql conn = pymysql.Connect(host='192.168.175.131',port=3306,user='root',password='123456',database='stupy',charset='utf8') cursor = conn.cursor() cursor.execute('insert into class (caption) VALUES (%s)',['新班级']) conn.commit() new_class_id = cursor.lastrowid #获取新增数据自增id cursor.execute('insert into student (sname,gender,class_id) VALUES (%s,%s,%s)',['sdfsd','男',new_class_id]) conn.commit() cursor.close() conn.close()