数据库

Posted qwer-123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库相关的知识,希望对你有一定的参考价值。

drop database db1;
create database db1 default charset utf8;
create table t2(id int null,name char(10) not null) engine=innodb default charset=utf8;事务 原子性操作 回滚
create table t3(id int auto_increment primary key,name char(10) not null) engine=innodb default charset=utf8;
primary key 约束 不能空,不能重复 加速查找
一个表里只能有一个自增列和主键
delete from t1;清空表 再插入继续自增
truncate table t1;再插入从1自增 效率快
drop table t1;删除表
数字
tinyint
int
bigint
小数用decimal 精确
num decimal(10,5)总位数和小数点后位数
字符串
char(10)未占满填充  速度快   限制均是255字符
varchar(10)节省空间
text多字符
 sql优化:定长放在前,变长放在后
文件,图片,视频存硬盘,数据库存路径
时间类型
date
time
datetime
枚举
create table shirts(
name char(20),
size ENUM(‘small’,‘midium’,‘large’)); 选其一插入
insert into shirts(name,size)values(‘a’,‘large’) ;
集合
create table myset(
name char(20),
col SET(‘a’,‘b’,‘c’));选任意组合插入
insert into myset(name,col)values(‘a’,‘a,b’) ;


   insert into tb11(name,age) values(‘alex‘,12);
   
   insert into tb11(name,age) values(‘alex‘,12),(‘root‘,18);
   
   insert into tb12(name,age) select name,age from tb11;
  删
   delete from tb12;
   delete from tb12 where id !=2;
   delete from tb12 where id =2 ;
   delete from tb12 where id > 2 ;
   delete from tb12 where id >=2;
   delete from tb12 where id >=2 or name=‘alex‘;
  
  改
   update tb12 set name=‘alex‘ where id>12 and name=‘xx‘;
   update tb12 set name=‘alex‘,age=19 where id>12 and name=‘xx‘;
  查
   
   select * from tb12;
   
   select id,name from tb12;
   
   select id,name from tb12 where id > 10 or name =‘xxx‘;
   
   select id,name as cname from tb12 where id > 10 or name =‘xxx‘;
   
   select name,age,11 from tb12;
   
   其他:
    select * from tb12 where id != 1;
    select * from tb12 where id in (1,5,12);
    select * from tb12 where id not in (1,5,12);
    select * from tb12 where id in (select id from tb11);
    select * from tb12 where id between 5 and 12;
 
   
    通配符:
    
    select * from tb12 where name like "a%";以a开头
    select * from tb12 where name like "a_";

 分页:
    
     select * from tb12 limit 10;
     
     select * from tb12 limit 0,10;
     select * from tb12 limit 10,10; 从10开始看10条
     select * from tb12 limit 20,10;
     
     select * from tb12 limit 10 offset 20;
     从第20行开始读取,读取10行;
  
     结合Python分页:
     # page = input(‘请输入要查看的页码‘)
     # page = int(page)
     # (page-1) * 10
     # select * from tb12 limit 0,10; 1
     # select * from tb12 limit 10,10;2

 排序:
     select * from tb12 order by id desc; 大到小
     select * from tb12 order by id asc;  小到大
     select * from tb12 order by age desc,id desc; 先按age排序,如果重复,再按照id排
      
     取后10条数据
     select * from tb12 order by id desc limit 10;

