MySQL

关注公众号“轻松学编程”了解更多。

MySQL是关系型数据库,对大小写不敏感。

MySQL属于关系型数据库

优点:

  • 复杂查询
  • 可以用SQL语句方便的在一个表以及多个表之间做非常复杂的数据查询。
  • 事务支持
  • 使得对于安全性能很高的数据访问要求得以实现。

缺点

  • 开发维护成本高
  • 刻板、欠灵活、存储空间大
  • 低访问速度
  • 可扩展性差

一、常用数据类型

1、数值型

1.1 整型

int或integer:占4字节(一个字节8位),可以表示的范围:-232到+232(40多亿)。

bigint,占8字节,

1.2 浮点

float:占4字节,可以表示6到7位小数。

double:占8字节,可以表示15到16位小数。

类型

大小

范围(有符号)

范围(无符号)

用途

TINYINT

1 字节

(-128,127)

(0,255)

小整数值

SMALLINT

2 字节

(-32 768,32 767)

(0,65 535)

大整数值

MEDIUMINT

3 字节

(-8 388 608,8 388 607)

(0,16 777 215)

大整数值

INT或INTEGER

4 字节

(-2 147 483 648,2 147 483 647)

(0,4 294 967 295)

大整数值

BIGINT

8 字节

(-9 233 372 036 854 775 808,9 223 372 036 854 775 807)

(0,18 446 744 073 709 551 615)

极大整数值

FLOAT

4 字节

(-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38)

0,(1.175 494 351 E-38,3.402 823 466 E+38)

单精度浮点数值

DOUBLE

8 字节

(-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)

0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)

双精度浮点数值

DECIMAL

对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2

依赖于M和D的值

依赖于M和D的值

小数值

2、字符串型

2.1 字符串

char:占1字节,最多表示256个字节。定长。利于索引,但由于定长所以有时会导致磁盘空间浪费。

varchar:不定长,最多表示65536个字节,由于不定长所以不利于索引,可以节省空间。

######2.2 大字符串

text:表示范围0-65 535字节,一般用来保存一篇博文或短文。

longtext:表示范围40亿字节+,一般用来保存小说等。

类型

大小

用途

CHAR

0-255字节

定长字符串

VARCHAR

0-65535 字节

变长字符串

TINYBLOB

0-255字节

不超过 255 个字符的二进制字符串

TINYTEXT

0-255字节

短文本字符串

BLOB

0-65 535字节

二进制形式的长文本数据

TEXT

0-65 535字节

长文本数据

MEDIUMBLOB

0-16 777 215字节

二进制形式的中等长度文本数据

MEDIUMTEXT

0-16 777 215字节

中等长度文本数据

LONGBLOB

0-4 294 967 295字节

二进制形式的极大文本数据

LONGTEXT

0-4 294 967 295字节

极大文本数据

二进制文本:blob,最多65535字节,longblob最大存储字节达到40亿+,理论上可以存大文件的原始字节,可以用来存放一部电影。

3、时间日期

类型

大小(字节)

范围

格式

用途

DATE

3

1000-01-01/9999-12-31

YYYY-MM-DD

日期值

TIME

3

‘-838:59:59’/‘838:59:59’

HH:MM:SS

时间值或持续时间

YEAR

1

1901/2155

YYYY

年份值

DATETIME

8

1000-01-01 00:00:00/9999-12-31 23:59:59

YYYY-MM-DD HH:MM:SS

混合日期和时间值

TIMESTAMP

4

1970-01-01 00:00:00/2038结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07

YYYYMMDD

标准日期写法:20170901。

标准日期时间写法:20170901095200。

二、增删改查

MySQL对大小写不敏感。

1、登录数据库

打开cmd.exe输入(要设置环境变量:加入mysql.exe的路径):

mysql -u root -p

然后输入在安装MySQL时设置的密码。

2、显示数据库

show databases;

mysql增删改查语法_字符串

3、创建数据库

create database china charset=utf8;

mysql增删改查语法_字段名_02

4、使用数据库

use china;

mysql增删改查语法_mysql_03

5、创建表

#创建省份表
create table t_provinces(proId int primary key auto_increment,
proName varchar(50) not null ,ProSort int,ProRemark nvarchar(50));
#创建城市表
create table t_citys(cityId int primary key auto_increment,
cityName varchar(50) not null,proId int,citySort int);
#创建县区表
create table t_districts(id int primary key auto_increment,
disName varchar(30) not null,cityId int,disSort int);

6、查看所有表

show tables;

mysql增删改查语法_字段名_04

7、显示表结构

desc t_provinces;

mysql增删改查语法_mysql_05

8、增加表记录

insert into t_provinces(proName,proSort,proRemark) 
values('北京市','1','直辖市');

9、查看表所有记录

select * from t_provinces;

mysql增删改查语法_MySQl_06

9、修改表记录

update t_provinces set proName = '天津市' ,proSort = 2 where proId = 1;

mysql增删改查语法_mysql_07

10、修改表结构

10.1 增加字段

alter table 表名 add 字段名 字段类型 字段约束。

alter table t_provinces add nickName varchar(20) null;

mysql增删改查语法_mysql_08

10.2 修改字段名

alter table 表名 change 旧字段名 新字段名 新类型 新约束。

alter table t_provinces change nickName shortName varchar(10) null;

mysql增删改查语法_MySQl_09

10.3 修改字段类型/约束

alter table 表名 modify 字段名 新的类型 新的约束。

alter table t_provinces modify shortName char;
10.4 删除字段
alter table t_provinces drop shortName;

mysql增删改查语法_字段名_10

11、删除

删除数据库:drop database 数据库名;

删除表:drop table 表名;

删除表记录:delete from 表名 where 条件。

上面的是物理删除,即一旦删除就没有了,实际上一般用逻辑删除,即添加一个字段isDelete(值为0或1),0表示不删除,1表示删除,以此达到删除的目的,在数据库中仍然保留数据。

三、字段约束

1、主键:PRIMARY KEY

#主键是唯一不重复的,一般与自增auto_increment一起用
create table t_provinces(proId int primary key auto_increment);

2、自增:AUTO_INCREMENT

#从1开始,每增加一条记录,绑定该约束的的字段会自增1
create table t_provinces(proId int primary key auto_increment);
#proId在增加记录时会自加1

3、非空:NOT NULL

#在增加记录时,绑定该字段后,该字段必须填值
insert into t_provinces(proName) values('北京市');
#在创建表时,proName设置了not null

4、默认:DEFAULT

#可以设置default 0 ,当增加记录时,绑定该约束的字段如果没给值,则给默认值0
create table school(id int primary key auto_increment,
name varchar(30),openTime datetime default 20180319090000);

mysql增删改查语法_mysql_11

5、唯一:UNIQUE

#值不可重复
alter table school modify name varchar(20) not null unique;

四、查询

1、order by

按照字段名对查询结果进行排序

#ORDER BY 字段名 ASC 升序
SELECT * FROM t_citys ORDER BY proid ASC;
#ORDER BY 字段名 DESC 升序
SELECT * FROM t_citys ORDER BY proid DESC;

2、limit

取前若干条记录

selext * from t_citys limit 3;

mysql增删改查语法_字段名_12

3、like

字段名 like ‘%某字符串%’ :判断字段名中的值是否包含某字符串。‘%’表示可变字符。

select * from t_citys where cityName like '%名%';
select * from t_citys where cityName like '石%';
select * from t_citys where cityName like '%京市';

mysql增删改查语法_字符串_13

4、逻辑运算符(in,and,or,between)

in:判断结果是否落在指定范围内

#把proid的值是1或2时的记录查询出来
SELECT * FROM t_citys WHERE proId IN (1,2);

mysql增删改查语法_字段名_14

and:与

SELECT * FROM t_citys WHERE proId > 1 AND proId < 3;

or:或

SELECT * FROM t_citys WHERE proId = 1 or proId = 3;

between 值1 and 值2:在 值1与 值2之间

SELECT * FROM t_citys WHERE proId between 1 and 3;

5、group by

group by 字段名:按照字段名进行分组。对分组的结果进行统计筛选,一般用来计数、求最大\小值、平均值。

having:分组后的筛选条件

where:是分组前的条件筛选

#查找城市数量大于17的省份
SELECT tp.proname ,temp.qty AS ccityQty
FROM(
SELECT proid, COUNT(cityid) qty
FROM t_citys
GROUP BY proid
HAVING qty>17
) temp JOIN T_Provinces tp
ON temp.proid = tp.proid;

mysql增删改查语法_mysql_15

6、数据库函数

count(col) :计算col中的记录数;

max(col),min(col):求col中的最大值和最小值;

avg(col):求col中的平均值;

sum(col):求和。

#求每个省中的城市数量:先以省份proid分组,然后分别计算每组中有多少个cityid。
SELECT COUNT(cityid) FROM t_citys GROUP BY proid LIMIT 4;

mysql增删改查语法_mysql_16

SELECT max(cityid) FROM t_citys GROUP BY proid;
#查找拥有最多城市的省份
SELECT tp.proname ,temp.qty AS ccityQty_max
FROM
(
SELECT proid, COUNT(cityid) qty
FROM t_citys
GROUP BY proid
) temp JOIN T_Provinces tp
ON temp.proid = tp.proid
WHERE temp.qty = (
SELECT COUNT(cityid) qty
FROM t_citys
GROUP BY proid
ORDER BY qty DESC
LIMIT 1
);
#字段名1 as 字段名2:意思是字段名1的别名为字段名2。注:as 可以省略
#join在下面有讲到

mysql增删改查语法_mysql_17

五、多表联合查询

1、union

子表A union 子表B:整合字段数量相同的子查询。

#把表A查询出的结果好表B查询出的结果整合到一张表中
SELECT proid FROM t_provinces WHERE proid<3
UNION
SELECT cityname FROM t_citys WHERE proid<3 ;

mysql增删改查语法_MySQl_18

2、join

2.1 A (inner) join() B

内连接:求两个表的交集,inner可省略。

#通过proid来查找t_provinces和t_citys的交集
SELECT tp.proname,tc.CityName FROM t_provinces tp
JOIN
t_citys tc
ON tc.proid=tp.ProID
WHERE tc.proid < 3;

mysql增删改查语法_字符串_19

2.2 A left join() B

左连接LEFT JOIN的含义就是求两个表的交集外加左表剩下的数据。

2.3 A right join() B

右连接RIGHT JOIN就是求两个表的交集外加右表剩下的数据。

#查找广东省茂名市所有县区
SELECT * FROM(
SELECT tc.cityid,tp.proname,tc.cityname FROM t_provinces tp
JOIN
t_citys tc
ON tp.proid = tc.proid
WHERE ProName="广东省"
) temp
JOIN
t_districts td
ON temp.cityid = td.cityid
WHERE temp.cityname = "茂名市";

mysql增删改查语法_字段名_20

六、允许远程主机连接本地Mysql服务器

打开命令窗口,输入:

#123456为mysql密码
mysql -u root -p123456
>>>use mysql;
>>>update user set host='%' where user='root';
>>>flush privileges;

版本5.7以后

mysql -u root -p123456
>>>use mysql;
>>>GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123' WITH GRANT OPTION;
>>>flush privileges;

后记

【后记】为了让大家能够轻松学编程,我创建了一个公众号【轻松学编程】,里面有让你快速学会编程的文章,当然也有一些干货提高你的编程水平,也有一些编程项目适合做一些课程设计等课题。


mysql增删改查语法_mysql_21


关注我,我们一起成长~~