数据库基础总结《一》MySql数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。 在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软 件。 MySQL是一种关系数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就 增加了速度并提高了灵活性。 MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,分为社区版和商业 版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网 站数据库。

MySql环境安装配置 

windows下的较为简单,在这里就不做介绍了。

Ubuntu 下的安装

sudo apt-get install MySQL-server MySQL-client

设置root用户密码

在user/bin目录下运行 mysql_secure_installation,再根据提示运行设置,之后再重启mysql服务。

MySQL启动时命令为     sudo mysql -u root -p

服务管理命令
            service MySQL start
            service MySQL stop
或者 重启    service MySQL restart  

允许远程连接的配置方法:找到mysql配置文件并修改

sudo vi /etc/mysql/mysql.conf.d/mysql.cnf
将该文档中的bind-address=127.0.0.1 注释掉
注意:若文件找不到可以一步步cd |ls找到该文件

卸载命令:

sudo apt-get --purge remove mysql-server mysql-common mysql-client

相关术语

 主键:一个记录中有若干个属性,其中一个能唯一标识该记录,该属性就是主键 比如一条记录包括身份证号,姓名,年龄,身份证号是唯一确定这个人的,它就是主键

外键:外键是与另一张表的关联,能确定另一个表中的记录 比如: 有三个表: 客户表:记录客户的信息,如客户编号,客户名称,地址,联系方式等 商品表:记录商品的信息,比如商品编号,商品名称,品牌,单价,库存数量等 订单表:包括订单信息 一条订单记录:包括客户编号,商品编号,商品数量,金额等属性 客户编号是客户表中的主键,它就是订单表的外键

约束:一种限制,通过对表的行或列的数据做出限制,来确保数据的完整性、唯一性 比如:在订单记录中,指定的客户编码,必须是客户表中存在的客户 商品编号,必须是商品表中存在的商品。

表字段约束

  • 主键  primary key
  • 非空  not  null
  • 唯一   unique
  • 默认   default
  • 外键    foreign key

表字段类型

常见类型

  • int   整数       decimal    复数          float   浮点数
  • 字符串:varchar   text
  • 日期:datetime
  • 布尔:bit

MySql  命令

连接命令
      打开黑窗口(终端)需要提前配置环境变量
      mysql -uuser -p
      -u后为用户   回车后要输入密码
      完整命令  mysql -h 192.168.12.200 -p 3306 -uroot -p
      -h 为主机地址    -p端口值

      退出登录
      quit/exit/(\q)

数据库操作

       显示所有数据库
       show databases;

       创建数据库
       create database 名;

       删除数据库
       drop database 名;

       切换数据库
       use 名;

       查看当前数据库
       select database();
  
       
表操作

       查看当前数据内的所有表
       show tables;

       创建表
       create table 名(列及类型);

       create table students(id int auto_increment primary key not null,
                             sname varchar(10) not null,
                             );
        
       修改表
       alter table 表名 add|change|drop 列名 类型;
       
       alter table 表名 add 列名 类型;--添加某一列
       alter table 表名 change 原列名 新列名 类型; --修改表的列属性名
       alter table 表名 drop 列名; --删除表的某一列
       alter table 表名 rename 新表名; --修改表名


      删除表
      drop table 表名;

      查看表结构
      desc 表名;


数据操作

       查询
       select * from 表名;     查询所有的表的内容

       
       增加
       
       全列插入:insert into 表名 values(...)
       缺省插入:insert into 表名(列1,...) values(值1,...)
       缺省插入:insert into 表名 set field1=value1,field2=value2
       同时插入多条数据:insert into 表名 values(...),(...)...;
      主键列是自动增长,但是在全列插入时需要占位,通常使用0,插入成功后以实际数据为准
    
      修改
         update 表名 set 列1=值1,.....where 条件

      删除
          delete from 表名 where...;


