数据库简单概念
数据库是存储数据的集合的单独的应用程序。每个数据库具有一个或多个不同的API,用于创建,访问,管理,检索和复制所保存数据。
其他类型的数据存储,可以使用,如获取文件系统上的文件或内存中的大的哈希表,但数据并写入不会那么快,但这些类型的系统易于使用。
所以今天,我们使用关系数据库管理系统(RDBMS)来存储和管理体积庞大的数据。这就是所谓关系数据库,因为所有的数据存储到不同的表和关系建立使用主键或外键等其它键。
一个关系数据库管理系统(RDBMS)是一种软件是:
能够实现具有表,列和索引的数据库
保证了各种表的行之间的引用完整性
自动更新索引
解释SQL查询和联合各表的信息。
简单的说数据库就是装数据、管理数据的地方,每个网站的资源(比如图像、声音、视屏、软件等)、每个游戏的资源,都是放在服务器里的数据库中的。
什么是 SQL?
SQL 指结构化查询语言
SQL 使我们有能力访问数据库
SQL 是一种 ANSI (美国国家标准化组织
)的标准计算机语言
SQL 能做什么?
SQL 面向数据库执行查询
SQL 可从数据库取回数据
SQL 可在数据库中插入新的记录
SQL 可更新数据库中的数据
SQL 可从数据库删除记录
SQL 可创建新数据库
SQL 可在数据库中创建新表
SQL 可在数据库中创建存储过程
SQL 可在数据库中创建视图
SQL 可以设置表、存储过程和视图的权限
SQL 是一种标准 - 但是...
SQL 是一门 ANSI 的标准计算机语言,用来访问和操作数据库系统。SQL 语句用于取回和更新数据库中的数据。SQL 可与数据库程序协同工作,比如 MS Access、DB2、Informix、MS SQL Server、Oracle、Sybase 以及其他数据库系统。
不幸地是,存在着很多不同版本的 SQL 语言,但是为了与 ANSI 标准相兼容,它们必须以相似的方式共同地来支持一些主要的关键词(比如 SELECT、UPDATE、DELETE、INSERT、WHERE 等等)。
注释:除了 SQL 标准之外,大部分 SQL 数据库程序都拥有它们自己的私有扩展!
MySql简单概念
MySQL 数据库
MySQL是一个快速,易于使用的RDBMS,被用于许多小型和大型企业。MySQL由一个瑞典公司MySQL AB支持。正在开发,销售。MySQL变得如此受欢迎,因为许多很好的理由:
MySQL在一个开源许可下发布。所以使用它不要担心什么问题。
MySQL本身是非常强大的程序。它拥有可处理最昂贵,最强大的数据库软件包的相当大一部分功能。
MySQL使用众所周知的SQL数据语言的标准形式。
MySQL可运行在许多类操作系统和许多语言,包括 C#, PHP, PERL, C, C++, JAVA ,Python等
MySQL运行得非常快,甚至在大型数据集也可以运行得很好。
MySQL支持大型数据库,可达5千万行以上的表。 表的默认文件大小限制为4GB,但可以增加(如果操作系统可以处理它),800万TB是一个理论极限(TB).
MySQL是定制的。开源GPL许可允许程序员修改MySQL软件,以适应自己的特定环境。
MySQL 为关系型数据库(Relational Database Management System), 这种所谓的"关系型"可以理解为"表格"的概念, 一个关系型数据库由一个或数个表格组成, 如图所示的一个表格:
表头(header): 每一列的名称;
列(row): 具有相同数据类型的数据的集合;
行(col): 每一行用来描述某个人/物的具体信息;
值(value): 行的具体信息, 每个值必须与该列的数据类型相同;
主键(key): 表中用来识别某个特定的人\物的方法, 主键的值在当前列中具有唯一性。
**外键: **外键是两个表之间的连接值。
MySQL服务 DOS下的启动、停止与卸载
在 Windows 命令提示符下运行:
启动: net start MySQL
停止: net stop MySQL
卸载: sc delete 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次方) |
2、浮点型(float和double)
MySQL数据类型 | 含义 |
---|---|
float(m,d) | 单精度浮点型 8位精度(4字节) m总个数,d小数位 |
double(m,d) | 双精度浮点型 16位精度(8字节) m总个数,d小数位 |
设一个字段定义为float(5,3),如果插入一个数12.45678,实际数据库里存的是12.457,但总个数还以实际为准,即5位。
3、定点数
浮点型在数据库中存放的是近似值,而定点类型在数据库中存放的是精确值。
4、字符串(char,varchar,_text)
MySQL数据类型 | 含义 |
---|---|
char(n) | 固定长度,最多255个字符 |
varchar(n)固定长度,最多65535个字符 | |
tinytext | 可变长度,最多255个字符 |
text | 可变长度,最多65535个字符 |
mediumtext | 可变长度,最多2的24次方-1个字符 |
longtext | 可变长度,最多2的32次方-1个字符 |
char和varchar:
1.char(n) 若存入字符数小于n,则以空格补于其后,查询之时再将空格去掉。所以char类型存储的字符串末尾不能有空格,varchar不限于此。
2.char(n) 固定长度,char(4)不管是存入几个字符,都将占用4个字节,varchar是存入的实际字符数+1个字节(n<=255)或2个字节(n>255),所以varchar(4),存入3个字符将占用4个字节。
3.char类型的字符串检索速度要比varchar类型的快。
varchar和text:
1.varchar可指定n,text不能指定,内部存储varchar是存入的实际字符数+1个字节(n<=255)或2个字节(n>255),text是实际字符数+2个字节。
2.text类型不能有默认值。
3.varchar可直接创建索引,text创建索引要指定前多少个字符。varchar查询速度快于text,在都创建索引的情况下,text的索引似乎不起作用。
5.二进制数据(_Blob)
1._BLOB和_text存储方式不同,_TEXT以文本方式存储,英文存储区分大小写,而_Blob是以二进制方式存储,不分大小写。
2._BLOB存储的数据只能整体读出。
3._TEXT可以指定字符集,_BLO不用指定字符集。
6.日期时间类型
MySQL数据类型 | 含义 |
---|---|
date | 日期 '2008-12-2' |
time | 时间 '12:25:36' |
datetime | 日期时间 '2008-12-2 22:06:44' |
timestamp | 自动存储记录修改时间 |
若定义一个字段为timestamp,这个字段里的时间数据会随其他字段修改的时候自动刷新,所以这个数据类型的字段可以存放这条记录最后被修改的时间。
数据类型的属性
MySQL关键字 | 含义 |
---|---|
NULL | 数据列可包含NULL值 |
NOT NULL | 数据列不允许包含NULL值 |
DEFAULT | 默认值 |
PRIMARY KEY | 主键 |
AUTO_INCREMENT | 自动递增,适用于整数类型 |
UNSIGNED | 无符号 |
CHARACTER SET name | 指定一个字符集 |
2. 使用数据库
1> 创建数据库
使用 create database 语句可完成对数据库的创建, 创建命令的格式如下:
create database 数据库名 [其他选项];
例如我们需要创建一个名为 samp_db 的数据库, 在命令行下执行以下命令:
create database Person_DB character;
注意: MySQL语句以分号(;)作为语句的结束, 若在语句结尾不添加分号时, 命令提示符会以 -> 提示你继续输入(有个别特例, 但加分号是一定不会错的);
3. 创建数据库表
使用 create table 语句可完成对表的创建, create table 的常见形式:
create table 表名称(列声明);
以创建 students 表为例, 表中将存放 学号(id)、姓名(name)、性别(sex)、年龄(age)、联系电话(tel) 这些内容:
create table students
(
id int unsigned not null auto_increment primary key,
name char(8) not null,
gender char(4) not null,
age tinyint unsigned not null,
tel char(13) null default "-"
);
对于一些较长的语句在命令提示符下可能容易输错, 因此我们可以通过任何文本编辑器将语句输入好后保存为 createtable.sql 的文件中, 通过命令提示符下的文件重定向执行执行该脚本。
打开命令提示符, 输入: mysql -D samp_db -u root -p < createtable.sql
(提示: 1.如果连接远程主机请加上 -h 指令; 2. createtable.sql 文件若不在当前工作目录下需指定文件的完整路径。)
语句解说:
create table tablename(columns) 为创建数据库表的命令, 列的名称以及该列的数据类型将在括号内完成;
括号内声明了5列内容, id、name、sex、age、tel为每列的名称, 后面跟的是数据类型描述, 列与列的描述之间用逗号(,)隔开;
以 "id int unsigned not null auto_increment primary key" 行进行介绍:
- "id" 为列的名称;
- "int" 指定该列的类型为 int(取值范围为 -8388608到8388607), 在后面我们又用 * * "unsigned" 加以修饰, 表示该类型为无符号型, 此时该列的取值范围为 0到16777215;
- "not null" 说明该列的值不能为空, 必须要填, 如果不指定该属性, 默认可为空;
- "auto_increment" 需在整数列中使用, 其作用是在插入数据时若该列为 NULL, MySQL将自动产生一个比现存值更大的唯一标识符值。在每张表中仅能有一个这样的值且所在列必须为索引列。
- "primary key" 表示该列是表的主键, 本列的值必须唯一, MySQL将自动索引该列。
下面的 char(8) 表示存储的字符长度为8, tinyint的取值范围为 -127到128, default 属性指定当该列值为空时的默认值。
**提示: **1. 使用 show tables; 命令可查看已创建了表的名称; 2. 使用 describe 表名; 命令可查看已创建的表的详细信息。
操作MySQL数据库
** 1. 向表中插入数据**
insert 语句可以用来将一行或多行数据插到数据库表中, 使用的一般形式如下:
insert [into] 表名 [(列名1, 列名2, 列名3, ...)] values (值1, 值2, 值3, ...);
其中 [] 内的内容是可选的, 例如, 要给 Person_DB 数据库中的 students 表插入一条记录, 执行语句:
insert into students values(NULL, "王刚", "男", 20, "13811371377");
按回车键确认后若提示 Query Ok, 1 row affected (0.05 sec) 表示数据插入成功。 若插入失败请检查是否已选择需要操作的数据库。
有时我们只需要插入部分数据, 或者不按照列的顺序进行插入, 可以使用这样的形式进行插入:
insert into students (name, sex, age) values("孙丽华", "女", 21);
** 2. 查询表中的数据**
select 语句常用来根据一定的查询规则到数据库中获取数据, 其基本的用法为:
select 列名称 from 表名称 [查询条件];
例如要查询 students 表中所有学生的名字和年龄, 输入语句
select name, age from students;
执行结果如下:
name | age |
---|---|
王刚 | 20 |
孙丽华 | 21 |
王永恒 | 23 |
郑俊杰 | 19 |
陈芳 | 22 |
张伟朋 | 21 |
6 rows in set (0.00 sec) mysql>
也可以使用通配符 * 查询表中所有的内容, 语句:
select * from students;
2.1按特定条件查询:
where 关键词用于指定查询条件, 用法形式为:
select 列名称 from 表名称 where 条件;
以查询所有性别为女的信息为例, 输入查询语句:
select * from students where sex="女";
where 子句不仅仅支持 "where 列名 = 值" 这种名等于值的查询形式, 对一般的比较运算的运算符都是支持的, 例如 =、>、<、>=、<、!= 以及一些扩展运算符 is [not] null、in、like 等等。 还可以对查询条件使用 or 和 and 进行组合查询。
示例:
查询年龄在21岁以上的所有人信息:
select * from students where age > 21;
查询名字中带有 "王" 字的所有人信息:
select * from students where name like "%王%";
查询id小于5且年龄大于20的所有人信息:
select * from students where id<5 and age>20;
更新表中的数据
update 语句可用来修改表中的数据, 基本的使用形式为:
update 表名称 set 列名称=新值 where 更新条件;
使用示例:
将id为5的手机号改为默认的"-":
update students set tel=default where id=5;
将所有人的年龄增加1:
update students set age=age+1;
将手机号为 13288097888 的姓名改为 "张伟鹏", 年龄改为 19:
update students set name="张伟鹏", age=19 where tel="13288097888";
删除表中的数据
delete 语句用于删除表中的数据, 基本用法为:
delete from 表名称 where 删除条件;
使用示例:
删除id为2的行:
delete from students where id=2;
删除所有年龄小于21岁的数据:
delete from students where age<20;
**删除表中的所有数据: **
delete from students;
创建后表的修改
alter table 语句用于创建后对表的修改, 基础用法如下:
添加列
基本形式:
alter table 表名 add 列名 列数据类型 [after 插入位置];
示例:
在表的最后追加列 address:
alter table students add address char(60);
在名为 age 的列后插入列 birthday:
alter table students add birthday date after age;
修改列
基本形式:
alter table 表名 change 列名称 列新名称 新数据类型;
示例:
将表 tel 列改名为 telphone:
alter table students change tel telphone char(13) default "-";
将 name 列的数据类型改为 char(16):
alter table students change name name char(16) not null;
删除列
基本形式: alter table 表名 drop 列名称;
示例:
删除 birthday 列:
alter table students drop birthday;
重命名表
基本形式:
alter table 表名 rename 新表名;
示例:
重命名 students 表为 workmates:
alter table students rename workmates;
删除整张表
基本形式:
drop table 表名;
示例:
删除 workmates 表:
drop table workmates;
** 删除整个数据库**
基本形式:
drop database 数据库名;
示例:
删除 samp_db 数据库:
drop database samp_db;
C# 操作数据库
先下载mysql针对 .net的命名空间 下载地址
下载完成之后,得到
v4.0和v4.5中,分别针对于.NetFramework的版本号。
这里我选用v4.0,在项目中添加引用:
导入命名空间:using MySql.Data.MySqlClient;
// Host 数据库所在的ip地址 这里取本机的数据 , 数据库名称,就是我们将要操作的数据, UserName、Password就是登陆数据库的账号, 密码。
string hostName = "Host=localhost;Database=bank;Username=root;Password=";
// 1. 创建一个数据库连接对象
MySqlConnection con = new MySqlConnection(hostName);
// 打开该数据库的连接
con.Open();
#region mysql执行插入语句
//2 . 创建出一个命令对象 。 通过该对象去执行sql语句 。
// 第一个参数,将要执行的sql语句, 第二个参数,是在哪个连接上面执行。 该连接包含了数据库的名字,主机地址,还有登录的账户
//MySqlCommand command = new MySqlCommand("insert into student (name, age, gender) values ('张三', 99, '女')", con);
//if (command.ExecuteNonQuery() > 0)
//{
// Console.WriteLine("插入数据成功");
//}
//else
//{
// Console.WriteLine("插入数据失败");
//}
#endregion
#region mysql执行查询语句
MySqlCommand command = new MySqlCommand("select * from student", con);
// 执行一个查询命令, 获取到的数据,存放在reader中。
MySqlDataReader reader = command.ExecuteReader();
// read方法, 如果获取到数据,就返回True,否则 false。
while (reader.Read())
{
Console.WriteLine("id :" + reader["id"] + " name : " + reader["name"] + " age : " + reader["age"]);
}
#endregion
// 数据库使用完毕要及时关闭 。 不然下次打开的时候会出异常
con.Close();
Console.WriteLine("程序执行完毕");
Console.ReadKey();