ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

Python中MySQL(pymsql)的使用

2019-09-11 14:39:55  阅读:425  来源: 互联网

标签:username name Python MySQL pymsql mysql NULL id select


文章目录

mysql数据库

Mysql数据库

Mysql是最流行的关系型数据库管理系统,在WEB应用方面MySQL是最好的RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。由瑞典MySQL AB公司开发,目前属于Oracle公司。MySQL是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下公司。MySQL 最流行的关系型数据库管理系统,在 WEB 应用方面MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。

  • Mysql是开源的,所以不需要支付额外的费用。
  • Mysql支持大型的数据库。可以处理拥有上千万条记录的大型数据库。
  • MySQL使用标准的SQL数据语言形式。
  • Mysql可以允许于多个系统上,并且支持多种语言。这些编程语言包括C、C++、Python、Java、Perl、PHP、Eiffel、Ruby和Tcl等。
  • Mysql对PHP有很好的支持
  • MySQL支持大型数据库,支持5000万条记录的数据仓库,32位系统表文件最大可支持4GB,64位系统支持最大的表文件为8TB。
  • Mysql是可以定制的,采用了GPL协议,你可以修改源码来开发自己的Mysql系统。

mysql数据库的安装

参考链接: https://www.cnblogs.com/xsmile/p/7753984.html

1.下载

官网下载地址1:https://dev.mysql.com/downloads/mysql/

官网下载地址2, https://downloads.mysql.com/archives/community/

2.拉到网页下面,选择 Windows (x86, 64-bit), ZIP Archive

3.点击download,网页跳转后,不要点击 ‘Login’ 和 ‘Sign up’,点击 No thanks, just start my download

4.解压到指定路径

5.进入解压好后的文件夹,创建my.ini文件并用编辑器打开,进行编辑,内容如下:

[mysql]

# 设置mysql客户端默认字符集

default-character-set=utf8

[mysqld]

#设置3306端口

port = 3306

# 设置mysql的安装目录

basedir=对应目录:\mysql-5.7.21-winx64

# 设置mysql数据库的数据的存放目录

datadir=对应的目录:\mysql-5.7.21-winx64\data

# 允许最大连接数

max_connections=200

# 服务端使用的字符集默认为utf-8

character-set-server=utf8

# 创建新表时将使用的默认存储引擎

6(可以忽略) .default-storage-engine=INNODB6.下载安装VC++ https://dl.pconline.com.cn/download/864971-1.html,下载好后,直接进行安装

我这里是VC++2015版的,也可以下载其他版本

7.添加环境变量,
    右键我的电脑,高级系统设置,环境变量,下面的滚动框找到Path,双击打开后,在末尾添加, C:\mysql\mysql-8.0.13-winx64\bin

8.以管理员身份运行终端,进入文件包的bin目录
 在终端依次输入:
  
  cd mysql-8.0.13-winx64
  cd bin
  mysqld --install
  mysqld --initialize
  net start mysql
9.服务启动成功后,在musql文件包data目录下找以 .err 结束的文件,用编辑器打开,
找到一行,
A temporary password is generated for root@localhost: 初始化密码

复制初始化密码

10.在终端输入
mysql -uroot -p 初始化密码

11.进入数据库成功后,输入
alter user user() indentified by 123456;
123456是新密码,可以换成你自己想要的

12.下次登录就可以直接在终端输入 mysql -uroot -p123456

修改密码:

8.0+ ALTER user ‘root’@‘localhost’ IDENTIFIED BY ‘root’;

前版本: set password for 用户名@localhost = password(‘新密码’);

建库以及基本系统信息的操作

1.远程登陆mysql服务器
mysql -uroot -p -h192.168.137.10 -P3306

2.查询数据库
show databases;
默认数据库:
mysql - 用户权限相关数据
test - 用于用户测试数据
information_schema - MySQL本身架构相关数据

3.查看当前用户
select user();

4.查看当前所在数据库
select database();

5.查看数据库版本
select version();

6.查看数据库状态
show status; 当前会话状态
show global status; 全局数据库状态
show slave status\G; 查看主从数据库状态信息

7.查询数据库参数
show variables;

8.修改数据库参数
show variables like ‘max_connect%’;
set global max_connect_errors = 1000;(重启数据库会失效,要在配置文件中修改)

9.查看当前数据库队列
show processlist;

10.创建数据库
CREATE DATABASE 数据库名称 DEFAULT CHARSET utf8 COLLATE utf8_general_ci; # 默认编码格式utf8
COLLATE utf8_general_ci用于数据库中的排序规则
CREATE DATABASE 数据库名称 DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci; # 默认编码格式gbk

11.进入数据库
USE db_name

12.查看权限
show grants for ‘用户’@‘IP地址’

13.授权
grant 权限 on 数据库.表 to ‘用户’@‘IP地址’

14.取消权限
revoke 权限 on 数据库.表 from ‘用户’@‘IP地址’

数据库表的操作

1.登陆数据库系统

在命令行中登陆MySQL数据库管理系统,输入一下内容:

mysql -h ip地址 -u 用户名 -p 密码

很多人都知道这个,但是其中参数的具体表示什么我们还是要了解的,其中,“-h”参数指连接的主机名,所以后面是localhost;“-u”参数表示用户名,此处的用户名为root;“-p”参数表示用户的密码,按下Enter键后就显示“Enter password:”,输入密码即可登录进去了。

2.创建数据库

在创建数据库之前,我们可以查看已经存在的数据库:

mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| community          |
| community_test     |
| data               |
| mydata             |
| mysql              |
| performance_schema |
| test               |
+--------------------+
8 rows in set (0.04 sec)

创建数据库的格式:CREATE DATABASE 数据库名;

示例:创建一个名为example的数据库

3.删除数据库:

格式:DROP DATABASE 数据库名;

示例:删除example数据库

mysql>  DROP DATABASE example;
Query OK, 0 rows affected (0.07 sec)

mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| community          |
| community_test     |
| data               |
| mydata             |
| mysql              |
| performance_schema |
| test               |
+--------------------+
8 rows in set (0.00 sec)

4**.数据库存储引擎**

存储引擎就是指表的类型,数据库存储引擎决定了表在计算机的存储方式。

MySQL中查询存储引擎的类型命令:SHOW ENGINES;

mysql> SHOW ENGINES;
+--------------------+---------+------------------------------------------------
----------------+--------------+------+------------+
| Engine             | Support | Comment
                | Transactions | XA   | Savepoints |
+--------------------+---------+------------------------------------------------
----------------+--------------+------+------------+
| FEDERATED          | NO      | Federated MySQL storage engine
                | NULL         | NULL | NULL       |
| MRG_MYISAM         | YES     | Collection of identical MyISAM tables
                | NO           | NO   | NO         |
| MyISAM             | YES     | MyISAM storage engine
                | NO           | NO   | NO         |
| BLACKHOLE          | YES     | /dev/null storage engine (anything you write to
 it disappears) | NO           | NO   | NO         |
| CSV                | YES     | CSV storage engine
                | NO           | NO   | NO         |
| MEMORY             | YES     | Hash based, stored in memory, useful for tempor
ary tables      | NO           | NO   | NO         |
| ARCHIVE            | YES     | Archive storage engine
                | NO           | NO   | NO         |
| InnoDB             | DEFAULT | Supports transactions, row-level locking, and f
oreign keys     | YES          | YES  | YES        |
| PERFORMANCE_SCHEMA | YES     | Performance Schema
                | NO           | NO   | NO         |
+--------------------+---------+------------------------------------------------
----------------+--------------+------+------------+
9 rows in set (0.00 sec)

查询结果中,Engine参数指存储引擎名称;Support参数说明MySQL是否支持该类型引擎;Comment参数表示对该引擎的评论;Transaction参数表示是否支持事务处理;XA参数表示是否分布式交易处理的XA规范;Savepoints参数表示是否支持保存点,以方便事务的回滚(类似ctrl z的效果)操作;由上面我们看到InnoDB存储引擎是default的,也就是数据库默认的存储引擎,下面我们简单介绍一下InnoDB。

InnoDB是MySQL的一种存储引擎,InnoDB给MySQL提供了事务、回滚、崩溃修复能力和多版本并发控制的事务安全。InnoDB是MySQL上第一个提供外键约束的表引擎,而且对事务处理的能力,也是其他存储引擎不能比拟的。不过这种引擎的缺点就是读写效率稍差,占用的数据空间相对比较大。

5.创建表

注意数据库的数据类型

参考链接: https://www.cnblogs.com/-xlp/p/8617760.html

参考链接: https://baijiahao.baidu.com/s?id=1600802275296040138&wfr=spider&for=pc

数值类型

整数类型 字节 范围(有符号) 范围(无符号) 用途

TINYINT 1字节 (-128,127) (0,255) 小整数值

SMALLINT 2字节 (-32 768,32 767) (0,65 535) 大整数值

MEDIUMINT 3字节 (-8 388 608,8 388 607) (0,16 777 215) 大整数值