外键

      MySQL创建关联表可以理解为是两个表之间有个外键关系,但这两个表必须满足三个条件
         1.两个表必须是InnoDB数据引擎
         2.使用在外键关系的域必须为索引型(Index)
         3.使用在外键关系的域必须与数据类型相似
      外键的好处:可以使得两张表关联,保证数据的一致性和实现一些级联操作;

      定义外键
             
      constraint name foreign key (teaid) references tea (id) on delet restrict on restrict;

     添加外键
     alter table stu add constraint name foreign key(teaid) references tea(id);

     删除外键
     alter table stu drop foreign key name;

     在父表上进行update/delete以更新或删除在子表中有一条或多条对应匹配行的候选键时,父表的行为取决   于:在定义子表的外键时指定的on update/on delete子句。


     CASCADE 删除包含与已删除键值有参照关系的所有记录
     SET NULL 修改包含与已删除键值有参照关系的所有记录,使用NULL值替换(只能用于已标记为NOT NULL 的字段)
     RESTRICT 拒绝删除要求,直到使用删除键值的辅助表被手工删除,并且没有参照时(这是默认设置,也是最安全的设置)
     NOACTION 啥也不做


数据备份与恢复
     
     在终端窗口中执行:
                    mysqldump -uroot -p 数据库名 >~/Desktop/备份文件.sql;
                    按提示输入密码

     恢复:
         连接mysqk,创建数据库
         退出连接,执行如下命令
         mysql -uroot –p 数据库名 < ~/Desktop/备份文件.sql
         根据提示输入mysql密码


数据库的授权

      grant all on *.* to zzy@localhost identified by '1234'; 给与所有数据库权限
      grant select on db.stu to zzy@localhost identified by '1234'; 给与指定的数据库
      
      删除用户
      use mysql
      delete from user where user ='zzy';
      修改密码
      use mysql
      update user set password=password('新密码') where User="zzy" ;


知识进阶

      as 在select后面的列名部分,可以使用as为列起别名,这个别名出现在结果集中

      distinct   消除重复行
                 在select后面列前使用distinct可以消除重复的行
                 select distinct gender from students;
        
      where   条件关键词
              使用where子句对表中的数据筛选,结果为true的行会出现在结果集中
              select * from 表名 where 条件;

      比较运算符
                等于=  大于>  小于<  大于等于 >=   小于等于 <=   不等于 != / <>
                查询编号大于3的学生
                select * from students where id>3;
                查询编号不大于4的科目
                select * from subjects where id<=4;
                查询姓名不是“黄蓉”的学生
                select * from students where sname!='黄蓉';
                查询没被删除的学生
                select * from students where isdelete=0;

      逻辑运算符
                and  or  not
                查询编号大于3的女同学
                select * from students where id>3 and gender=0;

      模糊查询 
                like    %表示任意多个字符    _表示一个任意字符
                查询姓黄的学生
                select * from students where sname like '黄%';
                查询姓黄并且名字是一个字的学生
                select * from students where sname like '黄_';
                查询姓黄或叫靖的学生
                select * from students where sname like '黄%' or sname like '%靖%';

      范围查询
                in表示在一个非连续的范围内
                查询编号是1或3或8的学生
                select * from students where id in(1,3,8);

                between ... and ...表示在一个连续的范围内
                查询学生是3至8的学生
                select * from students where id between 3 and 8;
                查询学生是3至8的男生
                select * from students where id between 3 and 8 and gender=1;

      空判断
                注:null是空,而''并不是空,其代表有内容
                判空is null
                   查询没有填写地址的学生
                   select * from students where hometown is null;
                判非空is not null
                   查询填写了地址的学生
                   select * from students where hometown is not null;
                   查询填写了地址的女生
                   select * from students where hometown is not null and gender=0;

      优先级顺序
                小括号 > not > 比较运算符 > 逻辑运算符
                and比or先运算,若同时出现并希望or先运算则用小括号
       
      聚合函数
                count(*)表示计算总行数,括号中写星与列名,结果是相同的
                查询学生总数
                select count(*) from students;

                max(列)表示求此列的最大值
                查询女生的编号最大值
                select max(id) from students where gender=0;

                min(列)表示求此列的最小值
                查询学生最小编号
                select min(id) from students where gender=0;

                sum(列)表示求此列的和
                查询男生的编号之和
                select sum(id) from students where gender=1;

                avg(列)表示求此列的平均值
                查询女生的编号平均值
                select avg(id) from students where gender=0;

       分组
                按照字段分组,表示此字段相同的数据会被放到一个组中 
                分组后,只能查询出相同的数据列,对于有差异的数据列无法出现在结果集中

                可以对分组后的数据进行统计,做聚合运算
                select 列1,列2,聚合... from 表名 group by 列1,列2,列3...
                查询男女生总数
                select gender as 性别,count(*) from students group by gender;
                查询各城市人数
                select hometown as 家乡,count(*) from students group by hometown;  
       排序     
                为了方便查看数据,可以对数据进行排序
                select * from 表名 order by 列1 asc|desc,列2 asc|desc,...
                将行数据按照列1进行排序,如果某些行列1的值相同时,则按照列2排序,以此类推
                asc从小到大排列,即升序
                desc从大到小排序,即降序

                查询男生学生信息,按学号降序
                select * from students where gender=1 order by id desc; 

       分页     
                获取部分行
                当数据量过大时,在一页中查看数据是一件非常麻烦的事情
                select * from 表名 limit start,count
                从start开始,获取count条数据
                start索引从0开始
               
                示例:分页
                已知:每页显示m条数据,当前显示第n页
                求第n页的数据
                select * from students limit (n-1)*m,m

      内连接查询
        
                是指所有查询出的结果都是能够在连接的表中有对应记录的。
                select e.empName,d.deptName from t_employee e
                INNER JOIN t_dept d ON e.dept = d.id;

      左外连接

                是指以左边的表的数据为基准,去匹配右边的表的数据,如果匹配到就显示,匹配不到就显示为null。
                SELECT e.empName,d.deptName
                from t_employee e
                LEFT OUTER JOIN t_dept d
                on d.id = e.dept;

      右外链接
 
                右外连接是同理的,只是基准表的位置变化了而已
                SELECT e.empName,d.deptName
                from t_employee e
                RIGHT OUTER JOIN t_dept d
                on d.id = e.dept;

      全外链接
                把两张表的字段都查出来,没有对应的值就显示null,但是注意:mysql是没有全外连接的(mysql中没有full outer join关键字),想要达到全外连接的效果,可以使用union关键字连接左外连接和右外连接。  
                select e.empName,d.deptName
                FROM t_employee e
                left JOIN t_dept d
                ON e.dept = d.id
                UNION
                select e.empName,d.deptName
                FROM t_employee e
                RIGHT JOIN t_dept d
                ON e.dept = d.id;

     自连接查询

                自连接查询就是当前表与自身的连接查询,关键点在于虚拟化出一张表给一个别名
                select empName from t_employee where id in (select id from t_employee where id<10);


事务
   
      事务: 为了保证数据的完整性,成批的SQL要么全部执行,要么全部不执行。
      通常用来操作数据量大,复杂度高的数据
      事务通常用来管理update insert delete
      MySQL中只有使用innerDB引擎才支持事务
      ACID特性
      原子性:要么全部执行,要么全部不执行
      一致性 :事务开始前结束后对数据的完整性不会破坏
      隔离性 :允许多个并发事务同时对数据的读写,防止多个并发执行引起的不一致
      持久性:事务处理结束后,对数据的修改是永久的
      常用操作
      begin 开始事务
      rollback 回滚
      commit 结束事务
      想要使用事务必须使用INNODB引擎


Python操作MySQL数据库

      配置Python中的mysql模块
            Python3 中安装 pymysql
      
      Connection对象
            作用:建立与数据库的连接。
            创建对象:调用connect()方法,con = pymsql.Connect()
                     参数host:连接的mysql主机,如果本机是'localhost'
                     参数port:连接的mysql主机的端口,默认是3306
                     参数db:数据库的名称
                     参数user:连接的用户名
                     参数password:连接的密码
                     参数charset:通信采用的编码方式,默认是'gb2312',要求与数据库创建时指定的 编码一致,否则中文会乱码

            对象的方法:
                     close()关闭连接
                     commit()事务,所以需要提交才会生效
                     rollback()事务,放弃之前的操作
                     cursor()返回Cursor对象,用于执行sql语句并获得结果

      Cursor对象
            作用:游标对象,用于操作执行sql语句
            创建对象:cursor = con.cursor()
            
            对象的方法
                close()关闭
                execute(operation [, parameters ])执行语句,返回受影响的行数
                fetchone()执行查询语句时,获取查询结果集的第一个行数据,返回一个元组
                fetchall()执行查询时,获取结果集的所有行,一行构成一个元组,再将这些元组装入一个元组返回
                fetchmany(n)执行查询时,获取n行,一行构成一个元组,再将这些元组装入一个元组返回
                next() 执行查询语句时,获取当前行的下一行()
                scroll(value[,mode])将行指针移动到某个位置
                mode表示移动的方式
                mode的默认值为relative,表示基于当前行移动到value,value为正则向下移动,value为负则向上移动
                mode的值为absolute,表示基于第一条数据的位置,第一条数据的位置为0
                对象的属性
                rowcount只读属性,表示最近一次execute()执行后受影响的行数


