MySQL数据库简介+c语言接口+ubuntu环境

1、 SQL简介• SQL:Structured Query Language 的缩写• 中文名称:结构化查询语言• 作用:是一种定义、操作、管理关系数据库的句法。大多数关系型数据库都支持。• 结构化查询语言的工作标准由ANSI(美国国家标准学会,ISO的成员之一)维护。• 组成:• DQL:数据查询语言• DML:数据操作语言• DDL:数据定
摘要由CSDN通过智能技术生成

1、 SQL简介

• SQL:Structured Query Language 的缩写

• 中文名称:结构化查询语言

• 作用:是一种定义、操作、管理关系数据库的句法。大多数关系型数据库都支持

• 结构化查询语言的工作标准由ANSI(美国国家标准学会,ISO的成员之一)维护。

• 组成:

• DQL:数据查询语言

• DML:数据操作语言

• DDL:数据定义语言

• DCL:数据控制语言

• TPL:事务处理语言

• CCL:指针控制语言

• 层次结构:

关系型数据库

面向对象数据库

2、常用数据库

• Oracle

• DB2

• Informix

• Sybase

• SQL Server 2000 、2005

MySQL

• Access

SQLite

• Cyber

3、MySQL 安装与配置

注意使用 root 权限进行安装:

apt-get install mysql-server mysql-client
sudo apt-get install libmysqlclient-dev

unbunt 命令行登陆 mysql 方式见下:

• 验证是否成功:

>mysql -u root -p

输入密码,如果出现以下提示证明没有问题

mysql>

3.1、数据库服务器、数据库和表的关系

• 所谓安装数据库服务器,只是在机器上装了一个数据库管理程序,这个管理程序可以管理多个数据库,一般开发人员会针对每一个应用创建一个数据库。

• 为保存应用中实体的数据,一般会在数据库创建多个表,以保存程序中实体的数据。

• 数据库服务器、数据库和表的关系如图所示:


3.2、数据在数据库中的存储方式


4、DDL 数据定义语言

• DDL:Data Definition Language

• 作用:用于描述数据库中要存储的现实世界实体的语言。即创建数据库和表的结构。

• 常用关键字:

CREATE 创建表

ALTER 修改表中对应的列

DROP 删除表

TRUNCATE 删除表中所有内容

4.1、创建数据库

CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name
    [create_specification [, create_specification] ...]
 
create_specification:
    [DEFAULT] CHARACTER SET charset_name  //指定字符集
  | [DEFAULT] COLLATE collation_name      //指定数据库字符集的比较方式

Sql 语言不区分大小写,例:

create table Person1(personID int NOT NULL AUTO_INCREMENT,PRIMARY KEY(personID),FirstName varchar(15),LastName varchar(15),Age int);
4.2、查看、删除数据库

显示数据库语句:
SHOW DATABASES;

显示数据库创建语句:
SHOW CREATE DATABASE db_name;
 
数据库删除语句:
DROP DATABASE  [IF EXISTS]  db_name ;
4.3、修改、备份、恢复数据库

ALTER  DATABASE  [IF NOT EXISTS] db_name    
	[alter_specification [, alter_specification] ...] 

alter_specification:    

    [DEFAULT] CHARACTER SET charset_name  
|   [DEFAULT] COLLATE collation_name
4.4、创建表(基本语句)

CREATE TABLE table_name
(
	field1  datatype,
	field2  datatype,
	field3  datatype
)[character set 字符集 collate 校对规则]
field:指定列名 datatype:指定列类型
• 注意:创建表时,要根据需保存的数据创建相应的列,并根据数据的类型定义相应的列类型。例:user 对象

id int

name string

password string

birthday date

IdNamePasswordbirthday
    
注意:建表至少需要给出表中的一列信息,否则会报错。

4.5、MySQL 常用数据类型


4.6、修改表

使用ALTER TABLE 语句 追加,修改,或删除列的语法。

ALTER TABLE table_name
ADD		   (column datatype [DEFAULT expr]
		   [, column datatype]...);
ALTER TABLE table_name
CHANGE	   column datatype [DEFAULT expr]
		   [, column datatype]...;
ALTER TABLE table_name
DROP	      (column);
修改表的名称:Rename table 表名 to 新表名

修改表的字符集:alter table student character set utf8;

例:

alter table persons add addr varchar(15);
alter table persons change addr addr1 varchar(15);
5、DML 数据操纵语言

• DML:Data Manipulation Language

