您的位置:首页 > 数据库 > MySQL

MySQL学习笔记(1)MySQL基础

2014-08-30 21:12 435 查看

MySQL学习笔记(1)MySQL基础

MySQL的在线中文文档

http://dev.mysql.com/doc/refman/5.1/zh/index.html

MySQL的SQL语句语法在线中文文档

http://dev.mysql.com/doc/refman/5.1/zh/sql-syntax.html#create-table

1.MySQL的主要目录

数据库服务器端 mysql/bin/mysqld

客户端 mysql/bin/mysql

数据 mysql/data/

各类数据文件位置:

MyISAM存储引擎

表结构文件 mysql/data/db_name/table_name.frm

数据文件 mysql/data/db_name/table_name.MYD

索引文件 mysql/data/db_name/table_name.MYI

InnoDB存储引擎

表结构文件 mysql/data/db_name/table_name.frm

数据和索引 mysql/data/ibdata*

mysql/data/ib_logfile*

2.运行MySQL.

(1)运行MySQL服务

windows平台.

net start mysql

net stop mysql

(2)客户端连接数据库

mysql -hlocalhost -P3306 -uroot -p

mysql -h localhost -P 3306 -u root -p

3.数据库操作

(1)创建数据库

create database dbname;

create database `dbname`

数据库名如有关键字或纯数字或特殊字符时,可以使用反引号``包含.

数据库名大小写取决于操作系统是否区分大小写.

数据库名可以使用中文,但要求客户端编码 set names gbk,创建的数据库名使用编码.

创建数据库时在mysql的data目录下会创建一个目录,目录名是数据库名.

在目录内,会创建一个文件db.opt.用于保存数据库的选项信息。

一般语法:

CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name

[create_specification [, create_specification] ...]

create_specification:

[DEFAULT] CHARACTER SET charset_name | [DEFAULT] COLLATE collation_name

(2)查看数据库

show databases; 查看当前的所有数据库.

show databases [like 'patten']; 查看某些数据库

show create database db_name; 查看数据库的创建语句.

(3)修改数据库

alter database db_name [修改指令] 修改数据库的属性

例: alter database db_name character set gbk;

修改数据库名: 可以直接修改数据库目录来修改数据库名.

可以将数据库导出,新建一个数据库将内容导入.

创建一个数据库,将旧数据库内的表移动(重命名)到新数据库内,删除旧数据库。

(4)删除数据库

drop database db_name;

drop database if exists db_name;

(5)指明当前使用的数据库

use db_name;

4.表操作

(1)创建表

create table db_name.table_name(列结构) [表选项];



use db_name;

create table table_name(列结构) [表选项];

一般语法

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name

[(create_definition,...)]

[table_options] [select_statement]

column_definition:

col_name type [NOT NULL | NULL] [DEFAULT default_value]

[AUTO_INCREMENT] [UNIQUE [KEY] | [PRIMARY] KEY]

[COMMENT 'string']

(2)查看表

show tables; 查看当前数据库所有表

show tables [like 'pattern']; 查看当前数据库某些表

show create table table_name 查看表的创建语句

show create table table_name \G 查看表的创建语句,显示格式有处理

describe table_name; 描述表结构

desc table_name; 描述表结构,简写

表结构对应数据库目录下的table_name.frm文件.

(3)修改表

修改表名

rename table old_table_name to new_table_name,old_table_name to new_table_name;

支持跨数据库重命名. rename table_name to db_name.table_name;

可以利用跨数据库重命名表,可以为数据库重命名,创建一个新的数据库,旧数据库内的表都rename到新的数据库内,删除旧数据库.

修改列定义

alter table table_name [add|modify|change|drop]

alter table table_name add [列定义]

alter table table_name modify [列定义]

alter table table_name change [列名] [列定义]

alter table table_name drop [列名]

修改表选项

alter table table_name [表选项]

alter table table_name character set utf8;

(4)删除表

drop table table_name;

drop table if exists table_name;

5.数据操作(增删改查,crud)

(1)查询

select 字段列表 from 表名 where 查询条件

select * from table_name where 1; *表示所有,1表示条件成立.

在查询的结尾可以使用limit限制获得的记录数量:

LIMIT {[offset,] row_count | row_count OFFSET offset}

如: Limit offset, row count

