【python MySQL 笔记】MySQL的基本使用

【python MySQL 笔记】MySQL的基本使用

目录

1. 数据库简介

2. MySQL安装

2.1. 服务器端安装

2.2. 客户端安装

3. 数据完整性

3.1. 数据类型

3.2. 约束

5. 命令行脚本

5.1. 数据库操作

5.2. 数据表操作

5.3. 数据的 增删改查 (重要)


mysql官网文档:https://dev.mysql.com/doc/refman/5.7/en/

1. 数据库简介

数据库是一种特殊的文件,其中存储着需要的数据。

当前主要使用两种类型的数据库:关系型数据库非关系型数据库,本部分主要讨论关系型数据库。

注:查看数据库排名:https://db-engines.com/en/ranking

关系型数据库:

关系型数据库核心元素:

  • 数据行(记录)
  • 数据列(字段)
  • 数据表(数据行的集合)
  • 数据库(数据表的集合)

RDBMS:

RDBMS即 Relational Database Management System (关系型数据库管理系统),是一个程序;

是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。

关系型数据库的主要产品:

  • oracle:在以前的大型项目中使用,银行,电信等项目
  • mysql:web时代使用最广泛的关系型数据库
  • ms sql server:在微软的项目中使用
  • sqlite:轻量级数据库,主要应用在移动平台

RDBMS和数据库的关系:

通过 RDBMS 来管理数据库的文件。但 RDBMS 一般十分复杂,所以一般将 RDBMS 做成 C-S 的架构,普通用户通过 client 用SQL语句和数据库进行通信。

SQL:

SQL(Structured Query Language)即结构化查询语言。

SQL是结构化查询语言,是一种用来操作RDBMS的数据库语言,当前关系型数据库都支持使用SQL语言进行操作,也就是说可以通过 SQL 操作 oracle,sql server,mysql,sqlite 等关系型的数据库。

  • SQL语句主要分为:
    • DQL:数据查询语言,用于对数据进行查询,如select
    • DML:数据操作语言,对数据进行增加、修改、删除,如insert、udpate、delete
    • TPL:事务处理语言,对事务进行处理,包括begin transaction、commit、rollback
    • DCL:数据控制语言,进行授权与权限回收,如grant、revoke
    • DDL:数据定义语言,进行数据库、表的管理等,如create、drop
    • CCL:指针控制语言,通过控制指针完成表的操作,如declare cursor
  • 对于web程序员来讲,重点是数据的crud(增删改查),必须熟练编写DQL、DML,能够编写DDL完成数据库、表的操作,其它语言如TPL、DCL、CCL了解即可
  • SQL 是一门特殊的语言,专门用来操作关系数据库
  • 不区分大小写

MySQL特点:

  • 使用C和C++编写,并使用了多种编译器进行测试,保证源代码的可移植性

  • 支持多种操作系统,如Linux、Windows、AIX、FreeBSD、HP-UX、MacOS、NovellNetware、OpenBSD、OS/2 Wrap、Solaris等

  • 为多种编程语言提供了API,如C、C++、Python、Java、Perl、PHP、Eiffel、Ruby等

  • 支持多线程,充分利用CPU资源

  • 优化的SQL查询算法,有效地提高查询速度
  • 提供多语言支持,常见的编码如GB2312、BIG5、UTF8
  • 提供TCP/IP、ODBC和JDBC等多种数据库连接途径
  • 提供用于管理、检查、优化数据库操作的管理工具
  • 大型的数据库。可以处理拥有上千万条记录的大型数据库
  • 支持多种存储引擎
  • MySQL 软件采用了双授权政策,它分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择MySQL作为网站数据库
  • MySQL使用标准的SQL数据语言形式
  • Mysql是可以定制的,采用了GPL协议,你可以修改源码来开发自己的Mysql系统
  • 在线DDL更改功能
  • 复制全局事务标识
  • 复制无崩溃从机
  • 复制多线程从机
  • 开源、免费、使用范围广,跨平台支持性好,提供了多种语言调用的 API,是学习数据库开发的首选

2. MySQL安装

MySQL 5.7参考手册:https://dev.mysql.com/doc/refman/5.7/en/

2.1. 服务器端安装

在Ubuntu中,在终端中输入如下命令,回车后,然后按照提示输入:

sudo apt-get install mysql-server
  • 服务器用于接收客户端的请求、执行sql语句、管理数据库
  • 服务器端一般以服务方式管理,名称为mysql
  • 启动服务:sudo service mysql start
  • 查看进程中是否存在mysql服务:ps -aux|grep mysql  (ps -aux 显示进程信息, I 管道,grep mysql 搜索mysql ;top动态显示进程信息)
  • 停止服务:sudo service mysql stop
  • 重启服务:sudo service mysql restart

 

