MySql学习笔记
一、安装
采用免安装包,版本号:5.6.15GA,http://dev.mysql.com/downloads/mysql/5.6.html。下载到本地后,解压之,为方便后续操作,将压缩包的内容解压到“d:/mysql”目录下,此目录即为本机上该mysql实例的主目录。
在windows环境变量中添加变量“MYSQL_HOME”,其值为“d:/mysql”,然后在Path中添加“%MYSQL_HOME%\bin”。在MySql主目录(即d:/mysql)下创建my.ini文件,其内容如下:
[client] port = 3306 default-character-set = utf8 [mysqld] port = 3306 character_set_server = utf8 basedir = d:/mysql datadir = d:/mysql/data sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
准备工作至此完成,下面开始正式的安装。
1. 以超级管理员身份运行cmd;
2. 将cmd的当前工作目录切换到d:/mysql/bin;
3. 运行以下命令:mysqld --install;
安装完成。
在命令行下,使用“net start mysql”、“net stop mysql”来打开或关闭mysql服务。在“d:/mysql/bin”目录下使用超级管理员身份运行cmd,使用“mysqld --remove”来卸载mysql。
注意事项,在安装过程中的第3步,不要再像网上其他人所说的使用“mysqld intall MySql --default-file="d:/mysql/my-default.ini"”或者“mysqld intall MySql --default-file="d:/mysql/my.ini"”来安装MySql了,如果这样做,会在后学的启动MySql服务时报1067错误的!
[2016.01.14更新] MySQL 5.7以上版本的配置和以前有所不同,需要对数据库进行初始化,步骤如下:
①. 执行完第2步之后
②. mysqld --initialize --user=mysql --console (注意必须以管理员身份打开cmd,否则报错),在控制台消息尾部会出现随机生成的初始密码,记下来;因为有特殊字符,很容易记错,最好把整个消息保存在记事本里;
③. 正常执行上面的第3步;
④. 启动MySQL并修改密码
在CMD控制台里执行命令 mysql -u root -p
回车执行后,输入刚才记录的随机密码
执行成功后,控制台显示 mysql>,则表示进入mysql
输入命令set password for root@localhost = password('123'); (注意分号),此时root用户的密码修改为123。
二、MySQL中的数据类型
2.1 概览
MySQL中有三大数据类型,分别是:数字、日期/时间、字符串,这三大类型中又更细致的划分了许多子类型:
(1)数字类型
- 整形:tinyint、smallint、mediumint、int、bigint
- 浮点型:float、double、real、decimal
(2)日期/时间:date、time、datetime、timestamp、year
(3)字符串
- 字符串:char、varchar
- 文本:tinytext、text、mediumtext、longtext
- 二进制(可用来存储图片、音乐等):tinyblob、blob、mediumblob、longblob
2.2 MySQL中数据类型详述
1、整型
- tinyint(m) 1个字节 范围(-128~127)
- smallint(m) 2个字节 范围(-32768~32767)
- mediumint(m) 3个字节 范围(-8388608~8388607)
- int(m) 4个字节 范围(-2147483648~2147483647)
- bigint(m) 8个字节 范围(+-9.22*10的18次方)
取值范围如果加了unsigned,则最大值翻倍,如tinyint unsigned的取值范围为(0~256)。 int(m)里的m是表示SELECT查询结果集中的显示宽度,并不影响实际的取值范围,没有影响到显示的宽度,不知道这个m有什么用。
2、浮点型(float和double)
- float(m,d) 单精度浮点型 8位精度(4字节) m总个数,d小数位
- double(m,d) 双精度浮点型 16位精度(8字节) m总个数,d小数位
设一个字段定义为float(5,3),如果插入一个数123.45678,实际数据库里存的是123.457,但总个数还以实际为准,即6位。
3、定点数
浮点型在数据库中存放的是近似值,而定点类型在数据库中存放的是精确值。 decimal(m,d) 参数m<65 是总个数,d<30且 d<m 是小数位。
4、字符串(char,varchar,_text)
- char(n) 固定长度,最多255个字符
- varchar(n) 固定长度,最多65535个字符
- tinytext 可变长度,最多255个字符
- text 可变长度,最多65535个字符
- mediumtext 可变长度,最多2的24次方-1个字符
- longtext 可变长度,最多2的32次方-1个字符
char和varchar:
① char(n) 若存入字符数小于n,则以空格补于其后,查询之时再将空格去掉。所以char类型存储的字符串末尾不能有空格,varchar不限于此。
② char(n) 固定长度,char(4)不管是存入几个字符,都将占用4个字节,varchar是存入的实际字符数+1个字节(n<=255)或2个字节(n>255),所以varchar(4),存入3个字符将占用4个字节。
③ char类型的字符串检索速度要比varchar类型的快。
varchar和text:
① varchar可指定n,text不能指定,内部存储varchar是存入的实际字符数+1个字节(n<=255)或2个字节(n>255),text是实际字符数+2个字节。
② text类型不能有默认值。
③ varchar可直接创建索引,text创建索引要指定前多少个字符。varchar查询速度快于text,在都创建索引的情况下,text的索引似乎不起作用。
5、二进制数据(_Blob)
① _BLOB和_text存储方式不同,_TEXT以文本方式存储,英文存储区分大小写,而_Blob是以二进制方式存储,不分大小写。
② _BLOB存储的数据只能整体读出。
③ _TEXT可以指定字符集,_BLO不用指定字符集。
6、日期时间类型
- date 日期 '2008-12-2'
- time 时间 '12:25:36'
- datetime 日期时间 '2008-12-2 22:06:44'
- timestamp 自动存储记录修改时间
若定义一个字段为timestamp,这个字段里的时间数据会随其他字段修改的时候自动刷新,所以这个数据类型的字段可以存放这条记录最后被修改的时间。
数据类型的属性
- NULL 数据列可包含NULL值
- NOT NULL 数据列不允许包含NULL值
- DEFAULT 默认值
- PRIMARY KEY 主键
- AUTO_INCREMENT 自动递增,适用于整数类型
- UNSIGNED 无符号
- CHARACTER SET name 指定一个字符集
三、使用MySQL数据库
3.1 登录到MySQL
当 MySQL 服务已经运行时,我们可以通过MySQL自带的客户端工具登录到MySQL数据库中。首先打开命令提示符,输入以下格式的命令:mysql -h 主机名 -u 用户名 -p。其中:
-h:该命令用于指定客户端所要登录的MySQL主机名,登录当前机器该参数可以省略;
-u:所要登录的用户名;
-p:告诉服务器将会使用一个密码来登录,如果所要登录的用户名密码为空,可以忽略此选项。
登录刚刚安装在本机的MySQL数据库为例,在命令行下输入“mysql -u root -p”按回车确认,如果安装正确且MySQL正在运行,会得到以下响应:Enter password:
若密码存在,输入密码登录,不存在则直接按回车登录,按照本文中的安装方法,默认root账号是无密码的,登录成功后你将会看到“Welecome to the MySQL monitor... ”的提示语。
然后命令提示符会一直以mysql>加一个闪烁的光标等待命令的输入, 输入exit或quit退出登录。
3.2 创建一个数据库
使用“create database”语句可完成对数据库的创建,创建命令的格式如下:create database 数据库名 [其他选项];
例如我们需要创建一个名为samp_db的数据库,在命令行下执行以下命令:create database samp_db character set gbk;
为了便于在命令提示符下显示中文,在创建时通过“character set gbk”将数据库字符编码指定为gbk。创建成功时会得到“Query OK, 1 row affected(0.02 sec)”的响应。
注意:MySQL语句以分号(;)作为语句的结束,若在语句结尾不添加分号时,命令提示符会以“->”提示你继续输入(有个别特例,但加分号是一定不会错的)。
可以使用“show databases;”命令查看已经创建了哪些数据库。
删除数据库:drop database 数据库名;
3.3 选择所要操作的数据库
要对一个数据库进行操作,必须先选择该数据库,否则会提示错误:ERROR 1046(3D000): No database selected
有两种方式对数据库进行使用的选择:
(1)在登录数据库时指定,命令“mysql -D 所选择的数据库名 -h 主机名 -u 用户名 -p”,例如登录时选择刚刚创建的数据库:mysql -D samp_db -u root -p。
(2)在登录后使用 use 语句指定, 命令: use 数据库名;use 语句可以不加分号, 执行 use samp_db 来选择刚刚创建的数据库, 选择成功后会提示: Database changed
3.4 查询、创建、删除、授权用户
查询用户
在mysql里进mysql库: mysql>use mysql;
然后select user表:mysql>select * from user; 或者 select * from mysql.user;
创建用户
在mysql的user表中增加连接用户帐号,这里不要直接使用INSERT语句添加user记录,使用INSERT可能出现:ERROR 1364 (HY000): Field 'ssl_cipher' doesn't have a default value 错误。那么就不用insert了,换种方法:GRANT USAGE ON *.* TO 'username'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION;
- “username”替换为将要授权的用户名,比如clientusr;
- “password”替换为clientusr设置的密码;
- locaohost可以改为%,方便你从别的IP登录。
删除用户
在mysql里进mysql库:mysql>use mysql;
然后对user表进行删除记录的操作即可,例如删除用户“Jack”:delete from user where user="Jack";
对用户授权
将某个数据库的所有权限授予给某用户:grant all on db_name.* to username@localhost identified by 'password';
3.5 表操作
创建表时指定自动增长列
create table users( id int primary key not null auto_increment, name varchar(100) not null );
即指定“auto_increment”关键字,id列自增长从1开始且步长也为1。可以使用“set @@auto_increment_increment=n"来设置步长,需要注意的是:
① 从设置开始,新建立的自增长列都以此步长为准,除非再显式的设置,而原先的自增列以原先的步长继续增长;
② 重启MySql后,设置值失效。
假如users表的id字段创建时没有指定自增长,则可以像如下代码那样修改之:alter table users modify id int auto_increment;
创建外键关联的表
外键、多主键
create table orders( id int auto_increment, userId int , totalPrice float(7,2) default 0 not null, orderDate datetime not null, primary key(id, userId), foreign key (userId) references users(id) );
四、MySQL高级应用
4.1 分页
SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset
LIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数。LIMIT 接受一个或两个数字参数,参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。初始记录行的偏移量是 0(而不是 1)。
为了与 PostgreSQL 兼容,MySQL 也支持句法: LIMIT # OFFSET #。
mysql> SELECT * FROM table LIMIT 5,10; // 检索记录行 6-15
//为了检索从某一个偏移量到记录集的结束所有的记录行,可以指定第二个参数为 -1:
mysql> SELECT * FROM table LIMIT 95,-1; // 检索记录行 96-last.
//如果只给定一个参数,它表示返回最大的记录行数目:
mysql> SELECT * FROM table LIMIT 5; //检索前 5 个记录行
//换句话说,LIMIT n 等价于 LIMIT 0,n。