Sql 的简单总结

创建用户,库,表

创建用户:grant 操作权限 on 库名.表名 to '用户名@ip地址' identified by '密码';
查询用户:select user from mysql.user;
删除用户: delete from mysql.user where user='待删除的user';
新建库: create database 库名;
查询库: show databases;
切换到库: use 库名;
新建表: create table 表名(id int,name char(8));
查表:show tables;
查看表结构: desc 表名;
改表名等: alter table t1 change name name1 char(12);
删除表:drop table t1;
操作内容:
增:insert into t1 values(1,'alex'),(2,'wusir');
查:select * from t1;
改:update t1 set name='sb' where id=1;
删:delete from where id=1;

 

表的增删改

1.存储引擎:
    innodb  数据存储在硬盘  存两个文件  支持事务、行级锁、外键
    myisam  数据存储在硬盘  存三个文件  不支持事务、行级锁、外键
    memory  数据存储在内存  重启server数据丢失
    
2. 常用的数据类型:intfloatdatetimecharvarchar、enum、set 
   char和varchar的区别:
        char:定长字符串、表示的长度小、浪费储存空间、读写速度快。
     varchar:变长字符串、表示的长度大、节省储存空间、读写速度慢。
     
3. create table 表名(
        id int unique auto_increment, # 唯一主键
        id int primary key,  # 设置主键
        name char(12),
        password char(32)
        unique(name,password) # 联合唯一
        primary key(name,password) # 设置联合主键
        sex enum('male','female') not null default 'male'  # 不为空和默认
        foreign key(id) references 外表(字段名)  # 设置外键
        on update cascade on delete cascade  # 级联更新,级联删除
        )
        
    # 创建表    
    create table 表名(
          字段名 类型(长度约束)  其他约束,
          字段名 类型(长度约束)  其他约束,
          字段名 类型(长度约束)  其他约束);
          
    # 删除表:
    drop table 表名
    
    # 修改表    
    alter table 表名 rename 新表名;
                      add    新字段  类型(长度约束)  其他约束 first;
                      drop   字段 ;
                      modify 原字段名  新类型(新长度) 新约束 after 某字段;
                      change 原字段名  新字段名 新类型(新长度) 新约束;
                      
    # 查看表结构
    desc 表名 == describe 表名
    show create table 表名; 查看详细表结构,存储引擎 编码 更复杂的约束条件

 

单表查询

增加数据:insert into 表名 values(...)
    删除数据:delete from 表名 where id=3
    更新数据:update 表名 set 字段名=新的值 where age>20
    
    表的查询:
    单表查询:
        select 字段名  from 表名
        select * from 表 
        
        去重 distinct
            select distince 某个字段 from 表  # 对某个字段去重
            
        对筛选的结果进行四则运算
            select 字段*12 from 表
            
        在显示查询结果的时候临时重命名
            select 字段名 as 新名字 from 表;
            select 字段名 新名字 from 表;
            
        concat函数
            concat('你想拼接的内容',字段名,'你想拼的其他内容','字段名')
            concat_ws('连接符号',字段1,字段2,....)
            
        case语句
        SELECT
            (case
            when emp_name = 'jingliyang' then
                emp_name
            when emp_name = 'alex' then
                concat(emp_name,'_bigsb')
            else
                concat(emp_name,'_sb')
            end) as new_name
        FROM employee;
        
        where条件
            select 字段 fromwhere 条件
            比较运算符  > < >= <= <> !=
            范围(范围更大) between a and b 查询a,b之间的所有内容
            范围(范围更精准) in (a,b,c)   查询值为a或者b或者c的所有内容
            like
                select * fromwhere emp_name like '金%'%是一个通配符,表示任意长度的任意內容)
                select * fromwhere emp_name like '金三_'(_也是一个通配符,表示一个长度的任意内容)
            逻辑运算符 and or not
            身份运算符 is null/ is not null
            正则匹配
                所有人的身份证号,匹配所有身份证号是15位的居民  ^\d{15}$
                select 字段 fromwhere age regexp '^\d{15}$';
        
        group by(分组)
            根据分组的字段自动的做去重,其他重复的项目都不会在结果中显示
            但是可以使用count来计算每个组中的项,也可以使用group_concat来查看组内的名字
        
        having
            总是和group by 连用,where中不能出现聚合函数,所以和聚合函数有关的条件筛选也只能用having
            对分组进行条件过滤
        
        order by
            默认从小到大排序  升序 asc
            从大到小排序      降序 desc
        
        limit
            取前n个或者web开发中做分页功能
            显示前n条 limit n
            从第m条开始,显示n条   limit m,n
            从第m+1条开始,显示n条 limit n offset m

 

