MySQL学习笔记(一)
一、数据库基本操作
1、创建数据库
SHOW DATABASES; #查看当前存在的数据库 CREATE DATABASE test_db; #创建数据库 SHOW CREATE DATABASE test_db; #线束数据库的创建信息
2、删除数据库
drop DATABASE test_db; #删除数据库
二、数据表的基本操作
1、创建数据表
USE test_db; #指定操作在哪个数据库中进行 CREATE TABLE test #创建表 ( ID INT (11), NAME VARCHAR (25), deptID INT (11), salary FLOAT ); SHOW TABLES; #展示数据库中表
2、使用主键约束
主键能够唯一标识表中的一条记录,可以结合外键来定义不同数据表之间的关系。主键的数据唯一且不为空,主键可以是单字段,也可以是多字段联合。
CREATE TABLE test2 #创建表时指定主键,单字段做为主键 ( ID INT (11) PRIMARY KEY, NAME VARCHAR (25), deptID INT (11), salary FLOAT );
CREATE TABLE test3 #创建表时指定主键,多字段做为主键 ( ID INT , NAME VARCHAR (25), deptID INT , salary FLOAT , PRIMARY KEY(ID, deptID)
);
3、使用外键约束
外键用来在两个表的数据之间建立连接,可以是一列或多列,可以为空值,若不为空值,则每一个外键值必须等于另一个表中主键的某个值。
CREATE TABLE test3 ( ID INT , NAME VARCHAR (25), deptID INT , salary FLOAT , CONSTRAINT id_deptid FOREIGN KEY (deptID)REFERENCES test2(ID) );
#建立一个名为id_deptid的外键约束,外键为deptid,其依赖于表test2中的id
4、使用非空约束、唯一性约束、默认约束
CREATE TABLE test4 ( ID INT NOT NULL UNIQUE, #非空且唯一 NAME VARCHAR (25) NOT NULL, #非空 deptID INT DEFAULT 123, #默认值为123,即若新插入的记录没有deptid则默认为123 salary FLOAT NOT NULL #非空 );
5、设置表的属性值自动增加
一个表只能有一个字段使用自动增加,且这个字段必须是主键的一部分。
CREATE TABLE test5 ( ID INT PRIMARY KEY auto_increment, #id字段会在添加记录时自动增加,默认自增字段id的值从1开始,每增加一条记录,自动加1 NAME VARCHAR (25) NOT NULL, deptID INT DEFAULT 123, salary FLOAT NOT NULL );
6、查看数据表结构
DESCRIBE test5;
7、查看表详细结构
SHOW CREATE TABLE test5;
结果:
CREATE TABLE `test5` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`NAME` varchar(25) NOT NULL,
`deptID` int(11) DEFAULT \’123\’,
`salary` float NOT NULL,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
8、修改数据表
(1)修改表名
ALTER TABLE test5 RENAME re_test5;
(2)修改字段类型
ALTER TABLE re_test5 MODIFY name VARCHAR(30); DESCRIBE re_test5; #查看表询信息
(3)增加字段
ALTER TABLE re_test5 add location VARCHAR(30); #增加无完整性约束条件字段,字段名称location,类型varchar(30) ALTER TABLE re_test5 add location VARCHAR(30) NOT NULL ; #增加有完整性约束条件字段 ALTER TABLE re_test5 add var int(11) FIRST; #在第一列添加一个字段 ALTER TABLE re_test5 add var2 int(11) AFTER name; #在name字段后添加var2字段
(4)修改字段名称
ALTER TABLE re_test5 CHANGE location loc VARCHAR(50); #修改location为loc,数据类型改为varchar(50)
如果只修改字段名称,不需要修改数据类型,则数据类型写为跟之前一样的数据类型,但不能为空。
(5)删除字段
ALTER TABLE re_test5 DROP loc;
(6)修改字段的排列位置
DESCRIBE re_test5; #查看表结构 ALTER TABLE re_test5 MODIFY ID int(11) FIRST; #将id字段放在第一列 ALTER TABLE re_test5 MODIFY location VARCHAR(30) after name; #将location字段放在name字段后面 DESCRIBE re_test5; #查看表结构
(7)删除表的外键约束
ALTER TABLE test3 DROP FOREIGN KEY id_deptid;
9、删除数据表
DROP TABLE if EXISTS test,test2; #删除表test1,test2。if exists用于判断表是否存在,如果表不存在,语句可顺利执行,但会发出警告
表之间存在外键关联的情况时,不能直接删除父表,可先删除子表,再删除父表;若想只删除父表,保留子表,则要将外键约束删除,再删除父表。
三、数据类型和运算符
mysql支持多种数据类型,主要要数值类型、日期/时间类型和字符串类型。
数值类型包括:整数类型TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT、浮点小数类型 FLOAT,DOUBLE、定点小数类型DECIMAL
日期/时间类型包括:YEAR,TIME,DATE,DATETIME,TIMESTAMP
字符串类型包括:CHAR,VARCHAR,BINARY,VARBINARY,BLOB,TEXT,ENUM,SET
1、整数类型
在创建表时,输入的 id int(11),后面的11表示的是该数据类型指定的显示宽度。显示宽度与数据类型的取值范围无关,显示宽度只是指明mysql最大可能显示的数字个数。当数值的位数小于指定宽度时会由空格填充,如果插入的值大于显示宽度,只要该值不超过该类型的取值范围,数值依然可以插入,也可以完整显示。如果不指定数值,则系统为每一种类型指定默认的宽度值。
2、浮点数类型和定点数类型
3、日期与时间类型
4、字符串类型
5、如何选择数据类型
(1)整数和浮点数
如果不需要小数位,则使用整数;反之则用浮点数,要求精度高时使用double。
(2)浮点数和定点数
由于浮点数容易产生误差,在精确度要求高时,用decimal,decimal在mysql中是以字符串存储的,用于定义货币等对精确度要求高的数据。
(3)日期和时间
只录入年份用year,只记录时间用time。同时记录日期和时间,用datetime或timestamp,timestamp的取值范围小于datetime,因此存储范围较大的日期最好使用datetime。
(4)char和carchar
两者的区别:char是固定长度的字符,varchar是可变长度的字符,char会自动删除数据尾部的空格,varchar不会。
char是固定长度,因此处理速度比varchar快,但浪费内存空间。若对速度有要求可使用char。
对于MyISAM引擎,最好使用char;InnoBD引擎,可使用varchar。
(5)enum和set
enum只能取单值,它的数据列表是一个枚举集合,合法取值列表最多允许有65535个成员。因此要从多个值中选一个时,使用enmu。
set可取多个值。它的合法取值列表最多允许有64个成员。在要取多个值时用set。
(6)blob和text
blob是二进制字符串,text是非二进制字符串。blob主要存储图片、音频等信息,text只能存储纯文本信息。
6、常见运算符介绍
(1)算数运算符
CREATE TABLE aa(num int); INSERT into aa VALUE(66); SELECT num,num+10,num*2,num%3 from aa;
(2)比较运算
SELECT 1=0,4>=2,ISNULL(10),5 BETWEEN 10 AND 15,GREATEST(5,2,9),3 in (1,2,3);
like语法:expr like 匹配条件。
like运算符在进行匹配时,可以采用:
%,匹配任何数目的字符,包括零字符;
_,只能匹配一个字符。
SELECT \'d\'LIKE\'def\',\'ghlk\'LIKE\'gh_\',\'adjl\'LIKE\'%l\';
regexp语法:expr regexp 匹配条件
regexp运算符在进行匹配时,可以采用:
^,匹配以该字符后面的字符开头的字符串
$,匹配以该字符前面的字符结尾的字符串
. ,匹配任何一个单字符串
[…],匹配在方括号内的任何字符串,例如[a,b,c]匹配a,b,c。[a-z]匹配任何字母,[0-9]匹配任何数字。
*,匹配零个或多个在它前面的字符。例x*匹配任意数量的x字符,[0-9]*匹配任何数量的数字,.*匹配任何数量的任何字符。
SELECT \'aabbc\' REGEXP\'^a\',\'aabbc\'REGEXP\'c$\',\'aabbc\' REGEXP\'.\',\'asdfgh\' REGEXP \'[ah]\';
(3)逻辑运算符
(4)位运算符
位或:将参与运算的两个数据,按对应的二进制数逐位进行逻辑或运算。
位与:将参与运算的两个数据,按对应的二进制数逐位进行逻辑与运算。
异或:将参与运算的两个数据,按对应的二进制数逐位进行逻辑y异或运算。
位左移:将制定的二进制值的所有位都左移指定的位数,左移之后,左边高位的数值将被移出丢弃,右边低位空出的位置用0补齐。语法为expr<<n,n为移动的位数。例1的二进制0000 0001,左移两位变成0000 0100,对应的是十进制4.。
位右移:方法同位左移。
位取反:将参与运算的数据,按对应的二进制数逐位反转。
(5)运算优先级