MySQL

MySQL入门

 

MySQL数据库简称MySQL,是一款由瑞典MySQL AB公司开发并且应用广泛的数据管理系统,MySQL数据库因其体积小、速度快、总体拥有成本低受到很多的热捧。现在,MySQL的所有者世界上最著名的数据库企业——Oracle所有。

 

MySQL的应用,在国内的企业包括:百度、阿里、腾讯、新浪、搜狐、网易等等企业,全部都在使用MySQL数据库。

 

MySQL是一种开放源代码的关系型数据库管理系统(RDBMS),MySQL数据库系统使用最常用的数据库管理语言--结构化查询语言(SQL)进行数据库管理。

 

由于MySQL是开放源代码的,因此任何人都可以在GPL的许可下下载并根据个性化的需要对其进行修改。MySQL因为其速度、可靠性和适应性而备受关注。大多数人都认为在不需要事务化处理的情况下,MySQL是管理内容最好的选择。

 

PHP与很多数据库结合都很紧密。由于,PHP和MySQL都是开源免费的。所以PHP一直对于MySQL等数据库都有很好的支持。

数据库的五个基本单位

数据库服务器:是指用来运行数据库服务的一台电脑。在中小型企业通常为一台。在数据存储量计算量很大的时候可以存在多台。多台数据库服务器共同来存储或计算。由于数据安全非常重要,我们经常会对数据库服务器里面的数据进经备份。

数据库:一个数据库服务器里面有可以有多个数据库。主要用来分类使用。我们可以建立交通信息数据库、游戏数据库、酒店开房数据库... ... 主要用来将各个不同用途的数据,按照业务进行大块的划分。

数据表:例如在游戏数据库中。根据这一款游戏又分为了不同的数据表。专门用来区分游戏不同的数据。例如:用户数据(用户、密码);人物数据;所有装备和装备信息;用户的充值信息;药品、魔力药水信息... ...等

数据字段:也叫数据列。就是我们日常所见表格里面的列。在表格中,我们会将一张用户表分成多个列。如下(表一)所示:用户编号、用户名、性别、年龄是字段。在真正的数据库中数据字段需要换成英文需要写成:id、username、sex、年龄。

数据行:真正的数据存在每一个表的行里面。字段(列)划分出来了一个表应该按照什么样的格式存数据。而行,是真正的数据。每一行需要遵循数据字段(列)的规范和要求进行存入数据。

Mysql连接数据库

 

如果加入到了windows的环境变量中,可以在命令行下直接操作。

 

在命令行下,通过以下命可以连接到数据库服务器:

 

mysql -h localhost -u root -p

 

上面的命令中: mysql 表示 mysql数据库启动工具。

 

参数说明:

 

参数

说明

-h

表示数据库连接地址,连接本机可不填

-u

表示要登录的用户

-p

表示使用密码登录

 

 

 

注:通常我们不直接输入密码。而是在回车之后,输入密码。因为,密码输入时的字符是不可见的,输完密码直接回车登录。防止旁边有人把重要的密码看走。如果没有什么别的问题,登陆成功之后会出现下面内容:

 

mysql -u root -p

 

 Enter password:

 

 Welcome to the MySQL monitor.  Commands end with ; or \g.

 

 Your MySQL connection id is 7

 

 Server version: 5.6.25 MySQL Community Server (GPL)

 

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

 

Oracle is a registered trademark of Oracle Corporation and/or its

 

 affiliates. Other names may be trademarks of their respective

 

 owners.

 

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

 

mysql>

 

上面的中文意思翻译过来是说,欢迎使用MySQL的命令行操作工具。每一个命令结束可以输入\g 或者 ;

 

mysql当前是第 7次连接。

 

当前数据库的版本是5.6.25社区支持版。遵循GPL协议。

 

版权所有:2000至 2015。归Oracle及其子机构拥有所有权。

 

如果需要帮助的话,通过 ‘help;’ 或者 ‘\h’ 命令来显示帮助内容,通过 ‘\c’ 命令来清除命令行历史。

 

mysql>

 

mysql > 表示等待输入指令。

 

 

 

注:

 

在登陆成功后有这么一句提示,可能大家不太理解:

 

Your MySQL connection id is 7

 

表示第7次连接登陆,每登陆一次这个id为加1。下一次显示的会是第8次。

 Mysql数据库操作

一、创建数据库

类别

详细解示

基本语法

CREATE DATABASE 数据库名;

示例

CREATE DATABASE PHP;

示例说明 创建一个数库,数据库的名字为PHP

示例:

mysql> CREATE DATABASE PHP;

 Query OK, 1 row affected (0.00 sec)

“Query OK” 表示上面的命令执行成功,所有的 DDL 和 DML(不包 括 SELECT)操作执行成功后都显示“Query OK”,这里理解为执行成功就可以了;“1 row affected” 表示操作只影响了数据库中一行的记录,“0.00 sec”则记录了操作执行的时间。

 

二、查看数据库

基本语法 show databases;

示例说明 显示当前服务器的所有数据库

注意:

show是指显示