配置:

  • 配置文件目录文件为:/etc/mysql/mysql.cnf ,除注释外含以下语句:

!includedir /etc/mysql/conf.d/

!includedir /etc/mysql/mysql.conf.d/

  • 进入conf.d目录,打开mysql.cnf,发现并没有配置
  • 进入mysql.conf.d目录,打开mysql.cnf,可以看到配置项,主要配置项如下:
  • bind-address表示服务器绑定的ip,默认为127.0.0.1
  • port表示端口,默认为3306
  • datadir表示数据库目录,默认为/var/lib/mysql
  • general_log_file表示普通日志,默认为/var/log/mysql/mysql.log
  • log_error表示错误日志,默认为/var/log/mysql/error.log

2.2. 客户端安装

客户端为开发人员与dba使用,通过socket方式与服务端通信,常用的有navicat、命令行mysql。通常开发用的是命令行SQL语句。

命令行客户端:

  • 在终端运行命令安装sudo apt-get install mysql-client
  • 详细连接的命令可以查看帮助文档:mysql --help
  • 最基本的连接命令如下:mysql -uroot -pmysql    (即 mysql -u用户名 -p密码 )
  • 连接成功后会提示:Welcome to the MySQL monitor.....等信息
  • ctrl+d或输入如下命令退出:quit 或者 exit 

图形化界面客户端navicat:(了解)

  • Navicat官网下载(收费,14天试用)
  • 将压缩文件拷贝到ubuntu中,解压:tar zxvf 文件名
  • 进入解压的目录,运行如下命令:./start_navicat
  • 点击两次取消后点击试用,即可打开软件界面
  • (更新:新版本拷贝到ubuntu中,直接打开即可)

1.中文乱码对策 :打开start_navicat文件

将export LANG="en_US.UTF-8"改为export LANG="zh_CN.UTF-8"