多表查询(多练习)

内连接
select * from employee inner join department on employee.dep_id=department.id;
左连接
select * from employee left join department on employee.dep_id=department.id;
右连接
select * from employee right join department on employee.dep_id=department.id;
全外连接
select * from employee left join department on employee.dep_id=department.id
-> union
-> select * from employee right join department on employee.dep_id=department.id;

 

索引及pymysql

# 索引原理
# b+树
# 1.b 是balance 表示的是这个树最终是能够达到平衡的
# 2.数据不是平铺直叙的存储在硬盘山
# 3.影响查询速度的最重要的因素是树的高度
# 4.我们要做的事情,或者我们想要加速查询 降低树的高度
    # 1.让索引的字段尽量的短
    # 2.让索引的字段区分度高
# 5.b+树和普通的b树比起来有什么区别
    # 1.b+树只在叶子节点存数据
        # 有利于降低树的高度
        # 稳定查询所有数据的io次数
    # 2.在所有的叶子节点之间添加了双向链表
        # 导致了所有的范围查询b+树的效率比b树高
# 6.mysql中 innodb  myisam的索引都是由b+树完成的
    # innodb 支持 聚集索引(叶子节点存具体的数据) + 辅助索引(叶子节点存地址)
        # 聚集索引也叫 聚簇索引
    # myisam 只支持辅助索引,也叫非聚集索引

 

索引
mysql中所有的key
index key 普通索引,能够加速查询,辅助索引
unique key 唯一 + 索引,辅助索引
primary key 唯一 + 非空 + 聚集索引
foreign key 本身没有索引的,但是它关联的外表中的字段是unique索引
primary key 和unique 标识的字段不需要再添加索引
能用unique的时候尽量不用index,unique除了是索引之外还能做唯一约束,如果做了唯一约束
创建索引
creeat index 索引名 on 表名(字段名)
删除索引
drop index 索引名 on 表名

关于索引的说明
1.条件一定是建立了索引的字段,如果条件使用的字段根本就没有创建索引,那么索引不生效
2.如果条件是一个范围,随着范围的值逐渐增大,那么索引能发挥的作用也越小
3.如果使用like进行模糊查询,那么使用a%的形式能命中索引,%a形式不能命中索引
4.尽量选择区分度高的字段作为索引列
5.索引列不能在条件中参与计算,也不能使用函数
6.在多个条件以and相连的时候,会优点选择区分度高的索引列来进行查询
在多个条件以or相连的时候,就是从左到右依次判断
7.制作联合索引
7.1.最左前缀原则 a,b,c,d 条件是a的能命中索引,条件是a,b能命中索引,a,b,c能命中,a,c.... 只要没有a就不能命中索引
如果在联合查询中,总是涉及到同一个字段,那么就在建立联合索引的时候将这个字段放在最左侧
7.2.联合索引 如果按照定义顺序,从左到右遇到的第一个在条件中以范围为条件的字段,索引失效
尽量将带着范围查询的字段,定义在联合索引的最后面
如果我们查询的条件总是多个列合在一起查,那么就建立联合索引
create index ind_mix on s1(id,email)
select * from s1 where id = 1000000 命中索引
但凡是创建了联合索引,那么在查询的时候,再创建顺序中从左到右的第一列必须出现在条件中
select count(*) from s1 where id = 1000000 and email = 'eva10%'; 命中索引
select count(*) from s1 where id = 1000000 and email like 'eva10%'; 可以命中索引
select * from s1 where id >3000 and email = 'eva300000@oldboy'; 不能命中索引
8.条件中涉及的字段的值必须和定义表中字段的数据类型一致,否则不能命中索引