INT或INTEGER 4字节 (-2 147 483 648,2 147 483 647) (0,4 294 967 295) 大整数值 (重要

BIGINT 8字节 (-9 233 372 036 854 775 808,9 223 372 036 854 775 807) (0,18 446 744 073 709 551 615) 极大整数值

FLOAT 4字节 (-3.402 823 466 E+38,1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) 0,(1.175 494 351 E-38,3.402 823 466 E+38) 单精度浮点数值 (重要

DOUBLE 8字节 (1.797 693 134 862 315 7 E+308,2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 双精度浮点数值 (重要

DECIMAL 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 依赖于M和D的值 依赖于M和D的值 小数值

INT 类型:

在 MySQL 中支持的 5 个主要整数类型是 TINYINT,SMALLINT,MEDIUMINT,INT 和 BIGINT。这些类型在很大程度上是相同的,只有它们存储的值的大小是不相同的。

FLOAT、DOUBLE 和 DECIMAL 类型

MySQL 支持的三个浮点类型是 FLOAT、DOUBLE 和 DECIMAL 类型。FLOAT 数值类型用于表示单精度浮点数值,而 DOUBLE 数值类型用于表示双精度浮点数值。

与整数一样,这些类型也带有附加参数:一个显示宽度指示器和一个小数点指示器。比如语句 FLOAT(7,3) 规定显示的值不会超过 7 位数字,小数点后面带有 3 位数字。

对于小数点后面的位数超过允许范围的值,MySQL 会自动将它四舍五入为最接近它的值,再插入。

DECIMAL 数据类型用于精度要求非常高的计算中,这种类型允许指定数值的精度和计数方法作为选择参数。精度在这里指为这个值保存的有效数字的总个数,

而计数方法表示小数点后数字的位数。比如语句 DECIMAL(7,3) 规定了存储的值不会超过 7 位数字,并且小数点后不超过 3 位。

忽略 DECIMAL 数据类型的精度和计数方法修饰符将会使 MySQL 数据库把所有标识为这个数据类型的字段精度设置为 10,计算方法设置为 0。

UNSIGNED 和 ZEROFILL 修饰符也可以被 FLOAT、DOUBLE 和 DECIMAL 数据类型使用。并且效果与 INT 数据类型相同。

字符串类型

MySQL 提供了8个基本的字符串类型,分别:CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM 各SET等多种字符串类型。可以存储的范围从简单的一个字符到巨大的文本块或二进制字符串数据。

字符串类型 字节大小 描述及存储需求

CHAR 0-255字节 定长字符串

VARCHAR 0-255字节 变长字符串

​ TINYBLOB 0-255字节 不超过 255 个字符的二进制字符串

​ TINYTEXT 0-255字节 短文本字符串

BLOB 0-65535字节 二进制形式的长文本数据

TEXT 0-65535字节 长文本数据

​ MEDIUMBLOB 0-16 777 215字节 二进制形式的中等长度文本数据

​ MEDIUMTEXT 0-16 777 215字节 中等长度文本数据

​ LONGBLOB 0-4 294 967 295字节 二进制形式的极大文本数据

​ LONGTEXT 0-4 294 967 295字节 极大文本数据

​ VARBINARY(M) 允许长度0-M个字节的定长字节符串,值的长度+1个字节

​ BINARY(M) M 允许长度0-M个字节的定长字节符串

CHAR 和 VARCHAR 类型

CHAR 类型用于定长字符串,并且必须在圆括号内用一个大小修饰符来定义。这个大小修饰符的范围从 0-255。比指定长度大的值将被截短,而比指定长度小的值将会用空格作填补。

CHAR 类型可以使用 BINARY 修饰符。当用于比较运算时,这个修饰符使 CHAR 以二进制方式参于运算,而不是以传统的区分大小写的方式。

CHAR 类型的一个变体是 VARCHAR 类型。它是一种可变长度的字符串类型,并且也必须带有一个范围在 0-255 之间的指示器。CHAR 和 VARCHGAR 不同之处在于 MYSQL 数据库处理

这个指示器的方式:CHAR 把这个大小视为值的大小,不长度不足的情况下就用空格补足。而 VARCHAR 类型把它视为最大值并且只使用存储字符串实际需要的长度

(增加一个额外字节来存储字符串本身的长度)来存储值。所以短于指示器长度的 VARCHAR 类型不会被空格填补,但长于指示器的值仍然会被截短。

因为 VARCHAR 类型可以根据实际内容动态改变存储值的长度,所以在不能确定字段需要多少字符时使用 VARCHAR 类型可以大大地节约磁盘空间、提高存储效率。

VARCHAR 类型在使用 BINARY 修饰符时与 CHAR 类型完全相同。

TEXT 和 BLOB 类型

对于字段长度要求超过 255 个的情况下,MySQL 提供了 TEXT 和 BLOB 两种类型。根据存储数据的大小,它们都有不同的子类型。这些大型的数据用于存储文本块或图像、声音文件等二进制数据类型。

TEXT 和 BLOB 类型在分类和比较上存在区别。BLOB 类型区分大小写,而 TEXT 不区分大小写。大小修饰符不用于各种 BLOB 和 TEXT 子类型。比指定类型支持的最大范围大的值将被自动截短

日期和时间类型

在处理日期和时间类型的值时,MySQL 带有 5 个不同的数据类型可供选择。它们可以被分成简单的日期、时间类型,和混合日期、时间类型。

根据要求的精度,子类型在每个分类型中都可以使用,并且 MySQL 带有内置功能可以把多样化的输入格式变为一个标准格式。

类型 大小(字节) 范围 格式 用途

**DATE 4 1000-01-01/9999-12-31 YYYY-MM-DD 日期值 **

**TIME 3 ‘-838:59:59’/‘838:59:59’ HH:MM:SS 时间值或持续时间 **

YEAR 1 1901/2155 YYYY 年份值

DATETIME 8 1000-01-01 00:00:00/9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 混合日期和时间值

TIMESTAMP 4 1970-01-01 00:00:00/2037 年某时 YYYYMMDD HHMMSS 混合日期和时间值,时间戳

DATE、TIME 和 TEAR 类型

MySQL 用 DATE 和 TEAR 类型存储简单的日期值,使用 TIME 类型存储时间值。这些类型可以描述为字符串或不带分隔符的整数序列。如果描述为字符串,

DATE 类型的值应该使用连字号作为分隔符分开,而 TIME 类型的值应该使用冒号作为分隔符分开。

需要注意的是,没有冒号分隔符的 TIME 类型值,将会被 MySQL 理解为持续的时间,而不是时间戳。

MySQL 还对日期的年份中的两个数字的值,或是 SQL 语句中为 TEAR 类型输入的两个数字进行最大限度的通译。因为所有 TEAR 类型的值必须用 4 个数字存储。

MySQL 试图将 2 个数字的年份转换为 4 个数字的值。把在 00-69 范围内的值转换到 2000-2069 范围内。把 70-99 范围内的值转换到 1970-1979 之内。

如果 MySQL 自动转换后的值并不符合我们的需要,请输入 4 个数字表示的年份。

DATEYIME 和 TIMESTAMP 类型

除了日期和时间数据类型,MySQL 还支持 DATEYIME 和 TIMESTAMP 这两种混合类型。它们可以把日期和时间作为单个的值进行存储。

这两种类型通常用于自动存储包含当前日期和时间的时间戳,并可在需要执行大量数据库事务和需要建立一个调试和审查用途的审计跟踪的应用程序中发挥良好作用。

如果我们对 TIMESTAMP 类型的字段没有明确赋值,或是被赋与了 null 值。MySQL 会自动使用系统当前的日期和时间来填充它。

复合类型

MySQL 还支持两种复合数据类型 ENUM 和 SET,它们扩展了 SQL 规范。虽然这些类型在技术上是字符串类型,但是可以被视为不同的数据类型。

一个 ENUM 类型只允许从一个集合中取得一个值;而 SET 类型允许从一个集合中取得任意多个值。

ENUM 类型

ENUM 类型因为只允许在集合中取得一个值,有点类似于单选项。在处理相互排拆的数据时容易让人理解,比如人类的性别。ENUM 类型字段可以从集合中取得一个值或使用 null 值,

除此之外的输入将会使 MySQL 在这个字段中插入一个空字符串。另外如果插入值的大小写与集合中值的大小写不匹配,MySQL 会自动使用插入值的大小写转换成与集合中大小写一致的值。

ENUM 类型在系统内部可以存储为数字,并且从 1 开始用数字做索引。一个 ENUM 类型最多可以包含 65536 个元素,其中一个元素被 MySQL 保留,用来存储错误信息,

这个错误值用索引 0 或者一个空字符串表示。

MySQL 认为 ENUM 类型集合中出现的值是合法输入,除此之外其它任何输入都将失败。这说明通过搜索包含空字符串或对应数字索引为 0 的行就可以很容易地找到错误记录的位置。

SET 类型

SET 类型与 ENUM 类型相似但不相同。SET 类型可以从预定义的集合中取得任意数量的值。并且与 ENUM 类型相同的是任何试图在 SET 类型字段中插入非预定义的值都会使

MySQL 插入一个空字符串。如果插入一个即有合法的元素又有非法的元素的记录,MySQL 将会保留合法的元素,除去非法的元素。

一个 SET 类型最多可以包含 64 项元素。在 SET 元素中值被存储为一个分离的“位”序列,这些“位”表示与它相对应的元素。“位”是创建有序元素集合的一种简单而有效的方式。

并且它还去除了重复的元素,所以 SET 类型中不可能包含两个相同的元素。

希望从 SET 类型字段中找出非法的记录只需查找包含空字符串或二进制值为 0 的行。

通过对每种数据类型的用途,物理存储,表示范围等有一个概要的了解。这样在面对具体应用时,就可以根据相应的特来来选择合适的数据类型,使得我们能够争取在满足应用的基础上,用较小的存储代价换来较高的数据库性能。

1)创建表的形式:

CREATE TABLE 表名 (
    属性名 数据类型 [完整约束条件],
    属性名 数据类型 [完整约束条件],
    ...
    ...
    属性名 数据类型 [完整约束条件]
);

在创建之前要选择数据库,格式:USE 数据库名;

示例创建一个student表:

mysql> use student;
Database changed
mysql> CREATE TABLE student (
    -> id int,
    -> name varchar(20)
    -> );
Query OK, 0 rows affected (0.09 sec)

创建表的时候涉及到一个完整性约束条件,下面就列出一个完整性约束条件表:

约束条件 说明
PRIMARY KEY 标识该属性为该表的主键,可以唯一的标识对应的元组
FOREIGN KEY 标识该属性为该表的外键,是与之联系某表的主键
NOT NULL 标识该属性不能为空
UNIQUE 标识该属性的值是唯一的
AUTO_INCREMENT 标识该属性的值是自动增加,这是MySQL的SQL语句的特色
DEFAULT 为该属性设置默认值

完整性约束条件的应用:

2)设置表的主键

链接外键: https://blog.csdn.net/u012393192/article/details/78597290

外键链接: https://www.cnblogs.com/sjxbg/p/9385058.html

表连接的链接:https://blog.csdn.net/u012393192/article/details/78597290

主键约束即在表中定义一个主键来唯一确定表中每一行数据的标识符。主键可以是表中的某一列或者多列的组合,其中由多列组合的主键称为复合主键。主键应该遵守下面的规则:

  • 每个表只能定义一个主键。
  • 主键值必须唯一标识表中的每一行,且不能为 NULL,即表中不可能存在两行数据有相同的主键值。这是唯一性原则。
  • 一个列名只能在复合主键列表中出现一次。
  • 复合主键不能包含不必要的多余列。当把复合主键的某一列删除后,如果剩下的列构成的主键仍然满足唯一性原则,那么这个复合主键是不正确的。这是最小化原则。

主键(PRIMARY KEY)”的完整称呼是“主键约束”.

在创建表时设置主键约束

在 CREATE TABLE 语句中,主键是通过 PRIMARY KEY来设置的
方法《1》, 在定义列的同时指定主键,语法规则如下:【实例 1】在 test_db 数据库中创建 tb_emp 3 数据表,其主键为 id,输入的 SQL 语句和运行结果如下所示。

【实例 1】在 test_db 数据库中创建 tb_emp 3 数据表,其主键为 id,输入的 SQL 语句和运行结果如下所示。

mysql> CREATE TABLE tb_emp3
    -> (
    -> id INT(11) PRIMARY KEY,
    -> name VARCHAR(25),
    -> deptId INT(11),
    -> salary FLOAT
    -> );
Query OK, 0 rows affected (0.37 sec)
mysql> DESC tb_emp3;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id     | int(11)     | NO   | PRI | NULL    |       |
| name   | varchar(25) | YES  |     | NULL    |       |
| deptId | int(11)     | YES  |     | NULL    |       |
| salary | float       | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+
4 rows in set (0.14 sec)

在定义完所有列之后,指定主键的语法格式为:【实例 2】在 test_db 数据库中创建 tb_emp 4 数据表,其主键为 id,输入的 SQL 语句和运行结果如下所示。

记这个:

mysql> CREATE TABLE tb_emp4
    -> (
    -> id INT(11),
    -> name VARCHAR(25),
    -> deptId INT(11),
    -> salary FLOAT,
    -> PRIMARY KEY(id)
    -> );
Query OK, 0 rows affected (0.37 sec)
mysql> DESC tb_emp4;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id     | int(11)     | NO   | PRI | NULL    |       |
| name   | varchar(25) | YES  |     | NULL    |       |
| deptId | int(11)     | YES  |     | NULL    |       |
| salary | float       | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+
4 rows in set (0.14 sec)

在创建表时设置复合主键

主键由多个字段联合组成,语法规则如下:

PRIMARY KEY [字段1,字段2,…,字段n]

【实例 3】创建数据表 tb_emp5,假设表中没有主键 id,为了唯一确定一个员工,可以把 name、deptId 联合起来作为主键,输入的 SQL 语句和运行结果如下所示。

mysql> CREATE TABLE tb_emp5
    -> (
    -> name VARCHAR(25),
    -> deptId INT(11),
    -> salary FLOAT,
    -> PRIMARY KEY(id,deptId)
    -> );
Query OK, 0 rows affected (0.37 sec)
mysql> DESC tb_emp5;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| name   | varchar(25) | NO   | PRI | NULL    |       |
| deptId | int(11)     | NO   | PRI | NULL    |       |
| salary | float       | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+
3 rows in set (0.14 sec)

在修改表时添加主键约束

在修改数据表时添加主键约束的语法规则为:

ALTER TABLE <数据表名> ADD PRIMARY KEY(<列名>);

查看 tb_emp2 数据表的表结构,如下所示。

mysql> DESC tb_emp2;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id     | int(11)     | NO   |     | NULL    |       |
| name   | varchar(30) | YES  |     | NULL    |       |
| deptId | int(11)     | YES  |     | NULL    |       |
| salary | float       | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+
4 rows in set (0.14 sec)

【实例 4】修改数据表 tb_emp2,将字段 id 设置为主键,输入的 SQL 语句和运行结果如下所示。

mysql> ALTER TABLE tb_emp2
    -> ADD PRIMARY KEY(id);
Query OK, 0 rows affected (0.94 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql> DESC tb_emp2;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id     | int(11)     | NO   | PRI | NULL    |       |
| name   | varchar(30) | YES  |     | NULL    |       |
| deptId | int(11)     | YES  |     | NULL    |       |
| salary | float       | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+
4 rows in set (0.12 sec)

4)设置表的非空约束

简单的说就是不让这个属性的值为空,不填的话就会报错

格式:属性名 数据类型 NOT NULL

5)设置表的唯一性约束

就是这个属性的值是不能重复的

格式:属性名 数据类型 UNIQUE

6)设置表的属性值自动增加

