RDBMS(Relational Database Management System:关系数据库管理系统)
1.数据以表格的形式出现
2.每行为各种记录名称
3 每列为各种记录名称的对应的数据域
4 多行和列构成table
5 若干表单组成database
database操作:
create database database_name;#创建数据库database_name
#database_name 可以由字母、数字、下划线、@#$组成,首字母不能是数字和$
show databases; #显示所有的库
drop database database_name; #删除database_name
use database_name;#使用数据库database_name
table操作:
create:
create table table_name(
column_name1 type1,
column_name2 type2,
.....
column_nameN typeN
);#创建表
约束:
#not null 该列不能存储null值,即值不能为空
create table table_name(
column_name1 type1 NOT NULL,
column_name2 type2,
.....
column_nameN typeN
);
#unique 保证某列的值都是不同的
create table table_name(
column_name1 type1 NOT NULL UNIQUE,
column_name2 type2,
.....
column_nameN typeN,
CONSTRAINT unique_name UNIQUE (column_names) #为UNIQUE约束命名
);
alter table table_name add/drop UNIQUE/(CONSTREANT unique_name UNIQUE) (column_names);#为已存在的表添加unique约束
#primary key 主键结合了not null和unique,确保某列或多列有唯一的标识,一张表中只能有一个primary key
create table table_name(
column_name1 type1 PRIMARY KEY,
column_name2 type2,
.....
column_nameN typeN
);
create table table_name(
column_name1 type1 PRIMARY KEY,
column_name2 type2,
.....
column_nameN typeN
PRIMARY KEY (column_name) /CONSTRANT primary_name PRIMARY KEY (column_name)
);
alter table table_name add/drop PRIMARY KEY/(CONSTRAINT primary_name PRIMARY KEY) (column_names);#default 默认值
create table table_name(
column_name1 type1 DEFAULT value, #设置默认值
column_name2 type2,
.....
column_nameN typeN
);
#foreign key 保证两张表(如子表和父表)之间的参照完整性
create table table_name(
column_name1 type1,
column_name2 type2,
.....
column_nameN typeN
CONSTRAINT foreign_name FOREIGN KEY (column_name) REFERENCES foreign_table (foreign_column);
);#同样可用alter table添加外键
#auto increment 列值自动增长,由于列值自动增长会生成唯一的ID,因此常和主键一同被设置
#check 保证某列的值符合指定的条件 mysql不支持check
drop table table_name;#删除表
describe/desc table_name;#查看表每一列的属性
select:
select column_name,column_name from table_name;#选择column_name对应的数据
select * from table_name;#选择所有列
order by:
select * from table_name order by column_name asc|desc;
#order by 根据column_name列对所选数据进行排序,默认是asc升序,可以使用desc进行降序
select * from table_name limit value;#选择value个数据where:
where operator:
select column_name from table_name where column_name [operator] value; #where语句在列数据中选择符合column_name [operator] value条件的数据
where condition1 and/or condition2 #使用AND和OR添加多个条件
运算符 | 描述 |
---|---|
= | 等于 |
<> | 不等于。注释:在 SQL 的一些版本中,该操作符可被写成 != |
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
BETWEEN | 在某个范围内 |
LIKE | 搜索某种模式 |
IN | 指定针对某个列的多个可能值 |
where like/not like:
select column_names from table_name where column_name like pattern; #选择列值和pattern匹配的数据
#pattern取值:
‘XX%’ 以XX开头 SELECT * FROM Customers WHERE City LIKE 'ber%';
‘%XX’ 以XX为结尾
‘%XX%’ 包换XX SELECT * FROM CustomersWHERE City LIKE '%es%';
select column_names from table_name where column_name not like pattern; #使用not like选择不匹配的记录
通配符:
http://www.runoob.com/sql/sql-wildcards.html 菜鸟教程
% 替代0个或多个字符
_下划线 替代一个字符
SELECT * FROM Customers WHERE City LIKE '_erlin';
SELECT * FROM Customers WHERE City LIKE 'L_n_on';
[charlist] 字符列中的任何单一字符 [char1-char2] 在之间的任何单一字符
SELECT * FROM Customers WHERE City LIKE '[bsp]%';
SELECT * FROM Customers WHERE City LIKE '[a-c]%';
[^charlist] or [!charlist] 不在字符列中的任何单一字符
SELECT * FROM Customers WHERE City LIKE '[!bsp]%';
where in:
select column_names from where column_name in (value1,value2); #column_name是value之一
where column_name not in; #column_name不是value之一
where between:
select column_names from table_name where column_name between value1 and value2;#选择column_name的值在value1和value2之间的
where column_name not between;#不在value1和value2之间
join:
select column_names from table_name1 inner join table_name2 on condition;#从两个表中选择满足conditon的记录
#left join :没有匹配项的时候返回左表的所有行
#right join: 没有匹配项的时候返回右表的所有行
#full join:只要两个表中存在一个匹配,则返回行
union:
select column_names from table_name1
union
select column_names from table_name2; #组合两张表中的若干列记录,组合后的column_name为第一张表
#如果两张表中有相同的行,使用union只返回一行,使用union all则返回所有行
select column_names from table_name1
where conditon1
union
select column_names from table_name2 where condition2;
#在两张表的table_name后使用where分别关联条件
select column_names from table_name1
union
select column_names from table_name2;
order by column_name; #排序select into:
select * into new_table from table_name;#从table_name中复制数据到new_table中
#mysql不支持select into,可以使用下面的语句代替:
#new_table未创建的情况下:
create table new_table select column_names from table_name;
例如:
create table newtable1
select class.teacher_name,student.name,student.id from class inner join student where class.id=student.class_id;
#如果new_table已存在,使用insert into 代替create table
insert into newtable
select class.teacher_name,student.name,student.id
from class inner join student where class.id=student.class_id;
insert into:
insert into table_name (column1,column2,....,columnN) values #对应列名插入数据,column可以有若干个,也可以不写
(value11,value12,....,value1N),#第一行数据
(value21,value22,.....value2N);#第二行数据
#对没有给出value的列,将使用默认值
update set:
update table_name set column1=value1,column2=value2,.... where some_column=some_value;
#将符合where条件的行,对应的列(column1,column2)数据修改为value1,value2
#如果不使用where指定行,所有行的数据
delete from:
delete from table_name where some_column=some_value; #删除列值符合条件的一行
delete from table; / delete * from table; #删除table中的所有数据
create index:
#索引由表中一个或多个字段(column)生成的键组成,存储在B树或者哈希表中,可以加快查询数据的速度。
#同时,如果列具有索引那么在插入数据时需要更新其数据结构,将花费更多的时间
#用户无法看到索引
create table table_name(
column_name1 type1,
column_name2 type2,
.....
column_nameN typeN,
INDEX|KEY index_name (column_names)
);#创建表时添加索引
alter table table_name add INDEX|KEY index_name (column_names); #向现有表中添加索引
alter table table_name drop INDEX index_name;#删除索引
#UNIQUE INDEX 唯一索引,其索引的值不能重复
#FULLTEXT INDEX 全文索引,仅支持MyISAM存储引擎,常用语CHAR VARCHAR TEXT类型的字段上
alter table :
#向已存在的表中添加、修改、删除列
ALTER TABLE table_name ADD column_name datatype; #添加列
ALTER TABLE table_name ADD column_name datatype FIRST #使用FIRST将新列放在最前面
ALTER TABLE table_name ADD column_name datatype AFTER column_name; #将新列放到column_name1之后
ALTER TABLE table_name DROP column_name; #删除列
ALTER TABLE table_name MODIFY column_name datatype; #修改列的数据类型
ALTER TABLE table_name CHANGE old_column new_column datatype; #修改列名,并可以同时修改数据类型
NULL:
#null不能使用=之类运算符,使用IS NULL or IS NOT NULL
SELECT ProductName,UnitPrice*(UnitsInStock+UnitsOnOrder)
FROM Products
#对于这个例子,如果UnitsOnOrder是NULL,那么结果是NULL
#使用IFNULL(UnitsOnOrder,0) 或者 COALESCE(UnitsOnOrder,0) 当UnitsOnOrder是NULL的时候,返回0
数据类型:
CHAR(n) 固定长度为n的字符串
VARCHAR(n) 可变长度的字符串,最大为n
TINYTEXT 0~255字节 TEXT 0~65535字节 MEDIUM 0~167772150字节 LONGTEXT 0~4294967285字节
BINARY(n) 二进制串
VARBINARY(n) 可变长度二进制串
TINYINT 1字节 SMALLINT 2 MEDIUMINT 3 INT 4 BIGINT 8
BIT(M) M位二进制
FLOAT 4字节,精度9
DOUBLE 8字节,精度16
DEC(M,D)/DECIMAL(M,D) M位有效数字,精确到小数点后D位,使用字符串实现
DATE YYYY-MM-DD
DATETIME YYYY-MM-DD HH:MM:SS
TIMESTAMP YYYYMMDDHHMMSS;
TIME HH:MM:SS
YEAR YYYY
c++连接mysql(vs2013):
参考:
http://www.2cto.com/database/201411/354316.html 这篇文章介绍了整个流程
http://www.cnblogs.com/justinzhang/archive/2011/09/23/2185963.html 介绍了基本的API用法
按照上面两篇文章所说,配置了一下,结果遇到了一个问题
错误 3error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 inte:\code\projects\mysql\test\mysql_com.h320
错误 2error C2146: 语法错误: 缺少“;”(在标识符“fd”的前面)e:\code\projects\mysql\test\mysql_com.h320
错误原因就是mysql_com.h中第320行的:
//my_socket fd;/* For Perl DBI/dbd */
网上搜了一下没找着原因,看到右面的注释,臆测跟我c++条用mysql的api没有毛线关系,然后就把这句注释掉了。。。结果可以了。。。标记一下,以后再来找原因
配置如下:
mysql.h所在目录C:\Program Files\MySQL\MySQL Server 5.6\include
libmysql.lib所在目录C:\Program Files\MySQL\MySQL Server 5.6\lib
添加mysql.h windows.h头文件