关于索引的两个名词
覆盖索引 查一个数据不需要回表
select name fromwhere age = 20 不是覆盖索引
select age fromwhere age =20 是覆盖索引
select count(age) fromwhere age =20 是覆盖索引
合并索引
当我们为单独的一列创建索引的时候
如果条件是这一列,且使用正确就可以命中索引
当我们为两列分别创建单独的索引的时候
如果这两列都是条件,那么可能只能命中期中一个条件
如果这两列都是条件,那么可能会命中两个索引 - 合并索引
我们为多列直接创建联合所以
条件命中联合索引

执行计划
看看mysql准备怎么执行这条语句 可以看到是否命中索引,计划能命中哪些,实际命中了哪些,执行的顺序,是否发生了索引合并,覆盖索引
explain select * from s1;

 pymysql

import pymysql

db = pymysql.connect(host='localhost', user='root',
                     database='homework')

cur = db.cursor(cursor=pymysql.cursors.DictCursor)

cur.execute('select * from class')

ret = cur.fetchone()
print(ret)  # 查一个

ret1 = cur.fetchmany(4)
print(ret1)  # 查四个

ret2= cur.fetchall()
print(ret2)  # 查全部  少用

db.commit()
cur.close()
db.close()

 概念补充

存储引擎
    innodb : 外键  行级锁(并发修改)  事务(客户管理系统)
    myisam : 表级锁 不支持外键\事务\行级锁
    memory : 只能在内存中存储数据 重启server数据丢失
# 第一种方式: Myisam 是5.5之前默认的存储引擎
# 数据存在硬盘上,存三个文件,表结构,数据,和搜索目录
# 既不支持事务、也不支持外键、不支持行级锁
# 只支持表锁
# 对于只读操作比较多的情况 查询速度相对快
# 第二种方式: Innodb 是5.6之后的默认存储引擎
# 数据存在硬盘上,存两个文件,表结构,(数据和搜索目录)
# 支持事务
# 支持行级锁
# 支持外键
# 第三种方式: Memory
# 数据存在内存中,存一个文件,表结构(在硬盘上)
# 数据容易丢失,但读写速度都快

# 几个需要讲解的关键词
# 事务 transaction
# 在修改数据时保证了数据的安全性
# 行级锁和表级锁
# 外建约束
mysql中的基础数据类型

数字
    int
    float(8,2)
字符串
    char      定长字符串  越是长度固定char越节省空间  读写速度快
    varchar  变长字符串  越是长度不固定varchar越节省空间  读写速度慢
时间
    year
    date    入职日期  离职 开学 毕业
    time
    datetime  出生日期 交易记录 打卡时间
    timestamp  一般不用
enum 和 set
    enum 单选  (性别)
        # enum('male','female')
    set 多选(去重)
完整性约束
    id int unsigned  # 无符号的整数
    id int default 0  # 默认为0
    id int not null
    id int unique
    auto_increment   # 相当于非空+自增且只能用于整数类型
        # id int unique auto_increment
        # id int primary key auto_increment
    非空 + 唯一
        # id int unique not null 如果没有主键,第一个设置非空唯一的就是主键
    联合唯一
        # id int,
        # name char(12),
        # unique(id,name)
    primary key  主键 一张表只能有一个主键
        # id int primary key
    foreign key  外键
        # id int,
        # name char(12),
        # tid int,
        # foreign key(tid) references 外表(字段名) on update cascade on delete cascade

 数据备份

数据备份

#语法:
# mysqldump -h 服务器 -u用户名 -p密码 数据库名 > 备份文件.sql

#示例:
#单库备份
mysqldump -uroot -p123 db1 > db1.sql
mysqldump -uroot -p123 db1 table1 table2 > db1-table1-table2.sql

#多库备份
mysqldump -uroot -p123 --databases db1 db2 mysql db3 > db1_db2_mysql_db3.sql

#备份所有库
mysqldump -uroot -p123 --all-databases > all.sql 


数据恢复

#方法一:
[root@egon backup]# mysql -uroot -p123 < /backup/all.sql

#方法二:
mysql> use db1;
mysql> SET SQL_LOG_BIN=0;   #关闭二进制日志,只对当前session生效
mysql> source /root/db1.sql


事物和锁

begin;  # 开启事务
select * from emp where id = 1 for update;  # 查询id值,for update添加行锁;
update emp set salary=10000 where id = 1; # 完成更新
commit; # 提交事务

 

posted @ 2019-05-08 14:04  blog_wu  阅读(200)  评论(0编辑  收藏  举报