外键 节省空间 约束(保证表与表之间数据一致性)
CREATE TABLE t5 (
nid int(11) NOT NULL AUTO_INCREMENT,
pid int(11) not NULL,
num int(11),
primary key(nid,pid)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;



create table t6(
id int auto_increment primary key,
name char(10),
id1 int,
id2 int,CONSTRAINT fk_t5_t6 foreign key (id1,id2) REFERENCES t5(nid,pid)
)engine=innodb default charset=utf8;


desc t5;
show create table t5;看表是怎么创建的(sql语句)
show create table t5 G;竖着看
alter table t5 set AUTO_INCREMENT=1;设置自增起始值
mysql 步长,基于会话
sqlserver 基于表
 show session variables like auto_inc%;查看步长
set session auto_increment_increment=2;设置步长
show global variables like auto_inc%;查看全局步长
set global auto_increment_increment=2;不推荐
唯一:
约束不能重复(可以为空)
PS: 主键不能重复(不能为空)
加速查找
create table t1(
id int ....,
num int,
xx int,
unique 唯一索引名称 (列名,列名),  联合唯一,两列间不能重复
constraint ....
)
一对一
            
create table userinfo1(
id int auto_increment primary key,
name char(10),
gender char(10),
email varchar(64)
)engine=innodb default charset=utf8;
create table admin(
id int not null auto_increment primary key,
username varchar(64) not null,
password VARCHAR(64) not null,
user_id int not null,
unique uq_u1 (user_id),
CONSTRAINT fk_admin_u1 FOREIGN key (user_id) REFERENCES userinfo1(id)
)engine=innodb default charset=utf8;

多对多
        
示例1:
用户表
相亲表

示例2:
用户表
主机表
用户主机关系表

create table userinfo2(
id int auto_increment primary key,
name char(10),
gender char(10),
email varchar(64)
)engine=innodb default charset=utf8;

create table host(
id int auto_increment primary key,
hostname char(64)
)engine=innodb default charset=utf8;


create table user2host(
id int auto_increment primary key,
userid int not null,
hostid int not null,
unique uq_user_host (userid,hostid),
CONSTRAINT fk_u2h_user FOREIGN key (userid) REFERENCES userinfo2(id),
CONSTRAINT fk_u2h_host FOREIGN key (hostid) REFERENCES host(id)
)engine=innodb default charset=utf8;

分组:
    
     select count(id),max(id),part_id from userinfo5 group by part_id;通过part_id进行分组,返回部门id一样的人数和部门id一样的人中id最大的那一个
     count
     max
     min
     sum
     avg

 **** 如果对于聚合函数结果进行二次筛选时?必须使用having ****
     select count(id) as count,part_id from userinfo5 group by part_id having count(id) > 1;

连表操作:

select * from userinfo5,department5 where userinfo5.part_id = department5.id;

select * from userinfo5 left join department5 on userinfo5.part_id = department5.id; 推荐使用
     # userinfo5左边全部显示

select * from department5 left join userinfo5 on userinfo5.part_id = department5.id;
select * from userinfo5 right join department5 on userinfo5.part_id = department5.id;
     # department5右边全部显示

#备份数据表结构+数据:mysqldump -u root db1 > db1.sql -p;转储数据库,备份,防黑客

#备份数据表结构:mysqldump -u root -d db1 > db1.sql -p;

import pymysql
cid=input(>>>)
user=input(>>>)
conn=pymysql.connect(host=localhost,user=root,password=‘‘,database=day61)
cursor=conn.cursor()  #游标,拿数据
sql="select * from app01_userinfo where id=‘%s‘and name=‘%s‘"%(cid,user) #不要自己写,会有sql注入       1" o r 1=1 --
cursor.execute(sql)
result=cursor.fetchone() #只显示一条
print(result)
cursor.close()
conn.close()
if result:
    print(登陆成功)
else:
    print(登陆失败)

 

import pymysql
cid=input(>>>)
user=input(>>>)
conn=pymysql.connect(host=localhost,user=root,password=‘‘,database=day61)
cursor=conn.cursor()  #游标,拿数据
sql="select * from app01_userinfo where id=%(c)s and name=%(u)s"
#cursor.execute(sql,[cid,user])
cursor.execute(sql,{c:cid,u:user})
result=cursor.fetchone() #只显示一条
print(result)
cursor.close()
conn.close()
if result:
    print(登陆成功)
else:
    print(登陆失败)

正确的写法,防注入

import pymysql
cid=input(>>>)
user=input(>>>)
conn=pymysql.connect(host=localhost,user=root,password=‘‘,database=day61)
cursor=conn.cursor()  #游标,拿数据
sql="insert into app01_userinfo (id,name) values (%s,%s)"
cursor.execute(sql,(cid,user))
conn.commit()
cursor.close()
conn.close()
#增删改都要commit

r=cursor.executemany(sql,[(‘‘,‘‘),(‘‘,‘‘),(‘‘,‘‘)])   #提交多个

r是一个返回值,受影响的行数

import pymysql

conn=pymysql.connect(host=localhost,user=root,password=‘‘,database=day61)
cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)  #游标,拿数据
sql="select * from app01_userinfo limit 3"
cursor.execute(sql)
‘‘‘
result=cursor.fetchone()
print(result)
result=cursor.fetchone()
print(result)
result=cursor.fetchone()
print(result)
#cursor.scroll(1,mode=‘relative‘)
cursor.scroll(2,mode=‘absolute‘)
result=cursor.fetchone()
print(result)
result=cursor.fetchone()
print(result)
‘‘‘
result=cursor.fetchall()
print(result)
cursor.close()
conn.close()

以上是关于数据库的主要内容,如果未能解决你的问题,请参考以下文章

部分代码片段

将代码片段插入数据库并在 textarea 中以相同方式显示

python 用于数据探索的Python代码片段(例如,在数据科学项目中)

如何在片段中使用 GetJsonFromUrlTask​​.java

Android 使用两个不同的代码片段获取当前位置 NULL

解决方案电影标题中缺少代码的片段,完成挑战更多[关闭]