offset 偏移量,索引位置从0开始,可以省略,默认为0

row count 获得的总记录数

可以使用distinct去掉重复记录。

(2)新增

insert into 表名(字段列表) values(值列表);

(3)修改

update 表名 set 字段 = 值,字段 = 值,.. where 条件.

update 表名 set 字段列表 = 值列表 where 条件.

(4)删除

delete from 表名 where 条件

delete from table_name where 1;

6.字符集

(1)字符集

如果通过客户端操作服务器,客户端与服务器之间进行数据通信,要保证编码一致,可以将互相发送的数据转换成目标可以接收的编码。

MySQL的字符集变量:

show variables like 'character_set%';

character_set_client utf8 客户端发送数据的编码(mysql/my.conf)

character_set_connection utf8 连接数据库的编码

character_set_database gbk 当前默认数据库编码(mysql/data/db_name/db.opt)

character_set_filesystem binary 文件系统的编码(二进制)

character_set_results utf8 客户端接收数据的编码

character_set_server utf8 服务器端的编码(mysql/my.conf)

character_set_system utf8 标识符的编码,如数据库名

character_sets_dir mysql/share/charsets/ 字符集目录

(2)字符集变量设置

set 变量名=值

set character_set_client=gbk; 告知服务器,客户端发送的数据是gbk编码,执行没有返回数据的语句没有问题了。

set character_set_results=gbk; 如果需要从服务器返回数据,需要设置服务器发送给客户端的编码, 服务器在发送数据时,才能转成客户端认识的编码.

set character_set_connection=gbk;设置连接层编码

可以使用以下命令设置编码,会同时改变上面三个变量的设置。

set names gbk;

典型的情况,用set names即可,如果情况复杂,需要分开设置。

(3)字符集转换的过程

client -> connection -> 服务器内部编码 -> result

(4)校对规则

每一套编码字符集都有与之相关的校对规则,校对规则即在当前编码下,字符之间的比较顺序

每个字符集都提供一个或多个校对规则,通常的命名规则是: 字符集_语言名_比较规则(ci|cs|bin)

ci 不区分大小写

cs 区分大小写

bin 编码比较

每个字符集都有一个默认的校对规则,不指定的话就使用默认的校对规则

show collation; 查看校对规则

show collation like 'pattern' 查看校对规则

7.数据类型

(1)数值类型

整数类型

tinyint 1字节 -128 ~ 127

smallint 2字节 -32768 ~ 32767

mediumint 3字节 -8388608 ~ 8388607

int/intege 4字节 -2147483648 ~ 2147483647

bigint 8字节 -9223372036854775808 ~ 9223372036854775807

tinyint unsigned 1字节 0 ~ 255

smallint unsigned 2字节 0 ~ 65535

mediumint unsigned 3字节 0 ~ 16777215

int/intege unsigned 4字节 0 ~ 4294967295

bigint unsigned 8字节 0 ~ 18446744073709551615

·使用unsigned控制是否有正负

·可以使用zerofill来进行前导0填充.

·存在布尔bool类型,它是tinyint(1)的别名

·通过规定数据的显示宽度,达到统一显示的目的,类型(M) M表示显示的最小宽度

·指定显示宽度一般跟上zerofill进行前导0填充,alter table tablename add c tinyint(2) zerofill;

·显示宽度不影响数值的范围,宽度小的填充前导0, 宽度大的不影响,也不会截取.

小数类型

float 4字节 单精度浮点数 -3.402823466E+38 ~ 3.402823466E+38 (理论值)

double 8字节 双精度浮点数 -1.7976931348623157E+308 ~ 1.7976931348623157E+308 (理论值)

decimal 变长定点数,每9个数字,采用4个字节存储,整数和分数分开计算. M,最大是65,D,最大是30,默认是10,2 , -65个9 ~ 65个9

·可以利用M,D控制数值范围,M表示所有的数值位数,不包括小数点和符号,D表示允许的小数位数.

float(10,2), double(10,2), decimal(10,2)

·可以zerofill,可以使用科学计数法.支持无符号,但一般不用.

(2)字符串类型

字符串

char 固定长度字符串,最大长度255字节 char(M),M允许的字符串长度数,是字符数不是字节数.