CURD(Create Update Read Delete)

        create:

               创建testInsert.py文件,向学生表中插入一条数据
               import pymysql
               try:
                  conn=pymysql.connect  (host='localhost',port=3306,db='test1',user='root',passwd='mysql',charset='utf8')
                  cs1=conn.cursor()
                  count=cs1.execute("insert into students(sname) values('张良')")
                  print(count)
                  conn.commit()
                  cs1.close()
                  conn.close()
              except Exception as e:
                  conn.rollback()
                  print(e)

         update:

               创建testUpdate.py文件,修改学生表的一条数据
               
               import MySQLdb
               
               try:
                   conn=pymysql.connect (host='localhost',port=3306,db='test1',user='root',passwd='mysql',charset='utf8')
                   cs1=conn.cursor()
                   count=cs1.execute("update students set sname='刘邦' where id=6")
                   print(count)
                   conn.commit()
                   cs1.close()
                   conn.close()
                except Exception,e:
                   conn.rollback()
                   print(e)


         read:
            
               创建testSelectOne.py文件,查询一条学生信息

               import pymysql

               try:
                   conn=pymysql.connect(host='localhost',port=3306,db='test1',user='root',passwd='mysql',charset='utf8')
                   cur=conn.cursor()
                   cur.execute('select * from students where id=7')
                   result=cur.fetchone()
                   result=cur.fetchall()
                   print(result)
                   cur.close()
                   conn.close()
              except Exception as e:
                   print(e) 


         delete:

                创建testDelete.py文件,删除学生表的一条数据

                import MySQLdb

                try:
                    conn=pymysql.connect(host='localhost',port=3306,db='test1',user='root',passwd='mysql',charset='utf8')
                    cs1=conn.cursor()
                    count=cs1.execute("delete from students where id=6")
                    print(count)
                    conn.commit()
                    cs1.close()
                    conn.close()
               except Exception,e:
                    print(e)


ORM_SQLALChemy

                   ORM技术:Object-Relational Mapping,把关系数据库的表结构映射到对象上。操作数据库像操作对象一样,是不是很简单?  
                   但是由谁来做这个转换呢?所以ORM框架应运而生。
                   在Python中,最有名的ORM框架是SQLAlchemy。

            框架安装
                   需要安装sqlalchemy以及mysql-connector-python两个模块

            操作流程:

#引入模块
import sqlalchemy
# print(sqlalchemy.__version__)
创建连接实例
from sqlalchemy import create_engine
engine = create_engine("mysql+mysqlconnector://root:123456@localhost/sqlalchemytest")
# result = engine.execute("show tables")
# print(result.fetchall())
创建会话
from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind=engine); #通过bind 参数使Session连接到数据库
# print(Session)
创建对应于MySql数据表的类
#新建类
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column,Integer,String #需要列的类型
Base = declarative_base() #Base为所有自定一类的父类
class Test(Base):
    __tablename__ = "test" #必须写 决定于mysql那个表关联
    id = Column(Integer, primary_key=True) # 关联到表中id列
    name = Column(String(45))

与数据库交互
session = Session()
#查询
result = session.query(Test.id,Test.name).filter(Test.id==1).first()
print(result)
#添加
# session.add( Test(id=0,name='wangzhenxing'))
# session.commit()
#修改
# t5 = session.query(Test).filter(Test.id == 5).first()
# t5.name="caoxiang"
# session.commit()
# session.query(Test).filter(Test.id == 4).update({Test.name:"456" })
# session.commit()
#删除
# t4 = session.query(Test).filter(Test.id==4).first()
# session.delete(t4)
# session.commit()
# session.query(Test).filter(Test.id==2).delete()
# session.commit()

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值