改编于以下文章 1、138 张图带你 MySQL 入门 --> cxuan哥
MySQL 和 SQL的区别
MySQL 是一种关系型数据库,说到关系,那么就离不开表与表之间的关系,而最能体现这种关系的其实就是我们接下来需要介绍的主角 SQL,SQL 的全称是 Structure Query Language ,结构化的查询语言,它是一种针对表关联关系所设计的一门语言,也就是说,学好 MySQL,SQL 是基础和重中之重。SQL 不只是 MySQL 中特有的一门语言,大多数关系型数据库都支持这门语言。
SQL语言分类
数据定义语言:简称 DDL (Data Definition Language),用来定义数据库对象:数据库、表、列等; 数据操作语言:简称 DML (Data Manipulation Language),用来对数据库中表的记录进行更新。关键字:insert、update、delete等 数据控制语言:简称 DCL(Data Control Language),用来定义数据库访问权限和安全级别,创建用户等。关键字:grant等 数据查询语言:简称 DQL(Data Query Language),用来查询数据库中表的记录,关键字:select from where等
DDL 语句
数据库操作 命令 备注 连接数据库 mysql -h主机地址 -p端口 -u用户名 -p用户密码 修改密码 mysqladmin -uroot -p123456 password 12345678; 创建数据库 create database dbname; 查看已有的数据库 show databases 选择数据库 use dbname 删除数据库 drop database dbname;
表操作 命令 备注 显示库下的所有表 show tables; 必须先use,在show 创建表 create table job(name varchar(20)); 查看创建语句sql show create table job \G; 删除表 drop table job 通过日志可以恢复 删除表 truncate table job 不可恢复 修改字段类型 alter table job modify name varchar(25); 以下都可以通过 Navicat来生成修改SQL 增加字段 alter table job add home varchar(30); 删除字段 alter table job drop column home; 修改字段名称 alter table job change wage salary decimal(10,2); 修改字段顺序 alter table job add birthday after hiredate;
unsigned: 设置为无符号化 NOT NULL: 不为空 AUTO_INCREMENT: 自增长 必须给主键设置 COLLATE:跳转 primary key :主键唯一标示(自带唯一属性,not null属性)一个表中必须有的,一般都是数字自增 unique key:唯一 设置 某个列 的值都是唯一的,也就是没用重复,如 身份证号,一般是唯一的 default:默认值 DEFAULT CURRENT_TIMESTAMP:表示当插入数据的时候,该字段默认值为当前时间 ON UPDATE CURRENT_TIMESTAMP:表示每次更新这条数据的时候,该字段都会更新成当前时间 zerofill:不够使用0进行填充
DML 语句
操作 命令 备注 插入 INSERT INTO tablename (field1,field2) VALUES(value1,value2); 针对批量操作减少了网络开销 修改 UPDATE tablename SET field1 = value1, field2 = value2 ; 不加where条件,会对整个表进行更新 删除 DELETE FROM tablename [WHERE CONDITION]; 不加where条件,清除整个表
DQL 语句
SELECT * FROM tablename;
select name, sex, age, hiredate, birthday, salary from job;
操作 命令 备注 查看版本号 select version(); 去重 select distinct age from job; 条件查询 select * from job where age = 24; 「>、<、>=、<=、!=」 排序 select * from job order by A desc,B ase; A值相同按照B值排序,A字段多个相同的记录将会无序排列 限制 select * from job order by salary limit 3; 默认从第0条抓取 求和 select sum(salary) from job; 汇总函数 统计数量 select count(1) from job; 最大值 select max(salary) from job; 最小值 select min(salary) from job; 分组 select age,count(1) from job group by age; select age,count(1) from job group by age with rollup; 统计各年龄段的人数并统计总人数 select age,count(1) from job group by age with rollup having count(1) > 1; 分组,统计数量大于 1 的记录 表连接 select job.name,job_type.name from job,job_type where job.type = job_type.type; 内连接:选出两张表中互相匹配的记录; 左连接 select job.name,job_type.name from job left join job_type on job.type = job_type.type; 外连接:不仅选出匹配的记录,也会选出不匹配的记录; 右连接 select job.name,job_type.name from job right join job_type on job.type = job_type.type; 子查询 select job.* from job where type in (select type from job_type); select * from job where type = (select type from job_type); 如果子查询数量唯一的话,还可以用 = 来替换 in 联合查询 select type from job union all select type from job_type; select type from job union select type from job_type; union 会对合并的数据进行去重处理
DCL 语句
遗留问题
create user zhangsan@'192.%.%.%' identified by 'zhangsan' ;
grant select on zhangsanDb. * to zhangsan;
flush privileges ;
REVOKE insert , update ON * . * FROM 'local_user' @'%' ;
MySQL数据类型
整数类型 字节 最小值 最大值 运用场景 tinyint 1 有符号 -128 无符号 0 有符号 127 无符号 255 smallint 2 有符号 -2^16 无符号 0 有符号 2^15-1 无符号 2^16-1 mediumint 3 有符号 -2^24 无符号 0 有符号 2^23-1 无符号 2^24-1 int,integer 4 有符号 -2^32 无符号 0 有符号 2^31-1 无符号 2^32-1 bigint 8 有符号 -2^64 无符号 0 有符号 2^63-1 无符号 2^64-1
int(7)表示int类型的最大长度为7,如果不指定默认是int(11) alter table test1 modify aId int zerofill; zerofill表示数字位数不够用0填充,如果一个列为 zerofill ,会自动为该列添加 UNSIGNED (无符号)属性。
浮点数类型 字节 最小值 最大值 运用场景 float 4 double 8
定点数类型 字节 描述 运用场景 dec(M,d) decimal(M,d) M+2 最大取值范围与double相同,给定decimal的有效取值范围由M和D决定
定点数只有一种 decimal。定点数在 MySQL 内部中以字符串的形式存在,比浮点数更为准确,适合用来表示精度特别高的数据。 浮点数和定点数都可以使用 (M,D) 的方式来表示,M 表示的就是 「整数位 + 小数位」 的数字,D 表示位于 . 后面的小数。M 也被称为精度 ,D 被称为标度。 浮点数如果不写精度和标度,会按照实际的精度值进行显示 定点数如果不写精度和标度,会按照 decimal(10,0) 来进行操作,如果数据超过了精度和标题,MySQL 会报错
位类型 字节 最小值 最大值 运用场景 bit(M) 1~8 bit(1) bit(64)
日期时间类型 日期格式 日期范围 占用空间 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字节
DATE 的表示一般很多种,如下所示 DATE 的所有形式
‘YYYY-MM-DD’ ‘YYYYMMDD’ YYYYMMDD ‘YY-MM-DD’ ‘YYMMDD’ YYMMDD
各个时间类型的使用场景
一般表示年月日,通常用 DATE 类型; 用来表示时分秒,通常用 TIME 表示; 年月日时分秒 ,通常用 DATETIME 来表示; TIMESTAMP 不建议使用
,日期范围马上到期,它把客户端插入的时间从当前时区转化为UTC(世界标准时间)进行存储。查询时,将其又转化为客户端当前时区进行返回 如果只表示年份、则应该使用 YEAR,它比 DATE 类型需要更小的空间。
MySQL运算符
算数运算符 作用 + 加法 - 减法 * 乘法 / 除法 % 除法取余 div 除法取整(只能用整数) mod 除法取余(只能用整数)
在除法和取余需要注意一点,如果除数是 0 ,将是非法除数,返回结果为 NULL。
比较运算符 作用 = 等于 <> 或者是 != <=> NULL 安全的等于,也就是NULL-safe < 小于 <= 小于等于 > 大于 >= 大于等于 between 在指定范围内 is null 是否为NULL is not null 是否为NULL in 存在于指定集合 like 通配符匹配 regexp 或 rlike 正则表达式匹配
逻辑运算符 作用 not 或 ! 逻辑非 and 或 && 逻辑与 or 或 || 逻辑或 xor 逻辑异或
位运算符 作用 & 位与 | 位或 ^ 位异或 ~ 位取反 >> 位右移 << 位左移
MySQL常用函数
字符串函数 功能 lower 将字符串所有字符变成小写 upper 将字符串所有字符变成大写 concat 进行字符串拼接 left 返回字符串最左边的字符 right 返回字符串最右边的字符 insert 字符串替换 ltrim 去掉字符串左边的空格 rtrim 去掉字符串右边的空格 repeat 返回重复的结果 trim 去掉字符串行尾和行头的空格 substring 返回指定的字符串 lpad 用字符串对最左边进行填充 rpad 用字符串对最右边进行填充 rpad 将字符串所有字符变成小写 strcmp 比较字符串S1 和 S2 replace 进行字符串替换
数值函数 功能 abs 返回绝对值 ceil 返回大于某个值的最大整数值 mod 返回模 round 四舍五入 floor 返回小于某个值的最大整数值 truncate 返回数字截断小数的结果 rand 返回0-1的随机数
日期和时间函数 功能 now 返回当前的日期和时间 week 返回一年中的第几周 year 返回日期的年份 hour 返回小数值 minute 返回分钟值 monthname 返回月份名 curdate 返回当前日期 curtime 返回当前时间 unix_timestamp 返回日期unix时间戳 date_format 返回按照字符串格式化的日期 from_unixtime 返回unix时间错的日期值 date_add 返回日期时间+上一个时间间隔 datediff 返回起始时间和结束时间之间的天数
流程函数 功能 IF(value,t f) 如果 value 是真,返回 t;否则返回 f IFNULL(value1,value2) 如果 value1 不为 NULL,返回 value1,否则返回 value2。 CASE WHEN[value1] THEN[result1] …ELSE[default] END 如果 value1 是真,返回 result1,否则返回 default CASE[expr] WHEN[value1] THEN [result1]… ELSE[default] END 如果 expr 等于 value1, 返回 result1, 否则返回 default
其他函数 功能 version 返回当前数据库的版本 database 返回当前数据库名 user 返回当前登录用户名 password 返回字符串的加密版本 MD5 返回MD5值 inet_aton(ip) 返回IP地址的数字表示 inet_ntoa(num) 返回数字代表的ip地址