varchar 可变长度字符串,最大长度65535字节 但需要1-2个字节保存信息,同时有记录的限制65536,实际最大为65532,

编码不同字符数不同 gbk<=32767字符 utf8<=21845字符 varchar(M),M字符数

文本:

tinytext 最大长度2^8+1 L + n, L为最大允许长度

text 最大长度2^16+2

mediumtext 最大长度2^24+3

longtext 最大长度2^32+4

enum 枚举类型,选项量65535 , 内部存储是2字节整型表示(数值1,2,3...),字段值只能是某一个.

enum('value1','value2',...)

set 集类型,1,2,3,4,8。元素数量64.内部存储是8字节整型表示(数值1,2,4,8,16...),字段值可以是多个.

set('value1','value2',...)

binary,varbinary,blob 二进制数据

·varchar总长度65535,

·varchar当类型数据超过255个字符时,采用2个字节表示长度 65535-2=65533

·字段的最大长度不能超过记录的总长限制65535.

·整条记录需要一个哦外的字节保存当前字段为null值,除非所有的字段都不是null,这个字节才可以省略。

只有一个varchar字段,为null时实际最大长度65532,为not null时实际最大长度65533

·text类型不算在记录总长中

(3)日期时间类型

datetime 年月日时分秒 YYYY-MM-DD HH:MI:SS 8字节 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59

timestamp 时间戳 YYYY-MM-DD HH:MI:SS 4字节 1970-01-01 00:00:00 ~ 2038-01-19 11:14:07

date 年月日 YYYY-MM-DD 3字节 1000-01-01 ~ 9999-12-31

time 时分秒 HH:MM:SS 3字节 -838:59:59 ~ 838:59:59

year 年 YYYY 1字节 1901 ~ 2155

·timestamp时间戳年份是一个范围,存储时是整型,表示时用日期时间性.

·datatime,timestamp,date在保存数据时,针对数据格式与合法性进行验证,不对日期时间的合法性进行验证.

·年月日时分秒的分隔符可以是任意的标点,但常用的是-和:,不使用也可以.

·两位的年也是被允许的,但是表示的范围70-69表示1970-2069.

·time类型不仅可以用于表示一天的时间,还可以表示一个时间间隔.因此该类型可以设置为多少个小时,设置是几天几小时几分几秒的情况 D HH:MI:SS

·检索时间戳,列加0可以检索时间戳 select c_timestamp + 0

·一般php项目中通常保存时间是unix时间戳,直接以整型的形式保存在数据库中,不是mysql提供的timestamp类型.

8.列的属性和约束

属性

Reference 关联操作

Default value 字段默认值

Primary key | Unique key 主索引|唯一索引

Auto_increment 自动增长(默认是1)

Null|not null 是否允许为空

Comment 列注释

五个约束

Primary Key 主键约束

Foreign Key 外键约束

Unique 唯一性约束

CHECK 检查约束

NOT NULL 空值约束

DEFAULT 默认值约束

自动增长

修改自动增长初始值.

alter table table_name auto_increment n;

如果n小于已经存在的值,插入表时,会取列的最大值+1.

自动增长的列可以手动插入值,也可以更改。

删除最大行后再插入行,自动增长值不会从列的最大值+1开始.

主键的几种语法

create table table_name(

c_1 int primary key auto_increment

);

create table table_name(

c_1 int,

primary key (c_1)

);

create table table_name(

c_1 int,

constraint pk_table_name primary key (c_1)

);

外键语法

Foreign Key (外键字段) References 主表名 (关联字段) [主表记录删除时的动作][主表记录更新时的动作]

create table table_name(

c_1 int,

foreign key (c_1) references m_table_name (c1)

);

create table table_name(

c_1 int,

constraint fk_table_name primary foreign key (c_1) references m_table_name (c1)

);

设置级联操作

主表数据发生改变时,与之关联的从表数据应该如何处理.

主表更新 on update

主表删除 on delete

cascade 关联操作,主表被更新或删除,从表也执行相应的操作

set null 设置为null,表示从表不指向任何主表记录

restrict 拒绝主表的相关操作.

alter table S_LOGIN_INFO add constraint FK_S_LOGIN_INFO_R_S_USERM foreign key (USER_NO)

references S_USERM (USER_NO) on delete restrict on update restrict;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: