启动mysql服务器 net start mysql57
关闭mysql服务器 net stop mysql57
user:root
password:root
进入mysql mysql -u root -p root
一:创建数据库
查看数据库 show databases;
创建数据库 CREATE DATABASE 数据库名;
查看某个数据库结构 SHOW CREATE DATABASE 数据库名\G;
删除数据库 DROP DATABASE 数据库名;
查看当前使用的是哪个数据库 select database();
查看数据库所用的存储引擎 show variables like ‘%storage_engine%’;
查看数据库支持的存储引擎 show engines;
MySQL存储引擎
1.Memory存储引擎
2.InnoDB存储引擎
3.MyISAM存储引擎
4.MEMORY存储引擎等
二:创建数据表
数据表的列(字段),行(记录)
选择在哪个数据库下创建表 use 数据库名;
查看某个数据库下有哪些表 show tables;
创建表 create table 表名(字段名称 数据类型 约束条件 ,…);
创建表时注意事项:
1.要创建表的名称 ,不区分大小写,不能使用sql语言关键字,如DROP.ALTER.INSERT等
2.数据表中每一列(字段)名称和数据类型,如果创建多个列,要用逗号分开
主键约束 数据名称后加 primary key
主键,又称主码,是表中一列或多列的组合,主键约束要求主键列的数据唯一,且不能为空,且同一个表中只能有一个主键
外键:外键首先它是表中的一个字段,它可以不是本表的主键,但对应另外一个表的主键
主表(父表):对于两个具有关联关系的表而言,相关联字段中主键所在的那个表即是主表
从表(子表):对于两个具有关联关系的表而言,相关联字段中外键所在的那个表即是从表
创建外键约束 [constraint <外键名>] foreign key 字段名1[字段名2,…] references <主表名> 主键列1[主键列2,…]
"外建名"为定义的外键约束的名称,一个表中不能有相同名称的外键:“字段名”表示子表需要添加外键约束的字段列,
“主表名”即被子表外键所依赖的表的名称:“主键列”表示主表中定义的主键列
非空约束 not null
唯一性约束 unique
unique 和primary key 区别:
一个表中可以有多个字段声明为unique,但只能有一个primary key
声明:声明为primary key的列不允许有空值,但声明为unique的列可以允许有空值存在
默认约束 default 默认值
设置表的属性值自动增加(一般在id列加) auto_increment
查看数据表基本结构 desc 表名
查看表详细结构 show create table 表名\G;
三:修改数据表
修改表名 alter table 旧表名 rename 新表名
修改字段的数据类型 alter table 表名 modify 字段名 新数据类型;
修改字段名 alter table 表名 change 旧字段名 新字段名 新数据类型;
添加字段 alter table 表名 add 字段名 数据类型 [约束条件] [first|after 已存在字段];
first作用:将该字段添加到表的第一个字段
alter 已存在字段:将该字段添加到指定的已存在字段的后面
删除字段 alter table 表名 drop 字段名;
修改字段的排列顺序 alter table 表名 modify 字段1 数据类型 first|after 字段2;
first:将字段1设置为第一个字段
alter 字段2:将字段1放在字段2后面
更改表的存储引擎: alter table 表名 engine=更改后的存储引擎名;
删除表的外键约束 alter table 表名 drop foreign key 外键约束名;
删除没有关联的表 drop table [if exists] 表1,表2…表n;
删除被其它表关联的主表
数据表之间存在关联的情况下,如果直接删除父表,结果显示失败,原因是直接删除,会破坏表的参照
完整性。如果必须要删除,可以先删除其他关联的子表,再删除父表,只有这样同时删除两个表的数据。
但有的情况下要直接删除父表,保留子表,只需将关联表的外键约束条件取消,就可以删除父表了
删除被其它表关联的主表:先执行删除表的外键约束语句 然后执行删除没有关联的表语句
四.数据类型和运算符
MySQL支持多种数据类型,主要有数值类型.日期/时间类型. 字符串类型
(1)数值类型:整数类型 浮点小数类型float和double 定点小数类型decimal
(2)日期/时间类型:year time date datetime timestamp
(3)字符串类型:主要用的char varchar text
整数类型:
数据类型 说明 存储需求 默认宽度值
tinyint 很小的整数 1个字节 4
smallint 小的整数 2个字节 6
mediumint 中等大小的整数 3个字节 9
int(integer) 普通大小的整数 4个字节 11
bigint 大整数 8个字节 20
浮点数类型和定点数类型
浮点类型和定点类型都可以用(M,N)来表示,其中M为精度,表示总共的位数,N称为标度,是表示
小数的位数
类型名称 说明 存储需求
float 单精度浮点数 4个字节
double 双精度浮点数 8个字节
decimal(M,D),dec 压缩的‘严格’定点数 M+2个字节
在对精度要求较高的时候(如货币,科学数据)使用decimal类型较好
另外连个浮点数进行减法和比较运算时也容易出问题,所以在使用浮点型时注意,避免做浮点数比较
日期与时间类型
类型名称 日期格式 日期范围 存储需求
year YYYY 1901-2155 1字节
time HH:MM:SS -838:59:59-838:59:59 3字节
date YYYY-MM-DD 1000-01-01–9999-12-3 3字节
datetime YYYY-MM-DD HH:MM:SS 1000-01-01 00:00:00–9999-12-31 23:59:59 8字节
timestamp YYYY-MM-DD HH:MM:SS 1970-01-01 00:00:01 UTC–2038-01-19 03:14:07 UTC 4字节
UTC:协调世界时,又称世界统一时间、世界标准时间、国际协调时间
中国大陆、中国香港、中国澳门、中国台湾、蒙古国、新加坡、马来西亚、菲律宾、西澳大利亚州的时间与UTC的时差均为+8,也就是UTC+8
当只记录年信息的时候,可以只使用year类型。当记录年月日时,用date类型
记录时分秒信息的时候,只使用time类型。记录年月日时分秒信息时,用datetime类型
timestamp列取值范围小于datetime取值范围 ,因此存储范围较大日期最好使用datetime
timestamp 有一个datetime不具备的属性,默认情况下,当插入一条记录但并没有指定timestamp这个列值时,mysql会把timestamp
设为当前当前的时间,因此当需要插入记录的同时插入当前时间,使用timestamp类型
timestamp在空间上比datetime更有效
字符串类型
char:固定长度非二进制字符串
varchar:变长非二进制字符串
text:保存非二进制字符串,如文章内容 评论等
五:运算符
算术运算符
加 减 乘 除 求余(%)
比较运算符
大于 小于 等于(=或<=>) 大于等于(>=) 小于等于(<=) 不等于(!=或<>)
以及in between and is null greatest least like regexp
like运算符在进行匹配时,可以使用下面两种通配符:
(1):‘%’匹配任何数目的任意字符,甚至包括零字符
(2):‘_’,匹配任意的一个字符
逻辑运算符
逻辑运算符的求值所得结果均为1(TRUE) 0(FALSE) 这类运算符有逻辑非(not或者!)
逻辑与(and或者&&) 逻辑或(or或者||) 逻辑异或(xor)
如a xor b 的计算等同于(a and (not b))或者((not a) and b)
位操作运算符
位与(&) 位或(|) 位非(~) 位异或(^) 左移(<<) 右移(>>) 6种
位运算将值转为二进制形式
位异或 对应二进制数不同时,对应结果才为1,如果两个对应位数都为0或者1,则对应位的结果为0
位左移
1<<2 1的二进制为0000 0001 左移两位后变成了0000 0100,即十进制整数4
位右移
4>>2 4的二进制0000 0100 右移两位后变成了0000 0001,即十进制整数1
运算符优先级最低 =(赋值运算)
优先级最高 !
六:MySQL函数(常用的函数)
绝对值函数 abs(x) x的绝对值
圆周率函数 pi() 默认显示小数点后6位 3.141593
平方根函数 sqrt(x) 返回非负数x的二次方根
求余函数 mod(x,y) x除以y的余数
获取整数的函数
ceil(x) ceiling(x) 返回不小于x的最小整数值(向上取整)
例:ceil(-2.13) ceiling(-2.13) 返回为 -2
ceil(2.13) ceiling(2.13) 返回为3
floor(x) 返回不大于x的最大整数值(向下取整)
floor(-3.14) floor(3.14)
-4 3
获取随机数的函数 rand()和rand(x)
rand() 产生不同的随机0-1之间的数值
rand(x) 若x相同,产生的随机数值相同
四舍五入函数
round(x) 返回最接近于参数x的整数,对x值进行四舍五入操作
round(x,y) 返回最接近于参数x的数,其值保留到小数点后面y位,若y为负值,则保留x值到小数点左边y位
例如:round(238.38,-1) 230 round(238.38,-2) 200
七:查询数据
查询所有字段 select * from 表名
查询指定字段 select 字段名1,字段名2,… from 表名
查询指定记录 select 字段名1,字段名2,… from 表名 where 查询条件
带in 关键字的查询
例如查询id 为101,102的值 id不是101,102的值
…where id in (101,102) …where id not in (101,102)
带between and的范围查询
例如查询水果价格在2.00到10.00之间的值
…where price between 2.00 and 10.00
between and 也可加not,表示不在该范围内的值 not between and
带like的字符匹配查询
和like一起使用的通配符
1.‘%’ 匹配任意长度的任意字符,甚至包括零字符
2.‘_’ 匹配任意一个字符
查询空值或非空值
…where 字段名 is null …where 字段名 not is null
带and的多条件查询
…where 查询条件1 and 查询条件2… 可以加多个查询条件
带or的多条件查询
…where 查询条件1 or 查询条件2… 可以加多个查询条件
查询结果不重复
select distinct 字段名 from 表名
对查询结果排序
升序排列
order by 排序条件1,排序条件2,…
降序排列(desc)
order by 排序条件1,排序条件2,…desc
分组查询
1.创建分组
group by
2.使用having过滤分组
例如根据s_id对fruits 表进行分组,并显示水果种类大于1的分组信息
select s_id,f_name from fruits group by s_id having count(f_name)>1;
3.在group by子句中使用with rollup
使用with rollup关键字之后,在所有查询出的分组记录之后增加一条记录,该记录计算查询出的所有记录总和,即统计记录数量
例如 根据s_id对fruits 表中的数据进行分组,并显示记录数量
select s_id,count(*) as total from fruits group by s_id with rollup;
s_id total
101 3
102 3
103 2
… …
4.多字段分组
group by 字段1,字段2,…
分组层次从左到右,即先按第一个字段分段,然后在第一个字段值相同的记录中,再按第2个字段分组
5.group by和order by一起使用
…group by 字段 order by 字段
使用limit限制查询结果数量
例如显示fruits表查询结果的前4行
select * from fruits limit 4;
…limit 4,10 从第5行开始,往后面查找10行
使用集合函数查询
count()函数 统计数据表中包含的记录行的总数
count(*) 计算表中总的行数,不管某列是否有数值或者为空
count(字段名) 计算指定列下的总的行数,计算时将忽略空值的行
sum()函数 是一个求总和的函数,返回指定列值得总和
sum()函数可以与gruop by一起使用,来计算每个分组的和
avg()函数 通过计算返回的行数和每一行的数据的行,求得指定列数据的平均值
max()函数 返回指定列的最大值
min()函数 返回指定列的最小值
连接查询
内连接查询1:SELECT suppliers.s_id,s_name,f_name,f_price FROM fruits,suppliers WHERE fruits.s_id=suppliers.s_id
因为fruits和suppliers表中有相同的字段s_id,因此在比较的时候,需要完全限定表名(格式为‘表名.列名’)
如果只给出s_id,MySQL将不知道指的是哪一个,并返回错误信息
内连接查询2:SELECT suppliers.s_id,s_name,f_name,f_price FROM fruits INNER JOIN suppliers ON fruits.s_id=suppliers.s_id
在这里的查询语句中,两个表之间的关系通过INNER JOIN指定,使用这种语法的时候,连接的条件使用ON子句而不是WHERE,ON和WHERE
后面指定的条件相同
外连接查询
LEFT JOIN(左连接):返回左表中的所有记录和左表中连接字段相等的记录
RIGHT JOIN(右连接):返回包括右表中的所有记录和右表中连接字段相等的记录
INNER JOIN(内连接):返回左表和右表中连接字段相等的记录
为表取别名: 表名 AS 表别名
为字段取别名:字段名 AS 字段别名
使用正则表达式查询
查询以特定字符或字符串开头的记录 字符‘^’匹配以特定字符或者字符串开头的文本
SELECT * FROM fruits WHERE f_name REGEXP ‘^be’
查询f_name字段以’be’开头的记录
查询以特定字符或字符串结尾的记录 字符’′匹配以特定字符或字符串结尾的文本SELECT∗FROMfruitsWHEREfnameREGEXP′rry
′
匹配以特定字符或字符串结尾的文本SELECT∗FROMfruitsWHEREf
n
ameREGEXP
′
rry’;
查询f_name字段以字符串‘rry’结尾的记录
使用‘*’和‘+’来匹配多个字符
匹配前一个字符0次或者无限次
匹配前一个字符1次或者无限次
使用‘.’来代替字符串中的任意一个字符
匹配指定字符串
正则表达式可以匹配指定字符串,只要这个字符串在查询文本中即可,如要匹配多个字符串,
多个字符串之间可以用分隔符‘|’隔开
例如查询字段值中包含字符串‘on’或‘ap’的记录
SELECT * FROM fruits WHERE f_name REGEXP ‘on|ap’
匹配指定字符中的任意一个
方括号‘[]’指定一个字符集合,只匹配其中任何一个字符,即为所查文本
例如查找f_name字段中包含字母‘o’或者‘t’或者两者都包含的记录
SELECT * FROM fruits WHERE f_name REGEXP ‘[ot]’
匹配指定字符以外的字符
'[^字符集合]'匹配不在指定集合中的任何字符
例如查询f_id字段包含ae和数字12以外的字符的记录
SELECT * FROM fruits WHERE f_id REGEXP ‘[^a-e1-2]’
使用{n,}或者{n,m}来指定字符串连续出现的次数
‘字符串{n}’表示匹配n次前面的字符
‘字符串{n,}’表示至少匹配n次前面的字符,多则不限
‘字符串{n,m}’表示至少匹配n次前面的字符,不超过m次
查询注意事项:
1.DISTINCT可以应用于所有列吗?
在使用MySQL时,有时需要查询出某个字段不重复的记录,这时可以使用mysql提供的distinct这个关键字来过滤重复的记录
查询结果中,如果需要对列进行降序排序,可以使用DESC,这个关键字只能对其前面的列进行降序排列
例如,要对多列都进行降序排列,必须要在每一列的列名后面加DESC关键字。而DISTINCT不同,DISTINCT不能部分使用。换句话说,DISTINCT
关键字应用于所有列而不仅仅是它后面的第一个指定列。例如,查询3个字段s_id,f_name,f_price,如果
不同记录的这3个字段的组合值都不同,则所有记录都会被查询出来
2.ORDER BY 可以和LIMIT混合使用吗?
在使用ORDER BY子句时,应保证其位于FROM子句之后,如果使用LIMIT,则必须位于ORDER BY之后
如果子句顺序不正确,MySQL将产生错误消息
3.什么时候使用引号?
在查询的时候,会看到WHERE子句使用条件,有的值加上了单引号,而有的值未加,单引号用来限定
字符串,如果将值与字符串类型列进行比较,则需要限定引号,而用来与数值进行比较则不需要用引号
4.在WHERE子句中必须使用圆括号吗?
任何时候使用具有AND和OR操作符的WHERE子句,都应该使用圆括号明确操作顺序。如果条件较多,即使
能确定计算次序,默认的计算次序也可能会使SQL语句不易理解,因此使用圆括号明确操作符的次序,是一个
好习惯
5.为什么使用通配符格式正确,却没有查找出符合条件的记录?
MySQL中存储字符串数据时,可能不小心把两端带有空格的字符串保存到记录中,而在查看表中记录时
MySQL不能明确显示空格,数据库操作者不能直观的确定字符串两端是否有空格。例如,使用LIKE‘%e’
匹配以字母e结尾的水果的名称,如果字母e后面多了一个空格,则LIKE语句不能将该记录查找出来,解决
方法使用TRIM函数,将字符串两端的空格删除之后在进行匹配
八:插入 更新与删除数据
插入数据
为表的所有字段插入数据
INSERT INTO 表名(字段名1,字段名2,…) VALUES(值1,值2,…)
为表的某一字段插入多行
INSERT INTO 表名(字段名) VALUES(值1),(值2),…
将查询结果插入到表中
INSERT INTO 表名(字段名) SELECT 字段名 FROM 表名 WHERE 查询条件
更新数据
在person表中,更新id值为10记录,将age字段值改为15,将name字段值改为LiMing
UPDATE person SET age=15,name=‘LiMing’ WHERE id=10;
注意:保证UPDATE以WHERE子句结束,通过WHERE子句指定被更新的记录所需要满足的条件,如果忽略WHERE子句,MySQL将更新
表中所有行
删除数据
DELECT FROM 表名 WHERE 删除条件
注意:WHERE指定删除条件,如果没有WHERE子句将删除表中的所有记录
注意事项:
1.插入记录时可以不指定字段名称吗?
不管哪种INSERT语法,都必须给出VALUES正确数目。如果不提供字段名,则必须给每个字段提供
一个值,否则将产生一条错误消息。如果要在INSERT操作中省略某些字段,这些字段需要满足一定
条件,将该列定义为允许空值:或者定义时给出默认值,如果不给出值,将使用默认值
2.更新或者删除表时必须指定WHERE子句吗?
WHERE子句后跟着删除条件,如果省略WHERE子句,则UPDATE或DELECT将被应用于表中所有行
九:索引
作用:提高数据库的查询速度
1.创建普通索引:
最基本的索引类型,没有唯一性之类的限制,其作用只是加快对数据的访问速度
例如在book表中的year_publication字段上建立普通索引
CREATE TABLE book(
…
INDEX(year_publication)
);
2.创建唯一索引
它与普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的
组合必须唯一
例如:创建一个表t1,在表中的id字段上使用UNIQUE关键字创建唯一索引
CREATE TABLE t1(
…
UNIQUE INDEX UniqIdx(id)
);
3.创建单列索引
单列索引实在数据表中的某一个字段上创建的索引,一个表中可以创建多个单列索引
例如:创建一个表t2,在表中的name字段上创建单列索引
CREATE TABLE t2(
…
INDEX SingleIdx(name(20))
);
4.创建组合索引
组合索引是在多个字段上创建一个索引
例如:创建表t3,在表中的id name age字段上建立组合索引
CREATE TABLE t3(
…
INDEX MultiIdx(id,name,age(100))
);
删除索引:
使用ALTER TABLE删除索引
ALTER TABLE 表名 DROP INDEX 索引名字
或
DROP INDEX 索引名称 ON 表名
添加AUTO_INCREMENT约束字段的唯一索引不能删除