文章目录
1, create database
create database&table
CREATE DATABASE 'databasename';
CREATE TABLE tablename(idx INT(11) NOT NULL AUTOINCREMENT,name VARCHAR(256) NOT ALL)ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8 COLLATE=utf8_bin
命令中的一些具体解释:
MYSQL数据类型
Step2:
CREATE TABLE <表名> ([表定义选项])[表选项][分区选项];
表定义选项的格式为:
<列名1> <类型1> [,…] <列名n> <类型n>
字段的约束:NULL 和 NOT NULL 修饰符,是否为空
AUTO_INCREMENT修饰符只适用于INT字段,mysql自动生成加1
>primary key ('colname')
primary key的两个作用:
1,约束作用,constraint,规范一个存贮主键,和唯一性
2,建立一个主键索引
primary key可以说是特殊的unique key,unique key一个表中可以有多个,primary只能是一个
索引与key:索引只是索引,它不会去约束索引的字段的行为(那是key要做的事情)
表选项:
>ENGINE=InnoDB
InoDB:提供了事务控制能力,确保一组命令全部被执行成功,或当一个命令出现错误时命令全部返回.支持COMMMIT,ROLLBACK
myisam:读取速度非常快,且不占用大量内存和存储资源.不支持事务处理,不能容错,硬盘崩溃,数据文件无法恢复.
>AUTO_INCREMENT=37
自增的初始值
>COLLATE=utf8_bin
**utf8_bin:**将字符串中的每一个字符用二进制数据存储,区分大小写。
**utf8_genera_ci:**不区分大小写,ci为case insensitive的缩写,即大小写不敏感。
**utf8_general_cs:**区分大小写,cs为case sensitive的缩写,即大小写敏感。
2,use database
mysql -uyourdatabasename -pyourpassword
mysql> show databases;
mysql> use databasename;
mysql> show tables;
#查看表内容
mysql> select * from tablename;
#更新表里的内容 WHERE后面跟的是条件
mysql> update databasename set colname=value WHERE conditon;
#查看表的属性
DESCRIBE EMPLOYEE
3,how to use pymysql python
import pymysql
import sys
#数据库基本信息
config = {
'host':'localhost',
'port':3306,
'user':'xue',
'passwd':'123',
'db':'thai_sql',
}
def create_db():
try:
# 打开数据库连接
conn = pymysql.connect(**config)
# 使用 cursor() 方法创建一个游标对象 cursor
cursor = conn.cursor()
# 使用 execute() 方法执行 SQL,如果表存在则删除
cursor.execute("DROP TABLE IF EXISTS EMPLOYEE")
# 使用预处理语句创建表
sql = """CREATE TABLE EMPLOYEE (
FIRST_NAME CHAR(20) NOT NULL,
LAST_NAME CHAR(20),
AGE INT,
SEX CHAR(1),
INCOME FLOAT,
PRIMARY KEY (FIRST_NAME)
)"""
cursor.execute(sql)
# 关闭游标
cursor.close()
conn.close()
print("创建成功")
except Exception :print("创建失败")
def insert_db(sql):
conn = pymysql.connect(**config)
cursor = conn.cursor()
cursor.execute("SELECT VERSION()")
# 使用 fetchone() 方法获取单条数据.
data = cursor.fetchone()
print("Database version : %s " % data)
try:
cursor.execute(sql)
conn.commit()
print('Ok',cursor.fetchall())
except:
print('Error')
conn.rollback()
cursor.close()
conn.close()
#insert_db('insert into EMPLOYEE(FIRST_NAME,lAST_NAME,AGE,SEX,INCOME) VALUES(\'TUO\',\'XUE\',27,\'m\',180.0)')
#选取表中INCOME大于10的内容
sql = "SELECT * FROM EMPLOYEE \
WHERE INCOME > %s" % (10)
#选取表中所有内容
sql ='SELECT * FROM EMPLOYEE'
#插入数据
sql ='INSERT INTO EMPLOYEE(FIRST_NAME,LAST_NAME,AGE,SEX,INCOME) VALUES(\'MING\',\'XIAO\',18,\'M\',250)'
print(insert_db(sql))
4, 4种事务
4.1事务的并发问题
1、脏读: 事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据
2、不可重复读: 事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。
3、幻读: 系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。
小结: 不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表
4.2 MySQL事务隔离级别
事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交(read-uncommitted) | 是 | 是 | 是 |
不可重复读(read-committed) | 否 | 是 | 是 |
可重复读(repeatable-read) | 否 | 否 | 是 |
串行化(serializable) | 否 | 否 | 否 |
5 mysql中delete,turncate,drop的区别
delete可以撤回的删除
用法:
delete from table_name
delete from table_name where ...
说明:
1),DML语言,每删除一行,都在事务日志中记录.产生rollback.事务提交之后才生效;大面积删除会很慢
2),删除表中数据而不删除结构,同时也不释放空间
truncate永久删除
truncate table table_name
1),只能操作表,将表中数据全部删除
2),DDL语言,操作即可生成,自动提交,不产生rollback,不能回滚
3)删除内容,释放空间,但不删除结构
&emsp:drop永久全部删除
drop table table_name
1),删除过后依赖于此表的存储过程/函数将保留,变为invalid状态
2),DDL,立即执行,执行速度最快
3),删除内容,释放空间,删除结构,一级被依赖的约束(constrain),trigger(触发器),index(索引)
6.补充知识
6.1(DDL,DML,DQL,DCL的区别)
DDL(Data Definition Language):
数据定义语言,操作对象及对象本身,对象包含(库,表,视图对象)
包含的操作语句:
create
drop
alter
truncate
DML(Data Manipulation Language)
数据操控语言,用于操作数据库对象中包含的数据
包含的操作语句:
insert
delete
update:
UPDATE tablename SET colname=value;
DQL(Data Query Language)
数据查询语言
包含的操作语句:
select
DCL(Data Control Language)
数据控制语言
包含的操作语句:
greate:分配权限给用户
revoke:取消某用户的权限