AUTO_INCREMENT约束的字段可以是任何整数类型(TINYINT、SMALLINT、INT和BIGINT),在默认的情况下,该字段的值是从1开始自增

格式:属性名 数据类型 AUTO_INCREMENT

7)设置表的属性的默认值

格式:属性名 数据类型 DEFAULT 默认值

综合示例:

mysql> CREATE TABLE student3 (
    -> id int PRIMARY KEY AUTO_INCREMENT,
    -> teacher_id int UNIQUE,
    -> name varchar(20) NOT NULL,
    -> sex varchar(10) DEFAULT 'male'
    -> );
Query OK, 0 rows affected (0.01 sec)

8)查看表结构

查看表基本结构语句DESCRIBE

格式:DESCRIBE 表名;

通过查看表的结构,就很明确的对表进行解读,而且可以查看一下自己创建的表有没错误,这个SQL语句必须会用啊

示例:

mysql> desc student3;
+------------+-------------+------+-----+---------+----------------+
| Field      | Type        | Null | Key | Default | Extra          |
+------------+-------------+------+-----+---------+----------------+
| id         | int(11)     | NO   | PRI | NULL    | auto_increment |
| teacher_id | int(11)     | YES  | UNI | NULL    |                |
| name       | varchar(20) | NO   |     | NULL    |                |
| sex        | varchar(10) | YES  |     | male    |                |
+------------+-------------+------+-----+---------+----------------+
4 rows in set (0.01 sec)

查看表详细结构语句SHOW CREATE TABLE

通过这个SQL语句可以查看表的详细定义,除了字段名、字段的数据类型、约束条件外,还可以查看表的默认存储引擎和字符编码

格式:SHOW CREATE TABLE 表名;

示例:

mysql> SHOW CREATE TABLE student3;
+----------+-----------------------------------
-----------------------------------------------
-----------------------------------------------
---------------------------------------------+
| Table    | Create Table


                                             |
+----------+-----------------------------------
-----------------------------------------------
-----------------------------------------------
---------------------------------------------+
| student3 | CREATE TABLE `student3` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `teacher_id` int(11) DEFAULT NULL,
  `name` varchar(20) NOT NULL,
  `sex` varchar(10) DEFAULT 'male',
  PRIMARY KEY (`id`),
  UNIQUE KEY `teacher_id` (`teacher_id`)
) ENGINE=InnoDB DEFAULT CHARSET=gb2312 |
+----------+-----------------------------------
-----------------------------------------------
-----------------------------------------------
---------------------------------------------+
1 row in set (0.00 sec)

6.修改表:

1)修改表名

表名可以在一个数据库中唯一的确定一张表。

格式:ALTER TABLE 旧表名 RENAME 新表名;

示例:

mysql> ALTER TABLE student RENAME student4;
Query OK, 0 rows affected (0.11 sec)

mysql> DESCRIBE student;
ERROR 1146 (42S02): Table 'example.student' doesn't exist

由上面可以看出,改名后的表已经不存在了。

2)修改字段的数据类型

格式:ALTER TABLE 表名 MODIFY 属性名 数据类型;

mysql> DESCRIBE student1;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | NO   | PRI | NULL    |       |
| name  | varchar(20) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.08 sec)

mysql> ALTER TABLE student1 MODIFY name varchar(30);
Query OK, 0 rows affected (0.06 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> DESCRIBE student1;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | NO   | PRI | NULL    |       |
| name  | varchar(30) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.01 sec)

3)修改字段名:

格式:ALTER TABLE 表名 CHANGE 旧属性名 新属性名 新数据类型;

示例:

mysql> DESCRIBE student1;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | NO   | PRI | NULL    |       |
| name  | varchar(30) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

mysql> ALTER TABLE student1 CHANGE name stu_name varchar(40);
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> DESCRIBE student1;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id       | int(11)     | NO   | PRI | NULL    |       |
| stu_name | varchar(40) | YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

修改的字段名的同时也修改了数据类型

4)增加字段

格式:ALTER TABLE 表名 ADD 属性名1 数据类型 [完整性约束条件] [FIRST | AFTER 属性名2];

其中,“属性名1”参数指需要增加的字段的名称;“FIRST”参数是可选参数,其作用是将新增字段设置为表的第一个字段;“AFTER”参数也是可选的参数,其作用是将新增字段添加到“属性名2”后面;“属性名2”当然就是指表中已经有的字段

示例:

mysql> DESCRIBE student1;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id       | int(11)     | NO   | PRI | NULL    |       |
| stu_name | varchar(40) | YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

