数据库mysql的常规操作
Posted God_Li
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库mysql的常规操作相关的知识,希望对你有一定的参考价值。
1. 什么是数据库?
数据库(Database)是按照数据结构来组织、存储和管理数据的建立在计算机存储设备上的仓库。
简单来说是本身可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据进行新增、截取、更新、删除等操作。
严格来说,数据库是长期储存在计算机内、有组织的、可共享的数据集合。数据库中的数据指的是以一定的数据模型组织、描述和储存在一起、具有尽可能小的冗余度、较高的数据独立性和易扩展性的特点并可在一定范围内为多个用户共享。
2. 为什么需要使用数据库?
假设这样一个场景,需要存储一所学校所有学生的姓名,性别,出生日期和各科成绩,是用Word文档来存,还是使用Excel表格?相信一个正常人都会选择Excel表格;当然,使用Word文档也能实现这一需求;使用Word文档实现存储这一需求当然没有任何问题,但是如果某个学生来要查询自己的学生,或者需要修改某个学生的成绩,给这些学生按成绩排名等这些需求,如果需要再扩展一下存储内容,比如再存一下每个学生的联系方式,那使用Word就几乎不可能实现了。同样的,在程序中所需要存储的各种信息会比上面的场景更加复杂,使用一种有结构,有规律的数据存储方式就非常的有必要了。
3. 如何管理操作数据库?
我们可以使用一种叫做数据库管理系统(DBMS)的软件来操作数据库。
数据库管理系统(Database Management System)是一种操纵和管理数据库的大型软件,用于建立、使用和维护数据库,简称DBMS。它对数据库进行统一的管理和控制,以保证数据库的安全性和完整性。用户通过DBMS访问数据库中的数据,数据库管理员也通过dbms进行数据库的维护工作。它可使多个应用程序和用户用不同的方法在同时或不同时刻去建立,修改和询问数据库。大部分DBMS提供数据定义语言DDL(Data Definition Language)和数据操作语言DML(Data Manipulation Language),供用户定义数据库的模式结构与权限约束,实现对数据的追加、删除等操作。
常见的数据库管理系统有:Oracle数据库、DB2、mysql、Informix、SQL Server等。
4. 如何使用数据库管理系统(DBMS)?
一般我们使用SQL语言与DBMS交互来操作关系型数据库(一般日常使用的MySQL、SQL Server、Oracle数据库都是关系型数据库)。
SQL语言在这些数据库管理系统中基本通用。不能说完全通用是因为不同的数据库系统在其实践过程中都对SQL规范作了某些编改和扩充。(基本上能在一种数据库管理系统中熟练的使用SQL,迁移到其他系统其实很简单)
在本篇博客中,就详细介绍一下如何在mysql中使用SQL语言实现常规操作。
首先介绍一下mysql中的数据类型(可以先略过,用到时再来查看):
参考自(http://tool.oschina.net/apidocs/apidoc?api=mysql-5.1-zh)
MySQL有多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。
(1) 数值类型:
MySQL支持所有标准SQL数值数据类型。这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似数值数据类型(FLOAT、REAL和DOUBLE PRECISION)。关键字INT是INTEGER的同义词,关键字DEC是DECIMAL的同义词。
BIT数据类型保存位字段值,并且支持MyISAM、MEMORY、InnoDB和BDB表。
作为SQL标准的扩展,MySQL也支持整数类型TINYINT、MEDIUMINT和BIGINT。下面的表显示了需要的每个整数类型的存储和范围。
类型 | 大小 | 范围(有符号) | 范围(无符号) | 用途 |
---|---|---|---|---|
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的值 | 小数值 |
注:MySQL还支持选择在该类型关键字后面的括号内指定整数值的显示宽度(例如,INT(4))。该可选显示宽度规定用于显示宽度小于指定的列宽度的值时从左侧填满宽度。
(2)日期/时间类型:
表示时间值的DATE和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。每个时间类型有一个有效值范围和一个“零”值,当指定不合法的MySQL不能表示的值时使用“零”值。
类型 | 大小 (字节) | 范围 | 格式 | 用途 |
---|---|---|---|---|
DATE | 3 | 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 | 混合日期和时间值,时间戳 |
(3)字符串类型:
字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。
CHAR和VARCHAR类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。
CHAR和VARCHAR类型声明的长度表示你想要保存的最大字符数。例如,CHAR(30)可以占用30个字符。
CHAR列的长度固定为创建表时声明的长度。长度可以为从0到255的任何值。当保存CHAR值时,在它们的右边填充空格以达到指定的长度。当检索到CHAR值时,尾部的空格被删除掉。在存储或检索过程中不进行大小写转换。
VARCHAR列中的值为可变长字符串。长度可以指定为0到65,535之间的值。(VARCHAR的最大有效长度由最大行大小和使用的字符集确定。整体最大长度是65,532字节)。
同CHAR对比,VARCHAR值保存时只保存需要的字符数,另加一个字节来记录长度(如果列声明的长度超过255,则使用两个字节)。
类型 | 大小 | 用途 |
---|---|---|
CHAR | 0-255字节 | 定长字符串 |
VARCHAR | 0-65535 字节 | 变长字符串 |
TINYBLOB | 0-255字节 | 不超过 255 个字符的二进制字符串 |
TINYTEXT | 0-255字节 | 短文本字符串 |
BLOB | 0-65 535字节 | 二进制形式的长文本数据 |
TEXT | 0-65 535字节 | 长文本数据 |
MEDIUMBLOB | 0-16 777 215字节 | 二进制形式的中等长度文本数据 |
MEDIUMTEXT | 0-16 777 215字节 | 中等长度文本数据 |
LONGBLOB | 0-4 294 967 295字节 | 二进制形式的极大文本数据 |
LONGTEXT | 0-4 294 967 295字节 | 极大文本数据 |
注:BINARY和VARBINARY类类似于CHAR和VARCHAR,不同的是它们包含二进制字符串而不要非二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。这说明它们没有字符集,并且排序和比较基于列值字节的数值值。
BLOB是一个二进制大对象,可以容纳可变数量的数据。有4种BLOB类型:TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。它们只是可容纳值的最大长度不同。
有4种TEXT类型:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT。这些对应4种BLOB类型,有相同的最大长度和存储需求。
例一(显示一下当前系统中有哪些数据库):
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test |
+--------------------+
5 rows in set (0.00 sec)
注1:使用"show databases;"命令可以显示当前系统中有哪些数据库。
注2: 在mysql中,sql语句的结束必须使用";"。
注3: SQL语言不区分大小写。
例二(进入某个数据库并显示这个数据库中都有哪些表):
mysql> use test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| A |
| B |
| cats |
| users |
+----------------+
4 rows in set (0.00 sec)
注:"use test;"命令,进入了test数据库;"show tables;"命令,显示了test数据库中的表。
例三(显示表的结构):
mysql> desc users;
+----------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| email | varchar(255) | NO | | NULL | |
| password | varchar(255) | NO | | NULL | |
+----------+--------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
注1:使用"desc users;"命令显示了users这张表的结构;
注2: 上面这张user表的结构如下表所示: 有id(存储11为的int类型数据,而且id是自增的),emali(存储255位的varchar类型数据),password(同前)三个字段,相等于Excel表格中的三列(mysql中的数据类型在上面有介绍),id,emial,password即为这张表的字段。
例四(查询某张表中数据):
mysql> select * from users;
+----+----------------------+-------------+
| id | email | password |
+----+----------------------+-------------+
| 1 | webmaster@python.org | very-secret |
| 2 | webmaster@python.org | very-secret |
| 3 | webmaster@python.org | very-secret |
| 4 | xiaoming@123.com | simple |
| 5 | xiaoqiang@123.com | simple |
| 6 | xiaozhang@123.com | very-secret |
| 7 | xiaoli@123.com | simple |
| 8 | xiangwang@123.com | simple |
| 9 | xiaohong@123.com | very-secret |
+----+----------------------+-------------+
9 rows in set (0.00 sec)
注1:使用"select * form users"查询user表中的所有数据,*代表user表中的所有字段。
mysql> select * from users where users.password=\'simple\';
+----+-------------------+----------+
| id | email | password |
+----+-------------------+----------+
| 4 | xiaoming@123.com | simple |
| 5 | xiaoqiang@123.com | simple |
| 7 | xiaoli@123.com | simple |
| 8 | xiangwang@123.com | simple |
+----+-------------------+----------+
4 rows in set (0.01 sec)
注2:使用" select * form users where users.password=\'simple\' "命令就可以查询users表中所有password为simple的数据(在where后面加条件即可)。
mysql> select users.email from users;
+----------------------+
| email |
+----------------------+
| webmaster@python.org |
| webmaster@python.org |
| webmaster@python.org |
| xiaoming@123.com |
| xiaoqiang@123.com |
| xiaozhang@123.com |
| xiaoli@123.com |
| xiangwang@123.com |
| xiaohong@123.com |
+----------------------+
9 rows in set (0.00 sec)
注3: 如果只想查看某一字段的数据,只需使用"select tablename.x from tablename"即可。
# 查询条件为password=\'simple\', 只显示users.email字段
mysql> select users.email from users where password=\'simple\'; +-------------------+ | email | +-------------------+ | xiaoming@123.com | | xiaoqiang@123.com | | xiaoli@123.com | | xiangwang@123.com | +-------------------+ 4 rows in set (0.00 sec)
注4: 查询字段与查询条件没有关系。
例五(将下面数据插入表中):
mysql> insert into users (email,password) values (\'abc@xyz.com\',\'very-simple\');
Query OK, 1 row affected (0.01 sec)
mysql> select * from users where password=\'very-simple\';
+----+-------------+-------------+
| id | email | password |
+----+-------------+-------------+
| 10 | abc@xyz.com | very-simple |
+----+-------------+-------------+
1 row in set (0.00 sec)
注1:在例三中,我们知道id是自增的,所以不用人为指定,只需指定其他两个字段的值。
注2: 向表中插入数据的语法如下:
INSERT INTO table_name ( field1, field2,...fieldN )
VALUES
( value1, value2,...valueN );
例六(修改表中的数据):
修改表中数据的语法如下。
UPDATE table_name SET field1=new-value1, field2=new-value2 [WHERE Clause]
注意例四,我们将id为2的password改为"hello word"。
mysql> update users set password=\'hello word\' where id=2;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from users where id=2;
+----+----------------------+------------+
| id | email | password |
+----+----------------------+------------+
| 2 | webmaster@python.org | hello word |
+----+----------------------+------------+
1 row in set (0.00 sec)
例七(删除表中的数据):
删除表中数据的语法。
DELETE FROM table_name [WHERE Clause]
删除users表中id>6的数据。
mysql> select * from users;
+----+----------------------+-------------+
| id | email | password |
+----+----------------------+-------------+
| 1 | webmaster@python.org | very-secret |
| 2 | webmaster@python.org | hello word |
| 3 | webmaster@python.org | very-secret |
| 4 | xiaoming@123.com | simple |
| 5 | xiaoqiang@123.com | simple |
| 6 | xiaozhang@123.com | very-secret |
| 7 | xiaoli@123.com | simple |
| 8 | xiangwang@123.com | simple |
| 9 | xiaohong@123.com | very-secret |
| 10 | abc@xyz.com | very-simple |
+----+----------------------+-------------+
10 rows in set (0.00 sec)
mysql> delete from users where id>6;
Query OK, 4 rows affected (0.01 sec)
mysql> select * from users;
+----+----------------------+-------------+
| id | email | password |
+----+----------------------+-------------+
| 1 | webmaster@python.org | very-secret |
| 2 | webmaster@python.org | hello word |
| 3 | webmaster@python.org | very-secret |
| 4 | xiaoming@123.com | simple |
| 5 | xiaoqiang@123.com | simple |
| 6 | xiaozhang@123.com | very-secret |
+----+----------------------+-------------+
6 rows in set (0.00 sec)
上面的例子都是介绍对数据库表中数据的操作,接下来就来了解一下对表及数据库本身的操作。
例八(创建数据库):
#创建数据库语法
CREATE DATABASE DABASENAME;
# 创建数据库
mysql> create database mysql_test;
Query OK, 1 row affected (0.01 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| mysql_test |
| performance_schema |
| sys |
| test |
+--------------------+
6 rows in set (0.00 sec)
例九(在数据库中创建表):
创建一个如下结构的student表:
字段stu_id可存储的类型为11位int(不能为空),字段name可存储的类型为32位char(不能为空),字段age可存储的类型为11位int(不能为空),字段register_data可存储的类型为date。其中stu_id为主键,并且是自增的。
#创建数据表语法
CREATE TABLE table_name (column_name column_type);
#进入刚才建立的数据库,建立student表
mysql> use mysql_test;
Database changed
mysql> show tables;
Empty set (0.00 sec)
mysql> create table student(
-> stu_id int not null auto_increment, #字段名,类型,属性
-> name char(32) not null,
-> age int not null,
-> register_date date,
-> primary key(stu_id) # 设置某个字段为主键
-> );
Query OK, 0 rows affected (0.03 sec)
mysql> show tables;
+----------------------+
| Tables_in_mysql_test |
+----------------------+
| student |
+----------------------+
1 row in php操作mysql(数据库常规操作)