• 作用:用于向数据库表中插入、删除、修改数据。

• 常用关键字:

INSERT

UPDATE

DELETE

5.1、Insert 语句

• 使用 INSERT 语句向表中插入数据。

INSERT INTO	table [(column [, column...])]
VALUES		(value [, value...]);

• 插入的数据应与字段的数据类型相同。

• 数据的大小应在列的规定范围内,例如:不能将一个长度为80的字符串加入到长度为40的列中。

• 在 values 中列出的数据。

字符和日期型数据应包含在单引号中。

• 插入空值,不指定或 insert into table value(null)

例:

insert into persons (FirstName,LastName,Age) values('Peter','bob','40');
注:mysql 中文乱码

• mysql 有六处使用了字符集,分别为:client、connection、database、results、server、system。

client 是客户端使用的字符集。

connection 是连续数据库的字符集设置类型,如果程序没有指明连接数据库使用的字符集类型就按照服务器端默认的字符集设置。

database 是数据库服务器中某个库使用的字符集设定,如果建库时没有指明,将使用服务器安装时指定的字符集设置。

result 是数据库给客户端返回时使用的字符集设定,如果没有指明,使用服务器默认的字符集。

server 是服务器安装时指定的默认字符集设定。

• system 是数据库系统使用的字符集设定。

注意插入数据时的中文问题:
show variables like 'character%';

如果插入中文时,要调整编码为GBK
		show variables like 'character%';
修改客户端工具所用的编码
		set character_set_client=gbk;
客户端显示结果的编码
		set character_set_results=gbk;
5.2、Update 语句

使用 update 语句修改表中数据。

UPDATE 	tbl_name    
	SET col_name1=expr1 [, col_name2=expr2 ...]    
	[WHERE where_definition]  

UPDATE 语法可以用新值更新原有表行中的各列。

• SET 字句指示要修改那些列和要给予哪些值。

• WHERE 字句指定应更新哪些行。如没有 WHERE 子句,则更新所有的行。

例:

update persons set LastName='sky' where personID=2;
5.3、Delete 语句

• 使用 delete 语句删除表中数据。

delete from  table_name       
	[WHERE where_definition]    

• 如果不使用 where 子句,将删除表中所有数据。

• Delete 语句不能删除某一列的值(可使用update)

• 使用 delete 语句仅删除记录,不删除表本身。如果要删除表,使用 drop table 语句。

同 insert 和 update 一样,从一个表中删除记录将引起其他表的参照完整性问题,在修改数据库数据时,头脑中应该始终不要忘记这个潜在的问题。

补:

删除表中数据也可使用TRUNCATE TABLE 语句,它和delete有所不同 
delete 和drop的区别

delete from persons where personID=2;
6、DQL 数据查询语言(简单的)

• DQL:Data Query Language

• 作用:查询数据。

• 常用关键字:

• SELECT

6.1、Select 语句(1)

• 基本 select 语句

SELECT [DISTINCT] [* ] |{column1, column2, column3..}
		FROM	table [where ];

• Select 指定查询那些列的数据。

• column指定列明。

• * 号代表查询所有列。

• From 指定查询哪张表。

• DISTINCT 可选,指显示结果时,是否剔除重复数据。

6.2、Select 语句(2)

• 在 select 语句中可使用表达式对查询的列进行运算

SELECT *|{column1|expression, column2|expression,..}
		FROM	table;

• 在select 语句中可使用 as 语句

SELECT column as 别名 from 表名;

6.3、Select 语句(4)

• 在 where 字句中经常使用的运算符


注:

mysql中的NULL其实是占用空间的,下面是来自于MYSQL官方的解释
“NULL columns require additional space in the row to record whether their values are NULL. For MyISAM tables, each NULL column takes one bit extra, rounded up to the nearest byte.”
打个比方来说,你有一个杯子,空值代表杯子是真空的,NULL代表杯子中装满了空气,虽然杯子看起来都是空的,但是二者仍然是由区别的。

6.4、Select 语句(5)

• 使用 order by 字句排序查询结果。

SELECT column1, column2. column3..
		FROM	table
		order by column asc|desc

• Order by 指定排序的列,排序的列即可是表中的列明,也可以是 select 语句后指定的列明。

• Ase 升序、Dese 降序

• ORDER BY 字句应位于 SELECT 语句的结尾。

7、数据完整性

• 数据完整性是为了保证插入到数据中的数据是正确的,它防止了用户可能的输入错误。

• 数据完整性主要分为以下三类:

• 实体完整性:规定表的一行(即每一条记录)在表中是唯一地实体。实体完整性通过表的主键来实现。

• 域完整性:指数据库表的列(即字段)必须符合某种特定的数据类型或约束。比如 NOT NULL。

• 参照完整性:保证一个表的外键和另一个表的主键对应。

补充:

数据库主键主键:表中经常有一个列或列的组合,其值能唯一地标识表中的每一行。这样的一列或多列称为表的主键,通过它可强制表的实体完整性。当创建或更改表时可通过定义 PRIMARY KEY 约束来创建主键。一个表只能有一个 PRIMARY KEY 约束,而且 PRIMARY KEY 约束中的列不能接受空值。由于 PRIMARY KEY 约束确保唯一数据,所以经常用来定义标识列。 作用 :
1)保证实体的完整性; 
2)加快数据库的操作速度
 3) 在表中添加新记录时,会自动检查新记录的主键值,不允许该值与其他记录的主键值重复。 
4) 自动按主键值的顺序显示表中的记录。如果没有定义主键,则按输入记录的顺序显示表中的记录。
7.1、定义表的约束

• 定义主键约束:

• primary key: 不允许为空,不允许重复

• (可以区分两条记录的唯一性)

• 删除主键:alter table tablename drop primary key;

• 定义主键自动增长:

• auto_increment

• 定义唯一约束:

• unique

• 定义非空约束:

• not null

• 定义外键约束:

• constraint ordersid_FK foreign key(ordersid) references orders(id);

例:

create table pats(patID int NOT NULL AUTO_INCREMENT,PRIMARY KEY(patID),person1ID int default NULL,FOREIGN KEY (person1ID) REFERENCES persons(personID));

http://www.cppblog.com/wolf/articles/69089.html
8、多表设计

• 一对多

• 多对多

• 一对一

• 避免数据的冗余

8.1、一对多

图六:


Create table province (
    id int primary key,
    province varchar(9) not null  
   )
insert into province values(1,'shandong');

Create table students(
    id int primary key,
    name varchar(5) not null,
    province_id int not null
)

Alter table student add constraint FK_student_Provinceid     foreign key (province_id)  references provices(id);

alter table employee add constraint FK_employee_departmentid foreign key (departmentid) references department(id);
8.2、多对多


create table TEACHER(
ID int primary key,
NAME varchar(100)
);
insert into teacher values(1,'math teacher');
insert into teacher values(2,'chinese teacher');
insert into teacher values(3,'english teacher');

create table STUDENT3(
ID int primary key,
NAME varchar(100)
);

insert into student3 values(1,"lily");
insert into student3 values(2,"lucy");
insert into student3 values(3,"lilei");
insert into student3 values(4,"lilyzhou");

insert into TEACHER_STUDENT(1,1);
create table TEACHER_STUDENT(
T_ID int,
S_ID int,
primary key(T_ID,S_ID),
constraint T_ID_FK foreign key(T_ID) references TEACHER(ID),
constraint S_ID_FK foreign key(S_ID) references STUDENT3(ID)
);
8.3、一对一


方法1:外键关联+唯一
create table PERSON(
ID int primary key,
NAME varchar(100)
);
create table computer(
ID int primary key,
brand varchar(20),
PERSON_ID int unique,
constraint PERSON_ID_FK foreign key(PERSON_ID) references PERSON(ID)
);

方法2:主键关联
constraint PERSON_ID_FK foreign key(ID) references PERSON(ID)
9、DQL 数据查询语言

• 连接查询:

• 交叉连接(cross join):不带 on 字句,返回连接表中所有数据行的笛卡尔积。

• 内连接(inner join):返回连接表中符合连接条件及查询条件的数据行。

• 外连接:分为左外连接(left out join)、右外连接(right outer join)。与内连接不同的是,外连接不仅返回连接表中符合连接条件及查询条件的数据行,也返回左表(左外连接时)或右表(右外连接时)中仅符合查询条件但不符合连接条件的数据行。

• 子查询

• 联合查询

• 报表查询

9.1、连接查询

• 连接查询的 from 字句的连接语法格式为:

Select *
from TABLE1 join_type TABLE2  [on (join_condition)]
				       [where (query_condition)]

• 其中,TABLE1 和 TABLE2 表示参与连接操作的表,TABLE1为左表,TABLE2为右表。on 字句设定连接条件,where 字句设定查询条件,join_type 表示连接类型。