mysql> ALTER TABLE student1 ADD teacher_name varchar(20) NOT NULL AFTER id;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> DESCRIBE student1;
+--------------+-------------+------+-----+---------+-------+
| Field        | Type        | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+-------+
| id           | int(11)     | NO   | PRI | NULL    |       |
| teacher_name | varchar(20) | NO   |     | NULL    |       |
| stu_name     | varchar(40) | YES  |     | NULL    |       |
+--------------+-------------+------+-----+---------+-------+
3 rows in set (0.01 sec)

5)删除字段

格式:ALTER TABLE 表名 DROP 字段名;

示例:

mysql> DESCRIBE student1;
+--------------+-------------+------+-----+---------+-------+
| Field        | Type        | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+-------+
| id           | int(11)     | NO   | PRI | NULL    |       |
| teacher_name | varchar(20) | NO   |     | NULL    |       |
| stu_name     | varchar(40) | YES  |     | NULL    |       |
+--------------+-------------+------+-----+---------+-------+
3 rows in set (0.01 sec)

mysql> ALTER TABLE student1 DROP teacher_name;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> DESCRIBE student1;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id       | int(11)     | NO   | PRI | NULL    |       |
| stu_name | varchar(40) | YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

6)更改表的存储引擎

格式:ALTER TABLE 表名 ENGINE = 存储引擎名;

示例:

mysql> SHOW CREATE TABLE student2;
+----------+----------------------------------------
----------------------------------------------------
----------------------------------------------------
| Table    | Create Table


+----------+----------------------------------------
----------------------------------------------------
----------------------------------------------------
| student2 | CREATE TABLE `student2` (
  `id` int(11) NOT NULL DEFAULT '0',
  `stu_id` int(11) NOT NULL DEFAULT '0',
  `name` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`,`stu_id`)
) ENGINE=InnoDB DEFAULT CHARSET=gb2312 |
+----------+----------------------------------------
----------------------------------------------------
----------------------------------------------------
1 row in set (0.05 sec)

mysql> ALTER TABLE student2 ENGINE = MYISAM;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> SHOW CREATE TABLE student2;
+----------+----------------------------------------
----------------------------------------------------
----------------------------------------------------
| Table    | Create Table


+----------+----------------------------------------
----------------------------------------------------
----------------------------------------------------
| student2 | CREATE TABLE `student2` (
  `id` int(11) NOT NULL DEFAULT '0',
  `stu_id` int(11) NOT NULL DEFAULT '0',
  `name` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`,`stu_id`)
) ENGINE=MyISAM DEFAULT CHARSET=gb2312 |
+----------+----------------------------------------
----------------------------------------------------
----------------------------------------------------
1 row in set (0.00 sec)

7)删除表的外键约束

格式:ALTER TABLE 表名 DROP FOREIGN KEY 外键别名;

示例:

mysql> SHOW CREATE TABLE teacher;
+---------+------------------------------------------------
-----------------------------------------------------------
-----------------------------------------------------------
--------------------------------------------------+
| Table   | Create Table


                                                  |
