Mysql01
使用python连接mysql,安装pymysql包
py -3 -m pip install pymysql
关系型数据库
Mysql:互联网公司(维护起来比较实用,维护成本比oracle低)
Sqllite:手机里面使用
Oracle:银行、保险、以前外企
Sybase: 银行+通信
互联网公司
Key:value
Mongodb:磁盘上
Redis:内存数据库,持久化(存磁盘上)
Memchache:内存数据库
数据库服务器:
Linux + mysql 的软件
一般的架构:
- 1 Redis一般做缓存使用,架构分层,分层的基本上都有持久化的数据库外加redis、memchache缓存数据库,
- 2 redis和memchache一般都是把数据放在内存里面进行使用的,内存要比磁盘使用的要快,如果所有数据从磁盘上门去取速度是非常慢的,大并发做不了那么多的访问,
- 3 大多数情况下redis或mamchache做为缓存的一部分存在然后后面在一个mysql或者oracle这种架构在互联网比较常见
- 4 Redis和mamchache两者的区别:redis比mamchache命令更多一些,功能更强大一些;一般使用redis比较多
Mysql常用命令
Mysql sever
客户端+服务端=数据库的系统
安装完了之后,需要将安装目录下的bin目录加入到path中
mysql -uroot -p
-u加用户名,中间不能有空格
-p输入密码,中间不能有空格
mysql -h39.106.41.11 -utest -pgloryroad -P3306
连云服务器命令
本地IP:127.0.0.1
查看本地有哪些库
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sakila |
| sys |
| world |
+--------------------+
6 rows in set (0.00 sec)
切换库名
mysql> use mysql
Database changed
查看当前数据库
mysql> select database();
+------------+
| database() |
+------------+
| mysql |
+------------+
1 row in set (0.00 sec)
查看当前库中有哪些表
mysql> show tables;
+---------------------------+
| Tables_in_mysql |
+---------------------------+
| columns_priv |
| db |
| engine_cost |
| event |
| func |
| general_log |
| gtid_executed |
| help_category |
| help_keyword |
| help_relation |
| help_topic |
| innodb_index_stats |
| innodb_table_stats |
| ndb_binlog_index |
| plugin |
| proc |
| procs_priv |
| proxies_priv |
| server_cost |
| servers |
| slave_master_info |
| slave_relay_log_info |
| slave_worker_info |
| slow_log |
| tables_priv |
| time_zone |
| time_zone_leap_second |
| time_zone_name |
| time_zone_transition |
| time_zone_transition_type |
| user |
+---------------------------+
31 rows in set (0.00 sec)
创建表格
create table wlg(id int,name varchar(20));
表格中插入数据
Insert into wgl values(1,”吴老师”);
Insert into wgl values(2,”李老师”);
Insert into wgl values(3,”张老师”);
删表数据
mysql> delete from test where id = 1;
Query OK, 1 row affected (0.00 sec)
mysql> select * from test;
+------+--------+
| id | name |
+------+--------+
| 2 | 李老师 |
| 2 | 张老师 |
+------+--------+
2 rows in set (0.00 sec)
删表格
mysql> drop table wgl;
Query OK, 0 rows affected (0.02 sec)
改
mysql> update test set id = 100 where name = '李老师';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from test;
+------+--------+
| id | name |
+------+--------+
| 100 | 李老师 |
| 2 | 张老师 |
+------+--------+
2 rows in set (0.00 sec)
创建库
create database wgl;
删库
drop database wgl;
查看表是怎么建立的
mysql> show create table test;
+-------+---------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+---------------------------------------------------------------------------------------------------------------------------+
| test | CREATE TABLE `test` (
`id` int(11) DEFAULT NULL,
`name` varchar(20) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+---------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
查看建表的过程
mysql> show create table test;
+-------+---------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+---------------------------------------------------------------------------------------------------------------------------+
| test | CREATE TABLE `test` (
`id` int(11) DEFAULT NULL,
`name` varchar(20) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+---------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
字段分析:
主表
CREATE TABLE `studentinfo`(
`ID` INT(11) NOT NULL AUTO_INCREMENT COMMENT '不为空的自增长的 主键的主键ID',
`student_id` VARCHAR(20) NOT NULL,
`name` VARCHAR(30) NOT NULL,
`sex` CHAR(4) DEFAULT NULL,
`tel` VARCHAR(13) NOT NULL,
`AdmissionDate` DATETIME DEFAULT '0000-00-00 00:00',
`status` TINYINT(2) DEFAULT '0',
PRIMARY KEY(`ID`),
UNIQUE KEY `tel` (`tel`),
UNIQUE KEY `student_id` (`student_id`)
)ENGINE = INNODB AUTO_INCREMENT=101 DEFAULT CHARSET=utf8 COMMENT='学生信息表';
关联表
CREATE TABLE grade(
ID INT AUTO_INCREMENT NOT NULL,
stuID VARCHAR(20),
course VARCHAR(20) NOT NULL,
score TINYINT(4) DEFAULT 0,
PRIMARY KEY (ID),
KEY idx_stuid(stuID),
CONSTRAINT FF_ID FOREIGN KEY(stuID)
REFERENCES studentInfo(student_id)
)ENGINE=INNODB CHARACTER SET utf8 COMMENT "学生成绩";
常用的字段类型:
int(11) :数字长度11位,如果不写有个默认值9位或11位
NOT NULL:非空,不能为空
auto_increment:如果不指定它插入的值,插入第一条数据默认为1,插入第二条数据自增+1
auto_increment=101:设定它从101开始自增
comment:备注
varchar(20):可变字长,最大值20个字节,省空间,损时间
char(4):固定占用,设一个值也会占用4个字节,节省时间,损空间
DEFAULT:设置默认值
datetime DEFAULT:年、月、日、时、分、秒 '0000-00-00 00:00'
date DEFAULT:只有时间,年、月、日
time DEFAULT:时、分、秒
tinyint(2) DEFAULT '0':非常短的讲述,一般是激活,未激活
tinyint(1) DEFAULT '0':也可以,一般表示为不可用
primary key(ID):表示ID为主键,一个表只能有一个主键
unique key(tel):(唯一)默认建立索引,表示这个字段加的值只能是不重复的
KEY idx_stuid(stuID):把stuID当成索引字段,where条件里面用到哪个要加上索引idx_stuid(stuID)
外键
这种情况一般不推荐使用,判断脏数据在数据库可以这么做,在应用层也可做判断,所有这种情况下如果能在应用上,也就是我们写的程序如果能做数据的校验或者是脏数据的产生的话,那么数据表之间不要建成外键的这种表,你让数据库干的事越多,它的性能就会越差
结论:数据库能干的事,如果前端能干,那么都是放在前端,数据库的资源都是宝贵的。
constraint fk_id foreign_key(stuID)
references studentInfo(student_id):
constraint关键字,fk_id是自定义名称, foreign_key(stuID)外键,references关键字
grade表中插入的stuID字段的数据必须在studentInfo的student_id中存在,不在,则不让插入
删除studentInfo中的student_id数据,那么grade中相关的stuID数据必须先删除,才能成功
例如:
studentInfo
student_id:2007123 #不能直接删除,grade表中删除2007123,就可以删除student_id:2007123
grade
stuID:2007124 插入失败
stuID:2007123 插入成功—》把这条先删
引擎:
ENGINE=InnoDB:InnoDB(它有事物)、Myisam
字符集设置
DEFAULT CHARSET=utf8
备注:
COMMENT=
数据库的事务:原子性,要么成功,要么失败
一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样、
通俗来讲:
执行4个sql设定为事务了,要么都成功,要么都失败,不可能2条成功,2条失败
字段区分大小写嘛?
create database xxxx collate ...cs
cs(大小写敏感)
默认不区分大小写
使用python进行插入数据(造数据):
"""
写一堆参数连接数据
获取游标
执行sql
关闭游标
关闭连接
"""
#encoding=utf-8
import pymysql
import random
def insertData():
conn = pymysql.connect(
host = "127.0.0.1",
port = 3306,
user = "root",
passwd = "123456",
db = "test", #可以选择默认连接的库
charset = "utf8") #设定默认的字符集,建立连接
cur = conn.cursor() #获取游标,连接的时候获取游标,类似文件里面的游标,记录一下这个游标在操作数据库中的什么表在哪一行了
conn.select_db("test")#选择了哪个库,可以不写
courseList = ['python','java','mysql','linux','接口测试','性能测试','自动化测试']
for i in range(1,101):
student_id = '20163' + '0' * (3 - len(str(i))) + str(i)
name = radom.choice(['Lucy','Tom','Lily','Amy','Dave','Aaron','Baron']) + str(i)
tel = '1' + str(radom.choice([3,5,7,8])) + str(random.random())[2:11]
sex = random.choice(["女","男"])
stuinfo_sql = 'insert into studentInfo(student_id,name,sex,AdmissionDate)' \
values('%s','%s','%s'.'%s',date_sub(now(),interval %s day))' \
%(student_id,name,sex,tel,random.randint(90,120)) #拼sql,把数据和sql语句进行拼接一个完整的字符串
cur.execute(stuinfo_sql) #拼完,使用游标执行这个sql
conn.commit() #不能回滚,必须生效
for j in courseList: #把课程列表,再拼成一个成绩,拼到字符串里面拼成一个sql--》grade_sql
grade_sql = "insert into grade(stuID,course,score) values('%s','%s'.%s)" %(student_id,j,random.randint(80,100)
cur.execute(grade_sql)
conn.commit() #提交
cur.close() #关闭游标
conn.commit() #提交
conn.close() #关闭连接
insertData()