2.试用期到期后:删除用户目录下的.navicat64目录,重新运行./start_navicat安装。(更新:该法失效。

cd ~

rm -r .navicat64

3. 数据完整性

一个数据库就是一个完整的业务单元,可以包含多张表,数据被存储在表中;在表中为了更准确的存储数据,保证数据正确有效,可以在创建表的时候,为表添加一些强制性的验证,包括数据字段的类型约束

更完善内容参考mysql官网文档:https://dev.mysql.com/doc/refman/5.7/en/

3.1. 数据类型

注:更全面的说明参考相关mysql文档:https://dev.mysql.com/doc/refman/5.7/en/data-types.html

  • 常用数据类型如下
    • 整数:int,bit
    • 小数:decimal
    • 字符串:varchar,char
    • 日期时间: date, time, datetime
    • 枚举类型(enum)
  • 特别说明的类型如下
    • decimal表示浮点数,如decimal(5,2)表示共存5位数,小数占2位;
    • char表示固定长度的字符串,如char(3),如果填充'ab'时会补一个空格为'ab ';
    • varchar表示可变长度的字符串,如varchar(3),填充'ab'时就会存储'ab';
    • 字符串text表示存储大文本,当字符大于4000时推荐使用;
    • 对于图片、音频、视频等大文件,不存储在数据库中,而是上传到某个服务器上,然后在表中存储这个文件的保存路径 

常用的数据类型

Numeric Data Types

类型 字节大小 有符号范围(Signed) 无符号范围(Unsigned)
TINYINT 1 -128 ~ 127 0 ~ 255
SMALLINT 2 -32768 ~ 32767 0 ~ 65535
MEDIUMINT 3 -8388608 ~ 8388607 0 ~ 16777215
INT/INTEGER 4 -2147483648 ~2147483647 0 ~ 4294967295
BIGINT 8 -9223372036854775808 ~ 9223372036854775807 0 ~ 18446744073709551615

String Data Types

类型 字节大小 示例
CHAR 0-255 类型:char(3) 输入 'ab', 实际存储为'ab ', 输入'abcd' 实际存储为 'abc'
VARCHAR 0-255 类型:varchar(3) 输 'ab',实际存储为'ab', 输入'abcd',实际存储为'abc'
TEXT 0-65535 大文本

Date and Time Data Types

类型 字节大小 示例
DATE 4 '2020-01-01'
TIME 3 '12:29:59'
DATETIME 8 '2020-01-01 12:29:59'
YEAR 1 '2017'
TIMESTAMP 4 '1970-01-01 00:00:01' UTC ~ '2038-01-01 00:00:01' UTC

注:使用数据类型的原则为 够用就行,尽量使用取值范围小的

3.2. 约束

  • 主键primary key:物理上存储的顺序
  • 非空not null:此字段不允许填写空值
  • 惟一unique:此字段的值不允许重复
  • 默认default:当不填写此值时会使用默认值,如果填写时以填写为准
  • 外键foreign key:对关系字段进行约束,当为关系字段填写值时,会到关联的表中查询此值是否存在,如果存在则填写成功,如果不存在则填写失败并抛出异常。通俗的讲,存储 别的表的主键 的字段 称为外键
  • 说明:虽然外键约束可以保证数据的有效性,但是在进行数据的crud(增加、修改、删除、查询)时,都会降低数据库的性能,所以不推荐使用数据的有效性还可以在逻辑层进行控制

5. 命令行脚本

  • 连接数据库mysql -uroot -p,回车后输入密码(mysql -u用户名 -p密码  mysql -u用户名 -p [回车] 再输入密码)
  • 查看版本:select version();
  • 显示当前时间:select now();
  • ctrl+d或输入如下命令退出:quit 或者 exit 

5.1. 数据库操作

常用的数据库操作:

查看所有数据库

show databases;

使用数据库

use 数据库名;

查看当前使用的数据库

select database();

创建数据库(:若数据库名带小横线,需加反引号`,`在键盘左上角) 

create database 数据库名 charset=utf8;
例:
create database python charset=utf8;

create database `python-test` charset=utf8;

删除数据库

drop database 数据库名;
例:
drop database python;

相关笔记

-- 数据库的操作  (注释以 "--" 开头)

    -- 链接数据库
    mysql -uroot -p
    mysql -uroot -pmysql

    -- 退出数据库
    exit/quit/ctrl+d
    

    -- sql语句最后需要有分号;结尾
    -- 显示数据库版本
    select version();

    -- 显示时间
    select now();

    -- 查看所有数据库
    show databases;
    

    -- 创建数据库
    -- create database 数据库名 charset=utf8;
    -- 注:若数据库名带小横线,需加反引号`
    create database python_test;
    create database python_testnew charset=utf8;
    create database `python-test`;


    -- 查看创建数据库的语句
    -- show crate database ....
    show create database python_test;
    

    -- 查看当前使用的数据库
    select database();

    -- 使用数据库
    -- use 数据库的名字
    use python_test;

    -- 删除数据库
    -- drop database 数据库名;  
	-- 注:若数据库名带小横线,需加反引号`
    drop database python_test;

5.2. 数据表操作

使用 use 数据库名;  来使用数据库后,就可以对数据表进行操作。

相关操作的笔记:


-- 数据表的操作------------------------------------------------------------------

    -- 查看当前数据库中所有表
    show tables;
    
	
    -- 创建表---------------------------------
    -- auto_increment表示自动增长
    -- not null 表示不能为空
    -- primary key 表示主键
    -- default 默认值
	
    -- create table 数据表名字 (字段 类型 约束[, 字段 类型 约束]);
    create table xxxxx(id int, name varchar(30));  --有个int类型的id字段,varchar类型的name字段
	
	-- id加上约束:主键、非空、自动增长;如下
    create table yyyyy(id int primary key not null auto_increment, name varchar(30)); 
	
	-- 写成多行,提高可读性
    create table zzzzz(
        id int primary key not null auto_increment,
        name varchar(30)  --最后一个不需要逗号
    );

	
    -- 查看表结构
    -- desc 数据表的名字;
    desc xxxxx;
	
	
	
	

-- !练习:创建学生表和班级表----------------------
	
    -- 创建students表(id、name、age、high、gender、cls_id)
    create table students(
        id int unsigned not null auto_increment primary key,  -- unsigned 无符号类型
        name varchar(30),
        age tinyint unsigned default 0,
        high decimal(5,2), 
        gender enum("男", "女", "中性", "保密") default "保密",
        cls_id int unsigned  
    );
	
	-- 插入一个数据
    insert into students values(0, "老王", 18, 188.88, "男", 0); 
	
	-- 查看数据
    select * from students;

	
    -- 创建classes表(id、name)
    create table classes(
        id int unsigned not null auto_increment primary key,
        name varchar(30)
    );

    insert into classes values(0, "python班01");
    select * from classes;

	
	
	
-- 修改和删除表的 字段--------------------------------
    

    -- 修改表-添加字段
    -- alter table 表名 add 列名 类型;
    alter table students add birthday datetime;
    

    -- 修改表-修改字段:不改字段名版
    -- alter table 表名 modify 列名 类型及约束;
    alter table students modify birthday date;


    -- 修改表-修改字段:改字段名版
    -- alter table 表名 change 原名 新名 类型及约束;
    alter table students change birthday birth date default "2000-01-01";


    -- 修改表-删除字段
    -- alter table 表名 drop 列名;
    alter table students drop high;


    -- 删除表
    -- drop table 数据表名;
	drop table xxxxx;
	
	-- 删库跑路
    -- drop database 数据库;
	
	
	-- !查看表的创建语句
    -- show create table 表名;
    show create table students;
    

关键

创建MySQL数据表的SQL通用语法:

CREATE TABLE table_name (column_name column_type);
create table 数据表名字 (字段 类型 约束[, 字段 类型 约束]);

5.3. 数据的 增删改查 (重要)

CURD: 创建(Create)、更新(Update)、读取(Retrieve)和删除(Delete)。

Create笔记

插入语法

INSERT INTO table_name ( field1, field2,...fieldN )
                       VALUES
                       ( value1, value2,...valueN );
 -- 增加--------------------------------------
        -- 全列插入----------------------
        -- insert [into] 表名 values(...)
        -- 主键字段 可以用 0  null   default 来占位
        -- 向classes表中插入 一个班级
        insert into classes values(0, "python班02");

		
        --下方语句基于以下表结构:
        +--------+-------------------------------------+------+-----+------------+----------------+
        | Field  | Type                                | Null | Key | Default    | Extra          |
        +--------+-------------------------------------+------+-----+------------+----------------+
        | id     | int(10) unsigned                    | NO   | PRI | NULL       | auto_increment |
        | name   | varchar(30)                         | YES  |     | NULL       |                |
        | age    | tinyint(3) unsigned                 | YES  |     | 0          |                |
        | gender | enum('男','女','中性','保密')       | YES  |     | 保密       |                |
        | cls_id | int(10) unsigned                    | YES  |     | NULL       |                |
        | birth  | date                                | YES  |     | 2000-01-01 |                |
        +--------+-------------------------------------+------+-----+------------+----------------+

        -- 向students表插入 一个学生信息
        insert into students values(0, "小李飞刀", 20, "女", 1, "1990-01-01");
        insert into students values(null, "小李飞刀", 20, "女", 1, "1990-01-01");
        insert into students values(default, "小李飞刀", 20, "女", 1, "1990-01-01");

        -- 失败
        -- insert into students values(default, "小李飞刀", 20, "第4性别", 1, "1990-02-01");

        -- 【枚举中】:下标从1 开始 1---“男” 2--->"女"....
        insert into students values(default, "小李飞刀", 20, 1, 1, "1990-02-01");

		
        -- 部分插入------------------------
        -- insert into 表名(列1,...) values(值1,...)
        insert into students (name, gender) values ("小乔", 2);


        -- !多行插入-----------------------------
        insert into students (name, gender) values ("大乔", 2),("貂蝉", 2);
        insert into students values(default, "西施", 20, "女", 1, "1990-01-01"), (default, "王昭君", 20, "女", 1, "1990-01-01");


Update笔记

-- 修改-------------------------------------------------
	
    -- update 表名 set 列1=值1,列2=值2... where 条件;
        update students set gender=1; -- 一列全部都改了
        update students set gender=1 where name="小李飞刀"; -- 只要name是小李飞刀的 全部的修改
        update students set gender=1 where id=3; -- !只要id为3的 进行修改
        update students set age=22, gender=1 where id=3; -- 只要id为3的 进行修改

基本Retrieve笔记:

-- 查询基本使用------------------------------------------
	
        -- *查询所有列
        -- select * from 表名;
        select * from students;

        ---条件查询
        select * from students where name="小李飞刀"; -- 查询 name为小李飞刀的所有信息
        select * from students where id>3; -- 查询 name 为小李飞刀的所有信息


        -- 查询指定列
        -- select 列1,列2,... from 表名;
        select name,gender from students;


        -- 可以使用 [as] 为列或表指定【别名】
        -- select 字段[as 别名] , 字段[as 别名] from 数据表 where ....;
        select name as 姓名,gender as 性别 from students;


        -- 字段的顺序
        select id as 序号, gender as 性别, name as 姓名 from students;
    

Delete笔记:

-- 删除----------------------------------------------------
	
        -- 物理删除-------------------
        -- delete from 表名 where 条件
        delete from students; -- 整个数据表中的所有数据全部删除
        delete from students where name="小李飞刀";

        -- 逻辑删除-------------------
        -- 用一个字段来表示 这条信息是否已经不能再使用了
        -- 给students表添加一个 is_delete字段 bit 类型
        alter table students add is_delete bit default 0;
		-- 用更改字段值代表删除
        update students set is_delete=1 where id=6;

附:

mysql官网文档:https://dev.mysql.com/doc/refman/5.7/en/

w3school教程:https://www.w3school.com.cn/sql/index.asp

------end-------

发布了50 篇原创文章 · 获赞 10 · 访问量 6612

猜你喜欢

转载自blog.csdn.net/qq_23996069/article/details/104304077