+---------+------------------------------------------------
-----------------------------------------------------------
-----------------------------------------------------------
--------------------------------------------------+
| teacher | CREATE TABLE `teacher` (
  `id` int(11) NOT NULL,
  `stu_id` int(11) DEFAULT NULL,
  `name` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `STUID` (`stu_id`),
  CONSTRAINT `STUID` FOREIGN KEY (`stu_id`) REFERENCES `stu
) ENGINE=InnoDB DEFAULT CHARSET=gb2312 |
+---------+------------------------------------------------
-----------------------------------------------------------
-----------------------------------------------------------
--------------------------------------------------+
1 row in set (0.08 sec)

mysql> ALTER TABLE teacher DROP FOREIGN KEY STUID;
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> SHOW CREATE TABLE teacher;
+---------+------------------------------------------------
-----------------------------------------------------------
--------------------------------------------------------+
| Table   | Create Table

                                                        |
+---------+------------------------------------------------
-----------------------------------------------------------
--------------------------------------------------------+
| teacher | CREATE TABLE `teacher` (
  `id` int(11) NOT NULL,
  `stu_id` int(11) DEFAULT NULL,
  `name` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `STUID` (`stu_id`)
) ENGINE=InnoDB DEFAULT CHARSET=gb2312 |
+---------+------------------------------------------------
-----------------------------------------------------------
--------------------------------------------------------+
1 row in set (0.00 sec)

7.删除表

格式:DROP TABLE 表名;

删除没有被关联的普通表:直接上面的SQL语句就行了

删除被其他表关联的父表:

方法一:先删除子表,在删除父表

方法二:删除父表的外键约束(上面有介绍),再删该表

8.表数据的操作

一、增

insert:增加(条件一条新纪录,默认新添加的记录都添加在已有记录的末尾)

1.格式: 1.1添加新纪录时,只给记录中的某几个字段赋值

insert into 表名(字段名1,字段名2...)values(值1,值2....);

*值得类型是字符的话需要用双引号引起来

1.2 添加新纪录时,给所有记录中的所有字段赋值

insert into 表名 values(值1,值2....);

*值得类型是字符的话需要用双引号引起来 *值与字段的类型一定匹配

2.例子 1.1 给表中插入一条记录

insert into usertab values(46,"plj",100,"x",2000,2000,"my teahere","/pljdir","/bin/bash");

1.2 给表中的指定字段赋值

insert into usertab(username,password,uid,gid,shell)values("plj","x",3000,3000,"/bin/bash");

1.3 如何给字段赋空值

update usertab set comment=NULL;

二、删

delete:删除(删除的是一整条记录)

1.格式: 1.1 删除表中的所有记录

delete from 数据库.表名;

1.2 只删除指定的记录

delete from 数据库.表名  where 条件表达式;

*条件表达式:数值比较、字符比较、范围内、空、非空、逻辑比较、模糊、正则表达式

2.例子:

1.1 删除uid字段为null的记录

mysql> select id,uid from usertab where uid is null;
+----+------+
| id | uid  |
+----+------+
| 27 | NULL |
| 28 | NULL |
| 29 | NULL |
| 30 | NULL |
| 31 | NULL |
| 32 | NULL |
| 33 | NULL |
| 34 | NULL |
| 35 | NULL |
| 36 | NULL |
| 37 | NULL |
| 38 | NULL |
| 39 | NULL |
| 40 | NULL |
| 41 | NULL |
| 42 | NULL |
+----+------+
16 rows in set (0.00 sec)
mysql> delete from usertab where uid is null;
Query OK, 16 rows affected (0.00 sec)
mysql> select id,uid from usertab where uid is null;
Empty set (0.00 sec)

三、改

update:修改字段的值

1.批量修改 1.1 格式:

update 数据库名.表名  set  字段名=值;
update 数据库名.表名  set  字段名=值,字段名=值;

1.2 例子

批量修改age字段的值为20
mysql> update usertab set age=20;
Query OK, 42 rows affected (0.00 sec)
Rows matched: 42  Changed: 42  Warnings: 0
mysql> select age from usertab;
+------+
| age  |
+------+
|   20 |
|   20 |
|   20 |
|   20 |
|   20 |
.....

2.只修改符合条件的记录中指定字段的值 1.1格式:

update 数据库名.表名  set  字段名=值,字段名=值 where 条件表达式;

*条件表达式:数值比较 字符比较 范围内 空 非空 逻辑比较 模糊 正则表达式

1.2例子: 修改username是root的age字段的值为30

mysql> update usertab set age=30 where username="root";
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0
mysql> select username,age from usertab;
+----------+------+
| username | age  |
+----------+------+
| root     |   30 |
| bin      |   20 |
| daemon   |   20 |
| adm      |   20 |
....

四、查

select:查询记录内容(值) 1.格式

 select     字段名列表    from    表名;
 select     字段名列表    from    数据库名.表名;
 select     字段名列表    from    数据库名.表名     where    条件表达式;

2.字段名列表的表示方式

#所有字段
*       
#查询某几个字段          
字段名1,字段名2,字段名N             

select 字段名列表 from 数据库名.表名 where 条件表达式;

例子:查看uid小于10的

 select  username,uid  from  数据库名.表名  where  uid < 10;  

3.条件表达式 1.1 数值比较 比较符号:> >= < <= = != 格式: 字段名(数值类型且是整型) 比较符号 数字 例子:

select   * from usertab    where    uid    =    10;

查询id=10的记录

mysql> select * from usertab where id = 10;
+----+----------+----------+------+------+---------+-----------------+---------------+
| id | username | password | uid  | gid  | comment | homedir         | shell         |
+----+----------+----------+------+------+---------+-----------------+---------------+
| 10 | uucp     | x        |   10 |   14 | uucp    | /var/spool/uucp | /sbin/nologin |
+----+----------+----------+------+------+---------+-----------------+---------------+
1 row in set (0.00 sec)

1.2字符比较 比较符号:= !=

格式: 字段名 “字符串” 比如:name=”root”

例子: 查询表中username=root的记录

mysql> select * from usertab where username="root";
+----+----------+----------+------+------+---------+---------+-----------+
| id | username | password | uid  | gid  | comment | homedir | shell     |
+----+----------+----------+------+------+---------+---------+-----------+
|  1 | root     | x        |    0 |    0 | root    | /root   | /bin/bash |
+----+----------+----------+------+------+---------+---------+-----------+
1 row in set (0.00 sec)

查询usertab表中usernam=root用户的username,uid,gid的记录

mysql> select username,uid,gid from usertab where username="root";
+----------+------+------+
| username | uid  | gid  |
+----------+------+------+
| root     |    0 |    0 |
+----------+------+------+
1 row in set (0.00 sec)

1.3范围内查找

in   在......里
not     in    不在.....里
between.......  and   在.....与....之间 (可以做字符比较,但很少用做字符)

例子:

select username ,uid from usertab where uid between 10 and 20;   :大于等于10小于等于20的
select username ,uid from usertab where uid a  and c;  

1.4 空和非空 匹配空:is null 匹配非空:is not null

例子: 匹配为空的

mysql> select * from usertab where username is NULL;
Empty set (0.00 sec)

匹配非空的

[外链图片转存失败(img-7nj6bdAO-1568182359214)(C:\Users\captain\Desktop\1620)]

*赋值的时候 ‘ ’ 和 ” ” 是等效的

#匹配空
select  id,username from  usertab where username is null;
#匹配字符串null
select  id,username from  usertab where username="null";
#匹配空
select  id,username from  usertab where username="";# ""有占字符
#匹配非空
select  id,username from  usertab where username is not null;

1.5逻辑比较 (查询时使用2个或2个以上查询条件)

逻辑与: and–多个条件必须同时成立

select username,uid from usertab where username="root" and uid=35 and shell="/bin/shell"

逻辑或:or–多个条件只要有一个条件成立就可以

select username,uid from usertab where username="root"     or    uid=35     or    shell="/bin/shell"
select     username,uid    from    usertab    where    username    in("root","daemon")    or    uid=10;

逻辑非:!–取反

select     username     from    usertab    username!="root"

distinct 不显示重复的值

select shell from usertab;

mysql> select distinct shell from usertab;

1.6模糊查询 查询用户名姓张的学生信息 格式: where 字段名 like ‘表达式’

表达式符号 : % 匹配0个到多个字符 _ 匹配任意一个字符

匹配任意3个字符 select username from usertab where username like ‘_ _ _’ _

匹配以r开头的任意3个字符 select username from usertab where username like ‘r_ _’

匹配以a开头的 select username from usertab where username like ‘a%’

select username from usertab where username like ‘a

select username from usertab where username like ‘张%’

使用正则表达式做查询条件

mysql> select username from usertab where username like ‘j%’;

1.7使用正则表达式的格式: where 字段名 regexp ‘正则表达式’

查询名字中包含数字的

mysql> select username from usertab where username regexp ‘[0-9]’;

查询uid是两位数的 mysql> select id,username,uid from usertab where uid regexp ‘^…$’;

4.查询时做四则运算 运算符号: + - * / %

1.1 加法

mysql> select  username,uid+gid   from  usertab;
+----------+---------+
| username | uid+gid |
+----------+---------+
| root     |       0 |
| bin      |       2 |
| daemon   |       4 |
| adm      |       7 |
+----------+---------+
42 rows in set (0.00 sec)

1.2减法运算

mysql> select username,2016-age as s_year from usertab where username="root";
+----------+--------+
| username | s_year |
+----------+--------+
| root     |   1995 |
+----------+--------+
1 row in set (0.00 sec)

3.乘法运算

mysql> select uid,gid,(uid*gid) as chengji from usertab where username="mail";
+------+------+---------+
| uid  | gid  | chengji |
+------+------+---------+
|    8 |   12 |      96 |
+------+------+---------+
1 row in set (0.00 sec)

*as chengji:表示给运算结果列取一个名字

4.除法运算

mysql> select  username,uid,gid,(uid+gid)/2  as pjcj from  usertab where username="www";
+----------+------+------+----------+
| username | uid  | gid  | pjcj     |
+----------+------+------+----------+
| www      |  501 |  501 | 501.0000 |
+----------+------+------+----------+
1 row in set (0.00 sec)

5.常用统计函数 avg():集合的平均值 sum():对集合中的各参数求和 min():集合中的最小值 max():集合中的最大值 count():记录的个数(空值不算)

1.1 统计所有字段的个数

mysql> select count(*) from usertab;
+----------+
| count(*) |
+----------+
|       42 |
+----------+
1 row in set (0.00 sec)

1.2 统计指定字段的个数

mysql> select count(username),count(uid) from usertab;
+-----------------+------------+
| count(username) | count(uid) |
+-----------------+------------+
|              42 |         26 |
+-----------------+------------+
1 row in set (0.00 sec)

6.排序 1.1 格式:(默认为升序)

order by 字段名  排序方式{ASC(升序),DESC(降序)}

1.2 例子:

*默认(升序)排序

mysql> select uid,username from usertab order by uid;
mysql> select uid,username from usertab order by uid;
+------+----------+
| uid  | username |
+------+----------+
| NULL |          |
| NULL | jim8     |
| NULL | jim9     |
| NULL | 3jim     |
| NULL |          |
|    0 | root     |
|    0 | NULL     |
|    1 | bin      |
|    2 | daemon   |
......

*降序排列

mysql> select uid,username from usertab order by uid desc;
+------+----------+
| uid  | username |
+------+----------+
|  501 | www      |
|  500 | mysql    |
|  499 | saslauth |
|   99 | nobody   |
|    4 | lp       |
......

7.分组 1.格式:

select shell from usertab group by 字段名;

2.例子:

mysql> select  shell from usertab group by shell;
+----------------+
| shell          |
+----------------+
| NULL           |
| /bin/bash      |
| /bin/sync      |
| /sbin/halt     |
| /sbin/nologin  |
| /sbin/shutdown |
| NULL           |
+----------------+
7 rows in set (0.00 sec)

3.处理分组后的结果 1.1格式:

select shell from usertab group by 字段名 having 条件表达式

例子: 查询usertab表中的shell字段并分组,然后查找出uid小于10的

mysql> select  shell from usertab group by shell having "uid"<10;
+----------------+
| shell          |
+----------------+
| NULL           |
| /bin/bash      |
| /bin/sync      |
| /sbin/halt     |
| /sbin/nologin  |
| /sbin/shutdown |
| NULL           |
+----------------+
7 rows in set, 1 warning (0.00 sec)

8.限制显示记录的条目数

limit限制显示记录的条目数

1.1格式:

limit N;  
# N表示从查询结果的第几条记录开始显示,默认从查询结果的第一条记录开始显示,第一条记录的编号是0
# M 表示显示条目的记录数
limit N,M;   

例子:

显示查询结果的前10条记录

mysql> select id,username,uid from usertab limit 10;
mysql> select id,username,uid from usertab limit 0,10;
+----+----------+------+
| id | username | uid  |
+----+----------+------+
|  1 | root     |    0 |
|  2 | bin      |    1 |
|  3 | daemon   |    2 |
|  4 | adm      |    3 |
|  5 | lp       |    4 |
|  6 | sync     |    5 |
|  7 | shutdown |    6 |
|  8 | halt     |    7 |
|  9 | mail     |    8 |
| 10 | uucp     |   10 |
+----+----------+------+
10 rows in set (0.00 sec)

从第三行显示三行

mysql> select id,username,uid from usertab limit 3,3;
+----+----------+------+
| id | username | uid  |
+----+----------+------+
|  4 | adm      |    3 |
|  5 | lp       |    4 |
|  6 | sync     |    5 |
+----+----------+------+
3 rows in set (0.00 sec)

9.嵌套查询 里层查询结果做为外层查询条件

格式/例子: 从usertab表查找uid小于uid列平均值的记录

mysql> select username,uid from usertab where uid < (select avg(uid) from usertab);
+----------+------+
| username | uid  |
+----------+------+
| root     |    0 |
| bin      |    1 |
| daemon   |    2 |
| adm      |    3 |
| lp       |    4 |
| sync     |    5 |
| shutdown |    6 |
| halt     |    7 |
| mail     |    8 |
| uucp     |   10 |
| operator |   11 |
| games    |   12 |
.....

pymysql的使用

Python中使用MySQL导入方法: import pymysql

1.建立连接

Connection:创建了Python客户端与数据库之间的网络通路。他的参数如下

​ [外链图片转存失败(img-1oVNVDrA-1568182359215)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1566371015750.png)]

2,Connection支持的方法:

[外链图片转存失败(img-79bcigC8-1568182359216)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1566371071401.png)]

3.获取Cursor.

Cursor: 游标对象,用于执行查询和获取结果,它支持的方法如下:

[外链图片转存失败(img-d1jRrcLq-1568182359218)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1566371082440.png)]

下面我们在Python3.7.1中创建一个实例:

import pymysql   conn=pymysql.connect(host='127.0.0.1',port=3306,user='root',passwd='*****',db='db_school',charset='utf8')    
# 创建游标    
cur=conn.cursor()   
# 执行SQL,并返回收影响行数    
effect_row = cur.execute("select * from student")   print(cur.fetchone())    # 执行SQL,并返回受影响行数    
effect_row = cur.execute("update student set Sname='小二' where Sno = '001'")    
print(effect_row)    
# 执行SQL,并返回受影响行数,执行多次   
# effect_row = cur.executemany("insert into student(Sno,Sname) values(%s,%s)", [('006',"老王"),('007','小五')])   
# print(effect_row)   
#提交,不然无法保存新建或者修改的数据
conn.commit()    
# 关闭游标    
cur.close()
# 关闭连接
conn.close()

参考连接: https://blog.csdn.net/sunfengye/article/details/82761105

django中使用mysql

DATABASES ={
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'student',  #注意了,这个数据库名django不能创建,你自己需要先创建数据库
        'USER': 'root',
        'PASSWORD': 'root',
        'HOST': '127.0.0.1',
        'PORT': '3306',
    }
}

mysql表关系

https://www.cnblogs.com/bypp/p/7755307.html

创建Mysql表:User用户表,Order订单表,Orderdetail订单详情,item商品表

一个用户对应多个订单,一个订单只能对应一个用户;一个订单对应多个订单详情,一个订单详情只对应一个订单;一个订单详情只对应一个商品,一个商品可以包括在多个订单详情中;所以,用户和商品之间是多对多关系

CREATE TABLE user (
  id bigint(32) NOT NULL AUTO_INCREMENT COMMENT '客户id(主键)',
  username varchar(32) NOT NULL COMMENT '客户名称',
  birthday date DEFAULT NULL COMMENT '客户生日',
  sex char(1) DEFAULT NULL COMMENT '客户性别',
  address varchar(256) DEFAULT NULL COMMENT '客户地址',
  PRIMARY KEY (id)
) 
CREATE TABLE orders (
  id bigint(32) NOT NULL AUTO_INCREMENT COMMENT '客户id(主键)',
  user_id bigint(32) NOT NULL COMMENT '下单客户id(外键)',
  number varchar(32) NOT NULL COMMENT '订单号',
  createtime datetime NOT NULL COMMENT '创建时间',
  note varchar(32) DEFAULT NULL COMMENT '备注',
  PRIMARY KEY (id),
  KEY FK_user (user_id),
  CONSTRAINT FK_user FOREIGN KEY (user_id) REFERENCES user (id)
) 
CREATE TABLE orderdetail (
  id bigint(32) NOT NULL AUTO_INCREMENT COMMENT 'id(主键)',
  order_id bigint(32) NOT NULL COMMENT '订单id',
  item_id bigint(32) NOT NULL COMMENT '商品id',
  item_num bigint(32) DEFAULT NULL COMMENT '商品购买数量',
  PRIMARY KEY (id),
  KEY order_id (order_id),
  KEY orderdetail_ibfk_2_idx (item_id),
  CONSTRAINT orderdetail_ibfk_1 FOREIGN KEY (order_id) REFERENCES orders (id),
  CONSTRAINT orderdetail_ibfk_2 FOREIGN KEY (item_id) REFERENCES item (id)
) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8
CREATE TABLE item (
  id bigint(32) NOT NULL AUTO_INCREMENT COMMENT 'id(主键)',
  name varchar(32) NOT NULL COMMENT '商品名称',
  price float(10,1) NOT NULL COMMENT '商品价格',
  detail text COMMENT '商品描述',
  pic varchar(512) DEFAULT NULL COMMENT '商品图片',
  createtime datetime DEFAULT NULL COMMENT '生产日期',
  PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8

一对一

一张表的一条记录一定只能与另外一张表的一条记录进行对应,反之亦然。

1)表结构设计(建物理表)

方法1:分开两个独立的表
create table wife(
id int primary key,
name varchar(10),
sex char(1) );

create table husband(
id int primary key,
name varchar(10),
sex char(1),
wid int unique,
constraint foreign key(wid) references wife(id) );

注意: 通过constraint约束体现一对一

连接: https://www.cnblogs.com/cangqinglang/p/10036680.html

复习与加深,什么是约束条件:

连接: https://blog.csdn.net/w_linux/article/details/79655073

方法2:合并在一个独立表
create table person(
id int primary key,
name varchar(10),
sex char(1),
wife int,
husband int );
insert into person values(1,‘小花’,‘0’, 0,3);
insert into person values(2,‘玉芬’,‘0’, 0,4);
insert into person values(3,‘张三’,‘1’, 1,0);
insert into person values(4,‘李四’,‘1’, 2,0);
insert into person values(5,‘王五’,‘0’, 0,0);
insert into person values(6,‘张五’,‘2’, 0,0);

语法:case when then end

连接: https://www.cnblogs.com/anche/p/9038802.html

select name, (case sex when ‘0’ then ‘女’
when ‘1’ then ‘男’
else ‘未知’
end) as 性别, id from person;

通过分别建立视图来体现一对一的关系
create view women as select * from person where sex=‘0’;
create view men as select * from person where sex=‘1’;

查询夫妻信息
1)旧版本
select wife.name as 妻子, husband.name as 丈夫 from wife,husband
where wife.id= husband.id;
2)新版本(96):关联(效率更高)
select wife.name as 妻子, husband.name as 丈夫 from husband
INNER JOIN wife ON husband.id = wife.id;

一对多

表A中的一条记录可以与另一张表B中的任意数目的记录相关联,而表b中的某条记录最多与表A有一条相关

比如:订单和订单详情 一个订单对应多个订单详情,一个订单详情只对应一个订单;一个订单详情只对应一个商品,一个商品可以包括在多个订单详情中

# 先创建被关联的表dep                
create table dep(id primary key auto_increment,
                 dep_name char(10),
                 dep_comment char(60));
                 
# 后创建关联表emp              
create table emp(id int primary key auto_increment,
                 name char(15),
                 gender enum('male','femael')not null default 'male',
                 de_id int,
                 foreign key(dep_id),references dep(id));
                 
# 先向被关联的表dep中插入值
insert into dep(dep_name,dep_comment) values('教学组','给学生上课',
                                             '招生组','负责招生计划',
                                             '后勤组','维护教学设备'));
                                             
# 再向关联表emp中插入值
insert into emp(name,gender,de_id) values(('aaa','male',1),
                                          ('bbb','male',2),
                                          ('ccc','female',3),
                                          ('ddd','male',2)
                                            );

一对多查询语句:

连接: https://blog.csdn.net/hxy19971101/article/details/78032204

多对多

表A中的一个实体可以与表B中的任意数目(零个或多个)记录相关联,表B中的一个记录可以与表A中的任意数目(零个或多个)实体相关联

比如:用户和商品 书籍和出版商

表一:book

id book_name price
1 九阴真经 100
2 葵花宝典 200
3 吸星大法 300

表二:press

id press_name phone
1 人民出版社 123
2 青春文学 234
3 北京邮电出版社 345

一本书可以是多个出版社出版的,所以需要单独建一个关系表出来

id book_id p_id
1 1 1
2 1 3
3 2 1
# 创建表1
create table book(id int primary key auto_increment,
                  book_name char(15),
                  price int(5));
# 创建表2
create table press(id int primary key auto_increment,
                   press_name char(20),
                   phone int(11));                 
# 创建关系表
create table b_p(id int primary key auto_increment,
                 book_id int(3),
                 p_id int(3),
                foreign key(book_id) references book(id) on update cascade on delete cascade,
                foreign key(p_id) references press(id) on update cascade on delete cascade);

# 插入值
insert into book values(1,'九阴真经',100),(2,'九阳神功',200),(3,'吸星大法',300);

insert into press(press_name) values('人民出版社'),('青春文学'),('北京邮电出版社');

insert into b_p(book_id,p_id) values(1,1),(1,3),(2,1);

表关系外键约束: https://www.cnblogs.com/yy20141204bb/p/8405000.html

修改表和复制表

# 修改表名
    alter table 表名 rename 新表名;
    
    
# 增加新字段
    alter table 表名 add 字段名 数据类型[约束条件];
    

# 删除字段
    alter table 表名 drop 字段名
    
    
# 修改字段
    alter table 表名 modify 字段名 数据类型[约束条件];
    
    alter table 表名 change 旧字段名 新字段名 旧数据类型[约束条件];
    
    alter table 表名 change 旧字段名 新字段名 新数据类型[约束条件];
    
    
# 复制表
    create table book_copy select * from book;
    

单表查询

select id,name from emp
    where id >1 and name like'%on%'
    group by dep_id
    having 分组后的过滤条件
    order by 排序依据
    limit n;
group by & 聚合函数
# 设置sql_mode 为 only_full_group_by

select 字段1 from 表名 group by 字段1     # 注意前后两个字段名要相同

# 每个部门员工的最高工资
select post,max(salary) from emp group by post;

select post,min(salary) from emp group by post;

select post,avg(salary) from emp group by post;

select post,sum(salary) from emp group by post;

select post,count(gender) from emp group by post;

select post,avg(salary) from emp where age>=30 group by post;

group_concat & 拼接字符串
select post,group_concat(name) from emp group by post;

select post,group_concat(name,'sb')from emp group by post;

select post,group_concat(name,":",salary)from emp group by post;

concat & as
select concate('姓名',name) from emp ;

select name,salary*12 as annual_salary from emp;

select concate('姓名',name) as 姓名  from emp;

having
# 1. having 的语法给是与where一模一样,但是having是在group by之后进行一步过滤
# 2. where不能用聚合函数,但是having可以用聚合函数

# 统计个部门年龄在30岁以上的员工的平均工资,并且保留平均工资大于10000的部门
select post,avg(salary) from emp
                        where age>=30
                        group by post
                        having avg(salary)>10000;
            
# 强调: having必须在group by后用

distinct
# 去重,执行顺序在having之后
select distinct post,avg(salary) from emp
        where age>=30
        group by post
        having avg(salary)>10000;

order by
select * from emp order by salary;      # 默认升序(asc)排

select * from emp order by salary desc; # 降序排

select * from emp order by age desc,salary asc; # 多个排序标准,

# 统计个部门年龄大于10岁,平均工资大于1000,且升序排列
select distinct post,avg(salary)from emp where age >10 
            group by post
            having avg(salary) > 1000
            order by post;

limit
# 限制显示条数

select * from emp limit 3;

# 选择工资前三的员工信息
select * from emp order by salary desc limit 3;

# 分页显示
select * from emp limit 5,5;

正则匹配
select * from emp where name regexp '^jin.*(n|g)$';

# $表示结束
# regexp关键字

多表连接查询

建表
create table department(id int,name varchar(20));

create table employee(id int primary key auto_increment,
                      name varchar(20),sex enum('male','female')not null default 'male',age intm dep_id int);

笛卡尔积查询
select * from emp,dep where emp.dep_id = dep.id

内连接
select * from emp inner join dep on emp.dep_id = dep.id;

左连接
select * from emp left join dep on emp.dep_id = dep.id;
右连接
select * from right join dep on emp.dep_id = dep.id;
全连接
select * from emp left join dep on emp.dep_id = dep.id
union
select * from right join dep on emp.dep_id = dep.id;
子查询
select * from emp inner join dep on demp.dep_id = dep.id
select name from emp where dep_id = (select id from dep where name = '技术');

标签:username,name,Python,MySQL,pymsql,mysql,NULL,id,select
来源: https://blog.csdn.net/weixin_45414731/article/details/100735216

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有