9.1.1、交叉连接查询

交叉连接查询CUSTOMER表和ORDERS表
SELECT * FROM customer CROSS JOIN orders;
SELECT * FROM customer,orders;
9.1.2、内连接查询

• 显示内连接:使用 inner join 关键字,在 on 字句中设定连接条件

SELECT * FROM customer    c INNER JOIN orders    o ON c.id=o.customer_id; 
SELECT * FROM customer as  c INNER JOIN orders as o 
ON c.id=o.customer_id; 

• 隐式内连接:不包含 inner join 关键字和 on 关键字,在 where 字句中设定连接条件

SELECT * FROM customer c,orders o WHERE c.id=o.customer_id; 

补充:

内连接 内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的 列值。内连接分三种: 
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结 果中列出被连接表中的所有列,包括其中的重复列。 例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: SELECT * FROM authors AS a INNER JOIN publishers AS p ON a.city=p.city 
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的 列的列值。这些运算符包括>、>=、<=、<、!>、!<和<>。 
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选 择列表指出查询结果集合中所包括的列,并删除连接表中的重复列。
9.1.3、左外连接查询

• 使用 left outer join 关键字,在 on 字句中设定连接条件

SELECT * FROM customer c LEFT OUTER JOIN orders o ON c.id=o.customer_id; 

• 不仅包含符合 c.id = o.customer_id 连接条件的数据行,还包含左表中的其他数据行

• 带查询条件的左外连接查询,在 where 字句中设定查询条件

SELECT * FROM customer c LEFT OUTER JOIN orders o ON c.id=o.customer_id WHERE o.price>250;

注:

left outer join 和 right outer join 不能缺少判断条件

9.1.4、右外连接查询

• 使用 right outer join 关键字,在 on 字句中设定连接条件

SELECT * FROM customer c RIGHT OUTER JOIN orders o ON c.id=o.customer_id; 

• 不仅包含符合 c.id = o.customer_id 连接条件的数据行,还包含orders 右表中的其他数据行。

• 带查询条件的右外连接查询,在 where 字句中设定查询条件

SELECT * FROM customer c RIGHT OUTER JOIN orders o ON c.id=o.customer_id WHERE o.price>250;

9.2、子查询

• 子查询也叫嵌套查询,是指在 where 字句或 from 字句中又嵌入 select 查询语句(一般写在 where 字句)

例:

查询“郭靖”的所有订单信息
SELECT * FROM orders WHERE customer_id=(SELECT id FROM customer WHERE name LIKE ‘%郭靖%');

9.3、联合查询

• 联合查询能够合并两条查询语句的查询结果,去掉其中的重复数据行,然后返回没有重复数据行的查询结果。联合查询使用 union 关键字。

SELECT * FROM orders WHERE price>100 UNION SELECT * FROM orders WHERE customer_id=1;

注意:联合查询的各子查询使用的表结构应该相同,同时两个子查询返回的列也应该相同。

9.4、报表查询

• 报表查询对数据行进行分组统计,其语法格式为:

 select …  from … [where…] [ group by … [having… ]] [ order by … ]

• 其中 group by 字句指定按照哪些字段分组,having 字句设定分组查询条件。

• 在报表查询中可以使用 SQL 函数

补充:

查询前几行   select * from pats limit 0,3;前三行

9.4.1、常用统计函数

• count()
• sum()

• avg()
• max()

• min()

9.4.2、合计函数 - count

• count(列名) 返回某一列,行的总数(有多少条记录)

Select count(*)|count(列名) from tablename
		[WHERE where_definition]   

9.4.3、合计函数 - sum

• sum 函数返回满足 where 条件的行的和

Select sum(列名){,sum(列名)…} from tablename
		[WHERE where_definition]   

注意:sum 仅对数值起作用,否则会报错

注意:对多列求和,“,”号不能少。

9.4.4、合计函数 - avg

• AVG 函数返回满足 where 条件的一列的平均值

Select avg(列名){,avg(列名)…} from tablename
		[WHERE where_definition]   

9.4.5、合计函数 - MAX/MIN

• max/min 函数返回满足 where 条件的一列的最大/最小值

Select max(列名) from tablename
		[WHERE where_definition]   
9.5、select 语句

• 使用 group by 子句对列进行分组

SELECT column1, column2. column3.. FROM	table;
		group by column 

• 使用 having 子句过滤

SELECT column1, column2. column3..
		FROM	table;
		group by column having ...

注意:

having 和 where 均可实现过滤,但是 having 可以使用合计函数,having 通常跟在 group by 后,它作用于组。 

10、数据的备份与恢复

• 数据库备份:cmd 命令下

mysqldump -u root -p test>test.sql
• 数据库恢复:

• 创建数据库并选择该数据库 

• 在 cmd 命令下:

mysql -u root -p test<test.sql
或者

• 在 mysql > 命令行下 执行 SOURCE 数据库文件

注意:如果文件放在c盘,可能由于权限原因无法访问。更换到其他盘符再试。

C语言实现的API:

insert.c

#include <mysql/mysql.h>
#include <stdio.h>

int main()
{
	MYSQL *conn;
	MYSQL_RES *res;
	MYSQL_ROW row;
	char* server="localhost";
	char* user="root";
	char* password="luke";
	char* database="zhongwen";
	char* query="update test2 set num=30 where name='中文'";
	int t,r;
	conn=mysql_init(NULL);
	if(!mysql_real_connect(conn,server,user,password,database,0,NULL,0))
	{
		printf("Error connecting to database:%s\n",mysql_error(conn));
	}else{
		printf("Connected...\n");
	}
	t=mysql_query(conn,query);
	if(t)
	{
		printf("Error making query:%s\n",mysql_error(conn));
	}else{
		printf("insert success\n");
	}
	mysql_close(conn);
	return 0;
}
delete.c

#include <mysql/mysql.h>
#include <stdio.h>

int main()
{
	MYSQL *conn;
	MYSQL_RES *res;
	MYSQL_ROW row;
	char* server="localhost";
	char* user="root";
	char* password="luke";
	char* database="test";
	char* query="delete from Person1 where personID=7";
	int t,r;
	conn=mysql_init(NULL);
	if(!mysql_real_connect(conn,server,user,password,database,0,NULL,0))
	{
		printf("Error connecting to database:%s\n",mysql_error(conn));
	}else{
		printf("Connected...\n");
	}
	t=mysql_query(conn,query);
	if(t)
	{
		printf("Error making query:%s\n",mysql_error(conn));
	}else{
		printf("delete success\n");
	}
	mysql_close(conn);
	return 0;
}
query.c

#include <mysql/mysql.h>
#include <stdio.h>

int main()
{
	MYSQL *conn;
	MYSQL_RES *res;
	MYSQL_ROW row;
	char* server="localhost";
	char* user="root";
	char* password="luke";
	char* database="zhongwen";
	char* query="select * from test2";
	int t,r;
	conn=mysql_init(NULL);
	if(!mysql_real_connect(conn,server,user,password,database,0,NULL,0))
	{
		printf("Error connecting to database:%s\n",mysql_error(conn));
	}else{
		printf("Connected...\n");
	}
	t=mysql_query(conn,query);
	if(t)
	{
		printf("Error making query:%s\n",mysql_error(conn));
	}else{
		printf("Query made...\n");
		res=mysql_use_result(conn);
		if(res)
		{
			while((row=mysql_fetch_row(res))!=NULL)
			{	
				//printf("num=%d\n",mysql_num_fields(res));//列数
				for(t=0;t<mysql_num_fields(res);t++)
					printf("%s ",row[t]);
				printf("\n");
			}
		}
		mysql_free_result(res);
	}
	mysql_close(conn);
	return 0;
}
query1.c

#include <mysql/mysql.h>
#include <stdio.h>

int main()
{
	MYSQL *conn;
	MYSQL_RES *res;
	MYSQL_ROW row;
	char* server="localhost";
	char* user="root";
	char* password="luke";
	char* database="test";
	char* query="select * from user";
	int t,r;
	conn=mysql_init(NULL);
	if(!mysql_real_connect(conn,server,user,password,database,0,NULL,0))
	{
		printf("Error connecting to database:%s\n",mysql_error(conn));
	}else{
		printf("Connected...\n");
	}
	t=mysql_query(conn,query);
	if(t)
	{
		printf("Error making query:%s\n",mysql_error(conn));
	}else{
		printf("Query made...\n");
		res=mysql_use_result(conn);
		if(res)
		{
			while((row=mysql_fetch_row(res))!=NULL)
			{	
				//printf("num=%d\n",mysql_num_fields(res));//列数
				for(t=0;t<mysql_num_fields(res);t++)
					printf("%s ",row[t]);
				printf("\n");
			}
		}
		mysql_free_result(res);
	}
	mysql_close(conn);
	return 0;
}





























  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值