database 是指数据库

databases 是数据库的复数形式,指全部数据库。

示例:

mysql> SHOW DATABASES;

 +--------------------+

 | Database           |

 +--------------------+

 | information_schema |

 | mysql              |

 | performance_schema |

 | user               |

 +--------------------+

 4 rows in set (0.00 sec)

三、选中数据库

基本语法 use 库名;

示例 use PHP

示例说明 使用数据库PHP

注意:

use 是指使用;

库名 是存在当前数据库系统中的具体的数据库的名称;

示例:

mysql> use PHP;

 Database changed

 

四、查看数据库中的表

进入到库后我们可以看这个库里面有多少个数据表。

基本语法 show tables;

示例说明 显示当前数据库下所有的表

使用use 进入到某个数据库后可以使用show tables

示例,查看当前数据库的表:

mysql> show tables;

 +---------------------------+

 | Tables_in_mysql           |

 +---------------------------+

 | columns_priv              |

 | db                        |

 | event                     |

 | func                      |

 | general_log               |

 | help_category             |

 | help_keyword              |

 | help_relation             |

 | help_topic                |

 | innodb_index_stats        |

 | innodb_table_stats        |

 | ndb_binlog_index          |

 | plugin                    |

 | proc                      |

 | procs_priv                |

 | proxies_priv              |

 | servers                   |

 | slave_master_info         |

 | slave_relay_log_info      |

 | slave_worker_info         |

 | slow_log                  |

 | tables_priv               |

 | time_zone                 |

 | time_zone_leap_second     |

 | time_zone_name            |

 | time_zone_transition      |

 | time_zone_transition_type |

 | user                      |

 +---------------------------+

 28 rows in set (0.00 sec)

五、删除数据库

基本语法 DROP DATABASE 库名;

示例 DROP DATABASE  PHP;

示例说明 删除一个数库,数据库的名字为liwenkai

注意:

drop 是汉语可以翻译为指掉下来,不要了的意思

database 是指库

库名 是指要删掉的库的名称

示例:

mysql> DROP DATABASE  PHP;

 Query OK, 0 rows affected (0.01 sec)

【切记】注:数据库删除后,下面的所有数据都会全部删除,所以删除前一定要慎重并做好相应的备份。

  Mysql数据表操作

一、创建表

基本语法 CREATE TABLE表名(字段名1 字段类型,....字段名n 字段类型n);

示例 CREATE TABLE user(username varchar(20),password varchar(32));

示例说明 创建一个表名叫user的表,第一个字段为username、表的字段类型为varchar长度为32个长度。第二个字段为password,类型也为varchar,长度也为32个长度。

注释:

int,代表整型。float,代表浮点。char和varchar代表字符串即可。

其他示例:

mysql> CREATE TABLE emp( 
 ename varchar(10), 
 hiredate date, 
 sal float(10,2), 
 deptno int(2) 
 );
 Query OK, 0 rows affected (0.63 sec)

 

二、查看表字段结构信息

基本语法 desc 表名;

示例 desc emp

示例说明 查看emp表的表结构

mysql>DESC emp;

 +----------+---------------+------+-----+---------+-------+

 | Field | Type | Null | Key | Default | Extra |

 +----------+---------------+------+-----+---------+-------+

 | ename | varchar(10) | YES | | NULL | |

 | hiredate | date | YES | | NULL | |

 | sal | decimal(10,2) | YES | | NULL | |

 | deptno | int(2) | YES | | NULL | |

 +----------+---------------+------+-----+---------+-------+

 4 rows in set (0.39 sec)

 

三、查看表创建语句

类别    详细解示

基本语法   SHOW CREATE TABLE表名 \G;

示例    SHOW CREATE TABLE emp \G;

示例说明    查看表emp的创建语句

 

执行完整示例:

mysql> SHOW CREATE TABLE emp \G;

 Table: emp

 CREATE TABLE: CREATE TABLE emp (

 ename varchar(10) DEFAULT NULL,

 hiredate date DEFAULT NULL,

 sal decimal(10,2) DEFAULT NULL,

 deptno int(2) DEFAULT NULL

 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 1 row in set (0.00 sec)

 ERROR:

 No query specified

上面表的创建 SQL 语句中,除了可以看到表定义以外,还可以看到表的 engine(存储引擎) 和 charset(字符集)等信息。“\G”选项的含义是使得记录能够按照字段竖着排列,对于内 容比较长的记录更易于显示。

 

四、删除表

 

基本语法 DROP TABLE 表名;

示例 DROP TABLE emp;

示例说明 删除表emp

mysql> DROP TABLE emp;

 Query OK, 0 rows affected (0.34 sec)

注:删除表。表和数据均会丢失,请勿必删除重要表之前备份数据。

 

五、指定表引擎和字符集

在创建表最后,我们常用MyISAM或者InnoDB引擎。在指定引擎时,我们可以使用:

ENGINE=InnoDB

指定表默认字符集:

DEFAULT CHARSET=utf8

 

效果如下:

CREATE TABLE emp (

     useraname varchar(10) DEFAULT NULL,

     password date DEFAULT NULL,

 )ENGINE=InnoDB DEFAULT CHARSET=utf8;

 

 Mysql数据字段操作

一、查看表结构

mysql> desc user;

 +----------+---------------+------+-----+---------+-------+

 | Field    | Type          | Null | Key | Default | Extra |

 +----------+---------------+------+-----+---------+-------+

 | username   | varchar(10)   | YES  |     | NULL    |     |

 | password   | varchar(32)   | YES  |     | NULL    |     |

 | createtime | int(10)       | YES  |     | NULL    |     |

 | createip   | int(10)       | YES  |     | NULL    |     |

 +----------+---------------+------+-----+---------+-------+

 4 rows in set (0.01 sec)

 

二、修改表字段类型 modify

基本语法 alter table 表名 modify 字段名 varchar(20);

示例 alter table user modify username varchar(20);

示例说明 将user表的username的类型改为varchar(20)

我们执行一下,看看结果:

 

mysql> alter table user modify username varchar(20);

 Query OK, 0 rows affected (0.48 sec)

 Records: 0  Duplicates: 0  Warnings: 0

 

mysql> desc user;

 +----------+---------------+------+-----+---------+-------+

 | Field    | Type          | Null | Key | Default | Extra |

 +----------+---------------+------+-----+---------+-------+

 | username   | varchar(20)   | YES  |     | NULL    |     |

 | password   | varchar(32)   | YES  |     | NULL    |     |

 | createtime | int(10)       | YES  |     | NULL    |     |

 | createip   | int(10)       | YES  |     | NULL    |     |

 +----------+---------------+------+-----+---------+-------+

 4 rows in set (0.01 sec)

 

三、增加表字段

基本语法 alter table 表名 add column 字段名 类型;

示例 alter table user add column age int(3);

示例说明 添加一个字段为age,类型为整型长度为3

mysql> alter table emp add column age int(3);

 Query OK, 0 rows affected (0.40 sec)

 Records: 0  Duplicates: 0  Warnings: 0

 

mysql> desc user;

 +----------+---------------+------+-----+---------+-------+

 | Field    | Type          | Null | Key | Default | Extra |

 +----------+---------------+------+-----+---------+-------+

 | username   | varchar(20)   | YES  |     | NULL    |     |

 | password   | varchar(32)   | YES  |     | NULL    |     |

 | createtime | int(10)       | YES  |     | NULL    |     |

 | createip   | int(10)       | YES  |     | NULL    |     |

 | age        | int(3)        | YES  |     | NULL    |     |

 +----------+---------------+------+-----+---------+-------+

 5 rows in set (0.00 sec)

三、增加字段时控制字段顺序

我们刚刚学了增加字段。如果你仔细实验发现每次都是增加在最后面,如何在第一个增加或者在指字字段之后增加呢?

基本语法 ALTER TABLE 表名 ADD 字段名 字段类型 AFTER 字段名;

示例 ALTER TABLE user ADD email VARCHAR(60) AFTER createip;

示例说明 user表中,在createip后增加一个字段为email,类型为varchar,长度为60

ALTER TABLE user ADD email VARCHAR(60) AFTER createip; 
 Query OK, 0 rows affected (0.40 sec)
 Records: 0  Duplicates: 0  Warnings: 0

mysql> desc user;

 +----------+---------------+------+-----+---------+-------+

 | Field    | Type          | Null | Key | Default | Extra |

 +----------+---------------+------+-----+---------+-------+

 | username   | varchar(20)   | YES  |     | NULL    |     |

 | password   | varchar(32)   | YES  |     | NULL    |     |

 | createtime | int(10)       | YES  |     | NULL    |     |

 | createip   | int(10)       | YES  |     | NULL    |     |

 | email      | varchar(60)   | YES  |     | NULL    |     |

 | age        | int(3)        | YES  |     | NULL    |     |

 +----------+---------------+------+-----+---------+-------+

 6 rows in set (0.00 sec)

示例 ALTER TABLE user ADD id INT(10) FIRST;

示例说明 user表中在最开始的位置增加一个字段为id,类型为int,长度为10

四、删除表字段

基本语法 alter table 表名 drop column 字段名;

示例 alter table user drop column age;

示例说明 在user表中删除字段age

mysql> alter table user drop column age;

 Query OK, 0 rows affected (0.27 sec)

 Records: 0  Duplicates: 0  Warnings: 0

 

mysql> desc user;

 +----------+---------------+------+-----+---------+-------+

 | Field    | Type          | Null | Key | Default | Extra |

 +----------+---------------+------+-----+---------+-------+

 | username   | varchar(20)   | YES  |     | NULL    |     |

 | password   | varchar(32)   | YES  |     | NULL    |     |

 | createtime | int(10)       | YES  |     | NULL    |     |

 | createip   | int(10)       | YES  |     | NULL    |     |

 | email      | varchar(60)   | YES  |     | NULL    |     |

 +----------+---------------+------+-----+---------+-------+

 5 rows in set (0.00 sec)

五、表字段改名

基本语法 alter table 表名 change 字段原名 字段新名 字段类型;

示例 alter table user change email em varchar(60);

示例说明 在user表中将字段中的email字段名字为em

详细示例:

 

mysql> alter table user change email em varchar(60);

Query OK, 0 rows affected (0.38 sec)

Records: 0  Duplicates: 0  Warnings: 0

 

mysql> desc user;

 +----------+---------------+------+-----+---------+-------+

 | Field    | Type          | Null | Key | Default | Extra |

 +----------+---------------+------+-----+---------+-------+

 | username   | varchar(20)   | YES  |     | NULL    |     |

 | password   | varchar(32)   | YES  |     | NULL    |     |

 | createtime | int(10)       | YES  |     | NULL    |     |

 | createip   | int(10)       | YES  |     | NULL    |     |

 | em         | varchar(60)   | YES  |     | NULL    |     |

 +----------+---------------+------+-----+---------+-------+

 5 rows in set (0.00 sec)

 

六、修改表字段排列顺序

在前的字段增加和修改语句(add/change/modify)中,最后都可以加一个可选项 first|after。

增加表字段时我们已经学过了如何调整顺序。我们现在在来看看另外的change或modify如何来调整顺序。

我们用first做个小实验。

 

使用modify调整顺序

mysql> alter table user modify em varchar(60) first;

 Query OK, 0 rows affected (0.41 sec)

 Records: 0  Duplicates: 0  Warnings: 0

 

mysql> desc user;

 +----------+---------------+------+-----+---------+-------+

 | Field    | Type          | Null | Key | Default | Extra |

 +----------+---------------+------+-----+---------+-------+

 | em         | varchar(60)   | YES  |     | NULL    |     |

 | username   | varchar(20)   | YES  |     | NULL    |     |

 | password   | varchar(32)   | YES  |     | NULL    |     |

 | createtime | int(10)       | YES  |     | NULL    |     |

 | createip   | int(10)       | YES  |     | NULL    |     |

 +----------+---------------+------+-----+---------+-------+

 5 rows in set (0.00 sec)

 

七、修改表名

类别 详细解示

基本语法 alter table 旧表名 rename 新的表名;

示例 alter table user rename new_user;

示例说明 将user表名改为new_user

mysql> alter table user rename new_user;

 Query OK, 0 rows affected (0.35 sec)

 

mysql> desc new_user;

 +----------+---------------+------+-----+---------+-------+

 | Field    | Type          | Null | Key | Default | Extra |

 +----------+---------------+------+-----+---------+-------+

 | em         | varchar(60)   | YES  |     | NULL    |     |

 | username   | varchar(20)   | YES  |     | NULL    |     |

 | password   | varchar(32)   | YES  |     | NULL    |     |

 | createtime | int(10)       | YES  |     | NULL    |     |

 | createip   | int(10)       | YES  |     | NULL    |     |

 +----------+---------------+------+-----+---------+-------+

 5 rows in set (0.00 sec)

 Mysql数据类型

 

MySQL中存的是数据。只要是数据,我们就会规定数据的类型。在表的字段中规定了使用的是某个数据类型。那么,在插入的数据中就要使用对应的数据类型。并且,遵守数据类型的长度要求。

 

整型

 

MySQL数据类型

所占字节

值范围

tinyint

1字节

-128~127

smallint

2字节

-32768~32767

mediumint

3字节

-8388608~8388607

int

4字节

范围-2147483648~2147483647

bigint

8字节

+-9.22*10的18次方

 

整型的长度不同,在实际使用过程也就不同。

 

 

 

浮点类型

 

MySQL数据类型

所占字节

值范围

float(m, d)

4字节

单精度浮点型,m总个数,d小数位

double(m, d)

8字节

双精度浮点型,m总个数,d小数位

decimal(m, d)

 

decimal是存储为字符串的浮点数

 

 

 

字符类型

 

MySQL数据类型

所占字节

值范围

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字节

中等长度文本数据

LOGNGBLOB

0-4 294 967 295字节

二进制形式的极大文本数据

LONGTEXT

0-4 294 967 295字节

极大文本数据

VARBINARY(M)

允许长度0-M个字节的定长字节符串

值的长度+1个字节

BINARY(M)

M

允许长度0-M个字节的定长字节符串

 

 

 

时间类型

 

MySQL数据类型

所占字节

值范围

date

3字节

日期,格式:2014-09-18

time

3字节

时间,格式:08:42:30

datetime

8字节

日期时间,格式:2014-09-18 08:42:30

timestamp

4字节

自动存储记录修改的时间

year

1字节

年份

 

 

 

复合类型

 

MySQL数据类型

说明

举例

set

集合类型

set(“member”, “member2″, … “member64″)

enum

枚举类型

enum(“member1″, “member2″, … “member65535″)

 

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

 

 

 

  Mysql字符集

 

英文字符集:

 

字符集

说明

字节长度

ASCII

美国标准信息交换代码

单字节

GBK

汉字内码扩展规范

双字节

unicode

万国码

4字节

UTF-8

Unicode的可变长度字符编码

1到6个字节

 

 

 

ASCII

 

ASCII 码使用指定的7 位或8 位二进制数组合来表示128 或256 种可能的字符。标准ASCII 码也叫基础ASCII码,使用7 位二进制数来表示所有的大写和小写字母,数字0 到9、标点符号, 以及在美式英语中使用的特殊控制字符。

 

其中:

 

0~31及127(共33个)是控制字符或通信专用字符(其余为可显示字符),如控制符:LF(换行)、CR(回车)、FF(换页)、DEL(删除)、BS(退格)、BEL(响铃)等;通信专用字符:SOH(文头)、EOT(文尾)、ACK(确认)等;ASCII值为8、9、10 和13 分别转换为退格、制表、换行和回车字符。它们并没有特定的图形显示,但会依不同的应用程序,而对文本显示有不同的影响。

 

32~126(共95个)是字符(32是空格),其中48~57为0到9十个阿拉伯数字。

 

65~90为26个大写英文字母,97~122号为26个小写英文字母,其余为一些标点符号、运算符号等。

 

 

 

GBK

 

GBK 向下与 GB 2312 编码兼容。是中华人民共和国定义的汉字计算机编码规范。早期版本为GB2312。

 

 

 

Unicode

 

Unicode(统一码、万国码、单一码)Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。以满足跨语言、跨平台进行文本转换、处理的要求。

 

 

 

UTF-8

 

是一种针对Unicode的可变长度字符编码,也是万国码。因为UNICODE比ASCII占用大一倍的空间,而对ASCII来说高字节的0对他毫无用处。为了解决这个问题,就出现了一些中间格式的字符集,他们被称为通用转换格式,即UTF(Universal Transformation Format)

 

 

 

实际工作中要使用的编码

 

gbk_chinese_ci 简体中文, 不区分大小写

 

utf8_general_ci Unicode (多语言), 不区分大小写

 

注意:

 

 mysql在写utf-8的时候写的是utf8。不加中间的中横线。

 

 Mysql索引

 

假如你用新华字典来查找“张”这个汉字,不使用目录的话,你可能要从新华字典的第一页找到最后一页,可能要花二个小时。字典越厚呢,你花的时间就越多。现在你使用目录来查找“张”这个汉字,张的首字母是z,z开头的汉字从900多页开始,有了这条线索,你查找一个汉字可能只要一分钟,由此可见索引的重要性。

 

索引用于快速找出在某个列中有一特定值的行

 

当然索引也不易过多,索引越多写入,修改的速度越慢。因为,写入修改数据时,也要修改索引。

 

 

 

一、MySQL的索引类型

 

普通索引:最基本的索引,它没有任何限制

 

唯一索引:某一行启用了唯一索引则不准许这一列的行数据中有重复的值。针对这一列的每一行数据都要求是唯一的

 

主键索引:它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引,常用于用户ID。类似于书中的页码

 

全文索引:对于需要全局搜索的数据,进行全文索引

 

 

 

普通索引

 

基本语法 alter table 表  add index(字段)

 

示例 ALTER TABLE money ADD INDEX(username);

 

示例解释 为money表的username字段增加索引

 

 

 

唯一索引

 

类型 详细说明

 

基本语法 alter table 表  add UNIQUE(字段)

 

示例 ALTER TABLE money ADD UNIQUE(email);

 

示例解释 为money表的email字段增加唯一索引

 

 

 

全文索引

 

类型 详细说明

 

基本语法 alter table 表  add FULLTEXT(字段)

 

示例 ALTER TABLE money ADD FULLTEXT(content);

 

示例解释 为money表的content字段增加唯一索引

 

 

 

主键索引

 

类型 详细说明

 

基本语法 alter table 表  add PRIMARY KEY(字段)

 

示例 ALTER TABLE money ADD PRIMARY KEY(id);

 

示例解释 为money表的id字段增加主键索引

 

创建表时也可以声明索引

 

创建表时可在创建表语句后加上对应的类型即可声明索引:

 

 

 

PRIMARY KEY(字段)

 

 INDEX [索引名] (字段)

 

 FULLTEXT [索引名] (字段)

 

 UNIQUE[索引名] (字段)

 

注:中括号中的索引名,代表可选。

 

 

 

整体示例如下:

 

CREATE TABLE test (
     id INT NOT NULL , 
     username VARCHAR(20) NOT NULL , 
     password INT NOT NULL , 
     content VARCHAR(20) , 
     PRIMARY KEY (id), 
     INDEX pw (password), 
     UNIQUE (username),
     FULLTEXT (content)
 ) ENGINE = InnoDB;

1.1.4.2 增删改查之插入记录

一、插入记录有两种个基本语法

插入基本语法一

基本语法 insert into 表 values(值1,值2,值n);

示例 INSERT INTO user values(2,'php中文网','男')

示例说明 向user表中插入值id为2,姓名为李文凯,性别为男

插入基本语法二

基本语法 insert into 表(字段1,字段2,字段n) values(值1,值2,值n);

示例 INSERT INTO user(id,username,sex) values(213,'小沈阳',1);

示例说明 向user表中插入id为213,username为小沈阳,性别为1

说明:

基本语法1和基本语法2的区别是:

基本语法1的插入语句,表中有多少个字段就必须要插入多少个值。一个不能多,一个也不能少。若有默认值,不想传,可以写上null。

基本语法2中,除非有必填字段必须要写入值外。如果有默认值的不想写可以忽略不写。mysql会自动补主默认值。

基本语法2中,以user(id,username,sex)字段顺序为值的顺序。

 

按照基本语法二写上表中的插入语句:

INSERT INTO user(username,sex) values('oldboy',10);

 

基本语法变形:一次插入多条记录

INSERT INTO user(username,password,sex)

 values('小明', 'abcdef', 1),

 ( 'angelababy', 'bcdeef', 0),

 ( '小赫', '123456', 1),

 ('小宝', '987654', 1);

二、基础查询

创建表的语句如下:

CREATE TABLE IF NOT EXISTS money (

   uid int(11) NOT NULL,

   username varchar(30) NOT NULL,

   password char(32) NOT NULL,

   age tinyint unsigned NOT NULL,

   sex tinyint not null

 ) ENGINE = InnoDB DEFAULT CHARSET=utf8;

基本语法 select * from 表;

示例 select * from money;

示例说明 查询money表中所有字段中的所有结果

注:”*” 是一种正则表达式的写法,表示匹配所有,上面的查询语句和下面的是等价:

 

mysql> select * from money;

+----+-----------+---------+-----------+-----+-----+
| id | username  | balance | province  | age | sex |
+----+-----------+---------+-----------+-----+-----+
|  1 | 小宝    |  120.02 | 湖北      |  29 |   1 |
|  2 | 小静    |  260.23 | 山东      |  40 |   0 |
|  3 |小明    |  150.86 | 山东      |  40 |   1 |
|  4 | 小然    |     810 | 辽宁      |  27 |   1 |
|  5 | 小冰    |   20.15 | 黑龙江    |  43 |   0 |
|  6 | 小龙      |     313 | 山东      |  63 |   1 |
|  7 |小幂      |     123 | 北京      |  30 |   0 |
|  8 | 小诗    |     456 | 北京      |  29 |   1 |
|  9 | 小岩      |    23.4 | 湖南      |  36 |   0 |
| 10 | 小山    |    3456 | 辽宁      |  63 |   1 |
| 11 |小峰      |   34.32 | 北京      |  44 |   1 |
| 12 | 小纲    |     212 | 天津      |  43 |   1 |
+----+-----------+---------+-----------+-----+-----+
12 rows in set (0.00 sec)

 

三、指定字段查询

基本语法 select 字段 from 表;

示例 select id,username, balance from money;

示例说明 查询money表中id,username, balance字段中的所有结果

mysql> select id,username, balance from money;

+----+-----------+---------+
| id | username  | balance |
+----+-----------+---------+
|  1 | 小宝    |  120.02 |
|  2 | 小冰    |  260.23 |
|  3 | 小明    |  150.86 |
|  4 | 小然    |     810 |
|  5 | 小冰    |   20.15 |
|  6 | 小龙      |     313 |
|  7 | 小幂      |     123 |
|  8 | 小诗    |     456 |
|  9 | 小岩      |    23.4 |
| 10 | 小山    |    3456 |
| 11 | 小峰      |   34.32 |
| 12 | 小纲    |     212 |
+----+-----------+---------+
12 rows in set (0.00 sec)

 

四、查询单个字段不重复记录 distinct

基本语法 select distinct 字段 from 表;

示例 select distinct age deptno from money;

示例说明 查询money表中年龄唯一的所有结果

mysql> select distinct age deptno from money;

+--------+

| deptno |

+--------+

|     29 |

|     40 |

|     27 |

|     43 |

|     63 |

|     30 |

|     36 |

|     44 |

+--------+

8 rows in set (0.00 sec)

 

五、条件查询 where

基本语法 select  字段 from 表 where where条件;

示例 select * from money where age = 29;

示例说明 查询money表中年龄为29的所有结果

mysql> select * from money where age = 29;

+----+-----------+---------+----------+-----+-----+

| id | username  | balance | province | age | sex |

+----+-----------+---------+----------+-----+-----+

|  1 | 小凯    |  120.02 | 湖北     |  29 |   1 |

|  8 | 小诗    |     456 | 北京     |  29 |   1 |

+----+-----------+---------+----------+-----+-----+

2 rows in set (0.00 sec)

 

六、where后可接的条件

比较运算符结果集中将符合条件的记录列出来。上面的例子中,where 后面的田间是一个字段的 ‘=’。

除此之外,还可以使用>、<、>=、<=、!=等比较运算符;

符号 说明

> 大于

< 小于

>= 大于等于

<= 小于等于

!= 不等于

= 等于

七、逻辑运算符

多个条件还可以使用 or 、 and 等逻辑运算符进行多条件联合查询

or 或者

and 并且

我们来看一下多个条件的例子:

示例 select * from money where id <10 and

说明 查询所有字段 要求id小于10 并且province='湖北'

mysql> select * from money where id <10 and province='湖北';

 +----+-----------+---------+----------+-----+-----+

 | id | username  | balance | province | age | sex |

 +----+-----------+---------+----------+-----+-----+

 |  1 | 小宝    |  120.02 | 湖北     |  29 |   1 |

 +----+-----------+---------+----------+-----+-----+

 1 row in set (0.00 sec)

 

八、结果集排序

基本语法 select 字段 from 表 order  by 字段 排序关键词

示例 select id,username, balance from money order by balance desc;

示例说明 查询money表中的id,username,balance字段,按照余额进行降序排序

排序用到的关键词:

asc 升序排列,从小到大(默认)

desc 降序排列,从大到小

在 select 出来之后的结果集中排序使用 order by ,其中 desc 和 asc 是排序顺序中的关键字。desc 表示按照字段进行降序排列,asc 表示升序排列,如果不写关键字默认升序排列。

 

mysql> select id,username, balance from money order by balance desc;

+----+-----------+---------+

| id | username  | balance |

+----+-----------+---------+

| 10 | 小山    |    3456 |

|  4 | 小然    |     810 |

|  8 | 小诗    |     456 |

|  6 | 小龙     |     313 |

|  2 | 小冰    |  260.23 |

| 12 | 小纲    |     212 |

|  3 | 小明    |  150.86 |

|  7 | 小幂     |     123 |

|  1 | 小宝     |  120.02 |

| 11 | 汪峰     |   34.32 |

|  9 | 小岩     |    23.4 |

|  5 | 小冰    |   20.15 |

+----+-----------+---------+

12 rows in set (0.00 sec)

九、结果集限制

对于查询或者排序后的结果集,如果希望只显示一部分而不是全部,使用 limit 关键字结果集数量限制。

基本语法 select 字段 from 表  limit 数量;

示例 select id,username, balance from money limit 5;

示例说明 显示前五个用户

mysql>  select * from money limit 5;

+----+-----------+---------+-----------+-----+-----+

| id | username  | balance | province  | age | sex |

+----+-----------+---------+-----------+-----+-----+

|  1 | 小宝    |  120.02 | 湖北      |  29 |   1 |

|  2 | 小冰    |  260.23 | 山东      |  40 |   0 |

|  3 | 小明    |  150.86 | 山东      |  40 |   1 |

|  4 | 小然    |     810 | 辽宁        |  27 |   1 |

|  5 | 小冰    |   20.15 | 黑龙江      |  43 |   0 |

+----+-----------+---------+-----------+-----+-----+

5 rows in set (0.00 sec)

 

十、限制结果集并排序

基本语法 select 字段 from 表 order by 字段 关键词 limit 数量

示例 select id,username, balance from money order by balance desc limit 5;

示例说明 按照钱来排序,显示前五个最有钱的用户

mysql> select id,username, balance from money order by balance desc limit 5;

+----+-----------+---------+

| id | username  | balance |

+----+-----------+---------+

| 10 | 小山    |    3456 |

|  4 | 小柏    |     810 |

|  8 | 小诗    |     456 |

|  6 | 小龙    |     313 |

|  2 | 小冰    |  260.23 |

+----+-----------+---------+

5 rows in set (0.00 sec)

 

十一、统计类函数使用

如果我们想知道总用户数怎么办?

查询谁是数据表里的首富怎么办?

如果我们想知道用户的平均金额怎么办?

如果我们想知道所有用户的总金额怎么办?

统计类函数最常用的我们有四个:

 

函数说明

sum 求和

count 统计总数

max 最大值

min 最小值

avg 平均值

注:当然你知道其他的mysql函数也可以使用。不过,在实际工作中,大公司的很多大中型项上很少使用,他们都有专门的计数服务器。因为,mysql的计算量本身很大,为了减少压力通常我们将实际的计算任务交给业务服务器或其他服务器来完成。

 

基本语法 select 函数(字段) from 表

示例 select count(id) from money

示例说明 查询money表的id总数

mysql> select count(id) from money;

 +-----------+

 | count(id) |

 +-----------+

 |        12 |

 +-----------+

 1 row in set (0.00 sec)

你还可以给字段取别名哟!使用as关键字。

 

mysql> select count(id) as zongshu from money;

 +---------+

 | zongshu |

 +---------+

 |      12 |

 +---------+

 1 row in set (0.00 sec)

 

查询平均金额

mysql> select avg(balance) from money;

 +--------------------+

 | avg(balance)       |

 +--------------------+

 | 498.24833393096924 |

 +--------------------+

 1 row in set (0.00 sec)

 

查询总金额

mysql> select sum(balance) from money;

 +-------------------+

 | sum(balance)      |

 +-------------------+

 | 5978.980007171631 |

 +-------------------+

 1 row in set (0.00 sec)

 

查询最大金额

mysql> select max(balance) from money;

 +--------------+

 | max(balance) |

 +--------------+

 |         3456 |

 +--------------+

 1 row in set (0.00 sec)

 

查询最小金额

mysql> select min(balance) from money;

 +--------------------+

 | min(balance)       |

 +--------------------+

 | 20.149999618530273 |

 +--------------------+

 1 row in set (0.00 sec)

 

十二、分组 group by

我们拿金额表里面的省份进行分组数据,分组数据后你会发现。有相同的省份会去掉。即,一个省份为一个组。

基本语法 select * from 表 group by 字段

示例 select * from money group by province;

示例说明 按照地区进行分组

mysql> select * from money group by province;

+----+-----------+---------+-----------+-----+-----+

| id | username  | balance | province  | age | sex |

+----+-----------+---------+-----------+-----+-----+

|  7 | 小杨      |     123 | 北京      |  30 |   0 |

| 12 | 小纲    |     212 | 天津      |  43 |   1 |

|  2 | 小冰    |  260.23 | 山东      |  40 |   0 |

|  1 | 小宝    |  120.02 | 湖北      |  29 |   1 |

|  9 | 小岩      |    23.4 | 湖南      |  36 |   0 |

|  4 | 小然    |     810 | 辽宁      |  27 |   1 |

|  5 | 小李    |   20.15 | 黑龙江    |  43 |   0 |

+----+-----------+---------+-----------+-----+-----+

 

统计分组(分类)各总数:

mysql> select deptno, count(1) from emp group by deptno;

+--------+----------+

| deptno | count(1) |

+--------+----------+

|      1 |        1 |

|      2 |        5 |

|      3 |        1 |

|      5 |        4 |

+--------+----------+

4 rows in set (0.04 sec)

 

统计省份数量后再进行分组显示

mysql> select count(province),province  from money group by province;

 +-----------------+-----------+

 | count(province) | province  |

 +-----------------+-----------+

 |               3 | 北京      |

 |               1 | 天津      |

 |               3 | 山东      |

 |               1 | 湖北      |

 |               1 | 湖南      |

 |               2 | 辽宁      |

 |               1 | 黑龙江    |

 +-----------------+-----------+

 7 rows in set (0.00 sec)

 

在分组基础上进行统计

with rollup用的很少。这个知识点设置为了解级别。

它的主要功能是对于分组的数据进行统计后,再进行一次总数统计。

类别 详细解示

基本语法 select * from 表 group by 字段 with rollup

示例 select count(province),province  from money group by province with rollup;

示例说明 对分组的数再次进行统计

在上面的基础上统计总数,下例结果中,最后多了一个12 NULL。

mysql> select count(province),province  from money group by province with rollup;

 +-----------------+-----------+

 | count(province) | province  |

 +-----------------+-----------+

 |               3 | 北京      |

 |               1 | 天津      |

 |               3 | 山东      |

 |               1 | 湖北      |

 |               1 | 湖南      |

 |               2 | 辽宁      |

 |               1 | 黑龙江    |

 |              12 | NULL      |

 +-----------------+-----------+

 8 rows in set (0.00 sec)

 

结果再过滤having

having子句与where有相似之处但也有区别,都是设定条件的语句。

having 是筛选组 而where是筛选记录。

类别 详细解示

基本语法 select * from 表 group by 字段 having 条件

示例 select count(province) as result ,province  from money group by province having result >2;

示例说明 对地区分组并统计总数,将分组结果中大于2的分组地区显示出来

mysql> select count(province) as result ,province  from money group by province having result >2;

 +--------+----------+

 | result | province |

 +--------+----------+

 |      3 | 北京     |

 |      3 | 山东     |

 +--------+----------+

 2 rows in set (0.00 sec)

 

整体使用SQL

我们现在将语句进行整合后,配合使用一次。整体的SQL语句配合使用的语法结构如下:

SELECT

     [字段1 [as 别名1],[函数(字段2) ,]......字段n]

 FROM 表名

 [WHERE where条件]

 [GROUP BY 字段]

 [HAVING where_contition]

 [order 条件]

 [limit 条件]

注:上面的语句中可以[] 代表可选。最终的语法总结如下:

关键词 说明

select 选择的列

from 表

where 查询的条件

group by 分组属性  having 分组过滤的条件

order by 排序属性

limit 起始记录位置,取记录的条数

我们进行一次整体的给合使用,查询money表字段:id,username,balance,province 要求id>1 余额大于50,使用地区进行分组。我们使用用户id进行降序,要求只准显示3条。最后将SQL语句写成,查询出来的结果如下:

 

mysql> select id,username,balance,province from money where id > 1 and balance > 50 group by province order by id desc limit 3;

 +----+-----------+---------+----------+

 | id | username  | balance | province |

 +----+-----------+---------+----------+

 | 12 | 小明    |     212 | 天津     |

 |  7 | 小红      |     123 | 北京     |

 |  4 | 小静    |     810 | 辽宁     |

 +----+-----------+---------+----------+

 3 rows in set (0.00 sec)

 

 

 

小

posted @ 2020-09-27 19:31  Y泽Q  阅读(88)  评论(0)    收藏  举报