Mysql|Mysql数据库 基本语法


文章目录

  • 写在前面
  • 数据库基本操作
  • Mysql数据类型
    • 整数类型
      • 指定宽度
      • `zerofill` 和 `unsigned`
      • `auto_increment`
    • 浮点数和定点数类型
    • 日期和时间类型
    • 字符串类型
  • Mysql运算符
  • DDL-数据定义语言(create,alter,drop)
    • 创建数据表
    • 查看数据表
    • 修改数据表
    • 删除数据表
  • DML-数据操纵语言(select,delete,update,insert)
    • 记录
      • 插入记录
      • 更新记录
      • 查看记录
      • 删除记录
      • 排序 `order by`
      • 限制记录数 `limit`:分页
      • 聚合:`函数:count():记录数 / sum(总和); / max():最大值 / min():最小值`
      • `group by`分组:
      • `having` 对分组结果二次过滤:
      • `with rollup` 对分组结果二次汇总
      • 子查询
      • `union`记录联合
  • DCL-数据控制语言 (grant, revoke)
    • 添加权限
    • 回收权限

写在前面 服务开启停止
#管理员身份下cmd
net start/stop mysql

数据库链接
mysql -h 127.0.0.1 -u root -p #-h 127.0.0.1默认

常用参数
-A 不预读数据库信息,提高连接和切换数据库速度,使用--disable-auto-rehash代替 --default-character-set使用的默认字符集 -e 执行命令并退出 -h 主机地址 -p 连接到服务器时使用的密码 -P 连接的端口号

相关文件夹
【Mysql|Mysql数据库 基本语法】bin目录下保存了MySQL常用的命令工具以及管理工具、data目录是MySQL默认用来保存数据文件以及日志文件的地方、docs目录下是MySQL的帮助文档、include目录和lib目录是MySQL所依赖的头文件以及库文件、share目录下保存目录文件以及日志文件。
数据库基本操作 创建数据库
create database name;

创建数据库后查看该数据库基本信息MySQL命令:
show create database name;

删除数据库
drop database name;

切换数据库
use name;

查看当前使用的数据库 MySQL命令:
select database();

Mysql数据类型 整数类型 Mysql|Mysql数据库 基本语法
文章图片

指定宽度
create table t1 (id int , id int(5)) //INT(4)与INT(5),括号中的字符表示显示宽度,整数列的显示宽度与MySQL需要用多少个字符来显示该列数值,与该整数需要的存储空间的大小都没有关系,它们在数据库里面存储的都是4个字节的长度。

zerofillunsigned
zerofill采用零填充,不足5位采用0填充,配合数据宽度
create table t2 (id int , id2 int(5) zerofill); create table t3 (id int , id2 int(5) unsigned);

auto_increment
只用于整数类型
产生唯一标识
值从1开始,逐行增加
一个表中最多只能存在一个自增列
自增列应该定义为not null
自增列应该这只为 primary key 或者 unique
id int not null auto_increment primary key

浮点数和定点数类型 浮点数类型
Mysql|Mysql数据库 基本语法
文章图片

定点数类型
Mysql|Mysql数据库 基本语法
文章图片

float , double , decimal 特点:
1.(m,d)表示方式:m指的是整数位,d指的是小数位(又称作精度和标度)
2.float/double四舍五入丢失精度,decimal会截断数据并输出warning
3.如果不指定精度,float/double采用操作系统默认,decimal则是(10,0)
位类型
Mysql|Mysql数据库 基本语法
文章图片

1 存放位字段值
2 指定存放多位二进制的长度,默认为1(范围:1~64)
3 读取需要bin()/hex(),普通的select读取结果为null
4 插入的值会转化为二进制码,如果长度运行则正常处理,否则插入失败
create table t6 (id bit(1)); select bin(id) from t6;

日期和时间类型 Mysql|Mysql数据库 基本语法
文章图片

当前系统日期
timestamp:返回yyyy-mm-dd hh:mm:ss 宽度19timestamp:不适合存放久远日期,超出范围则会采用零值填充//不同格式的显示零值格式 d date, t time,dt datetime +------------+----------+---------------------+ | d| t| dt| +------------+----------+---------------------+ | 2016-11-25 | 14:52:44 | 2016-11-25 14:52:44 | +------------+----------+---------------------+//默认值的体现 id1 timestamp +---------------------+ | id1| +---------------------+ | 2016-11-25 14:55:45 | +---------------------+//timestamp字段只能有一个"CURRENT_TIMESTAMP" +-------+-----------+------+-----+---------------------+-----------------------------+ | Field | Type| Null | Key | Default| Extra| +-------+-----------+------+-----+---------------------+-----------------------------+ | id1| timestamp | NO|| CURRENT_TIMESTAMP| on update CURRENT_TIMESTAMP | | id2| timestamp | NO|| 0000-00-00 00:00:00 || +-------+-----------+------+-----+---------------------+-----------------------------+//timestamp和时区相关:SYSTEM 指的是和主机时区保持一致 show variables like "%_zone"; +------------------+--------+ | Variable_name| Value| +------------------+--------+ | system_time_zone | CST| | time_zone| SYSTEM | +------------------+--------+//修改时区 set time_zone="+9:00"/在 [mysqld] 之下加 default-time-zone=timezone

年份
year:默认为4位格式.1901~2155和0000. 2位的已经不推荐,高版本已经不支持了.

timestamp和datetime区别:
1、timestamp支持范围小(1970-01-01 08:00:01到2038年某个点)
2、表中第一个timestamp字段,会默认采用当前系统时间.如果更新其他字段,该字段没有赋值的话,则该字段会自动更新.如果指定字段不满足规格,则采用零值填充
3、timestamp查询和插入都会受到当地时区影响datetime支持范围宽度大(1000-01-01 00:00:00到9999-12-31 23:23:59)
字符串类型 Mysql|Mysql数据库 基本语法
文章图片

char和varchar的区别:
  • char定长,效率高,在创建字段的时候就已经指定,一般用于固定长度的表单提交数据存储
  • char在检索的时候回去掉尾部的空格
  • varchar是动态长度
  • varchar在检索的时候回保留尾部的空格
  • varchar将实际内容单独存储在聚簇索引之外,内容开头用1到2个字节表示实际长度(长度>255时需要2个字节)
  • 字符类型若为gbk,每个字符最多占2个字节,字符类型若为utf8,每个字符最多占3个字节
枚举类型:
  • 枚举在集合中取值,只能取一个
  • 如果值不存在则采用第一个值为默认
  • 如果插入NULL不会出错,会将NULL写入表
  • 成员个数在1255占用1个字节,在25565535占用2个字节,节约资源
create table `t8` ( `gender` enum('m','f') default null ) engine=innodb default charset=utf8

集合类型
  • 集合类型和枚举很像,但是支持多值选择
  • 最多可以保存64个成员,每8个成员占1个字节
  • 重复值只会插入一次,如果查出集合范围则插入为null
create table t9 (col set ('a','b','c','d'));

Mysql运算符 算数运算符
Mysql|Mysql数据库 基本语法
文章图片

比较运算符
Mysql|Mysql数据库 基本语法
文章图片

Mysql|Mysql数据库 基本语法
文章图片

NULL值不能参与"=","!=","<==>","<>"等场景比较
select * from t1 where id is null; select * from t1 where id is not null;

between 比较为闭区间
a between min and max ==> a >=min and a<=max select * from stu where id between 1 and 3;

in 在集合中匹配
select * from stu where id in (1,2,3);

like 这个在大量数据的情况下慎重选择 会影响查询性能
select id2 from t1 where id2 like "%03%";

regexp 这个在大量数据的情况下慎重选择,会影响查询性能。
select * from t1 where id2 regexp '0001';

逻辑运算符
Mysql|Mysql数据库 基本语法
文章图片

位运算符
Mysql|Mysql数据库 基本语法
文章图片

DDL-数据定义语言(create,alter,drop) 数据库创建成功后可在该数据库中创建数据表(简称为表)存储数据。请注意:在操作数据表之前应使用“USE 数据库名; ”指定操作是在哪个数据库中进行先关操作,否则会抛出“No database selected”错误。
语法如下:
create table 表名( 字段1 字段类型, 字段2 字段类型, … 字段n 字段类型 );

创建数据表
create table student( id int, name varchar(20), gender varchar(10), birthday date );

Mysql|Mysql数据库 基本语法
文章图片

查看数据表 示例:查看当前数据库中所有表 MySQL命令:
show tables;

效果展示
Mysql|Mysql数据库 基本语法
文章图片

示例:查表的基本信息 MySQL命令:
show create table student;

Mysql|Mysql数据库 基本语法
文章图片

示例:查看表的字段信息 MySQL命令:
desc student;

效果展示
Mysql|Mysql数据库 基本语法
文章图片

修改数据表 示例:修改表名 MySQL命令:
alter table student rename to stu;

示例:修改字段名 MySQL命令:
alter table stu change name sname varchar(10); #把 name变成 sname varchar(10);

示例:修改字段数据类型 MySQL命令:
alter table stu modify sname int;

示例:增加字段 MySQL命令:
alter table stu add address varchar(50);

示例:删除字段 MySQL命令:
alter table stu drop address;

实例:字段增加修改 add/change/modify/ 添加顺序:
1 add 增加在表尾. 2 change/modify 不该表字段位置. 3 修改字段可以带上以下参数进行位置调整(frist/after column_name); alter table emp change age age int(2) after ename; alter table emp change age age int(3) first;

删除数据表 示例:删除数据表 MySQL命令:
drop table stu;

DML-数据操纵语言(select,delete,update,insert) 记录 插入记录
//指定字段, //自增,默认值等字段可以不用列出来,没有默认值的为自动设置为NULL insert into stu (id,sname,birthday,address) values (001,'Jack','2000-01-01','China'); //可以不指定字段,但要一一对应 insert into stu values (001,'Jack','2000-01-01','China'); //批量插入记录 insert into stu values (001,'Jack','2000-01-01','China'),(002,'Mike','2013-01-01','America');

更新记录
update stu set birthday="2000-02-02" where same="Jack";

查看记录
//查看所有字段 select * from stu; //查询不重复记录 //结果只返回所有不重复的sname select distinct(sname) from stu ; //结果返回所有不重复的sname的其他所有值,例如生日编号等 select distinct(sname),stu.* from stu ; //条件查询 //比较运算符: > < >= <= <> != ... //逻辑运算符: and or ... select * from stu where id=001 or id=002;

删除记录
//请仔细检查where条件,慎重 delete from stu where sname='Jack';

排序 order by
// desc降序,asc升序(默认) select * from stu order by id ; select * from stu order by id asc; select * from stu order by id desc,birthday desc;

限制记录数 limit:分页
//只显示一条 select * from stu limit 1; //每页10条进行分页,从第五条之后开始显示 select * from stu limit 5,10; select * from stu order by id desc,birthday desc limit 1;

聚合:函数:count():记录数 / sum(总和); / max():最大值 / min():最小值
select count(id) from stu ; select sum(id) from stu ; select max(id) from stu ; select min(id) from stu ;

group by分组:
//分组统计 //按照学生id对 学生id 分组显示 select id from stu group by id; //按照 每个学生的id的数量 分组显示 select count(id) as count from stu group by id; select count(id) as count,id from stu group by id; #执行不出来?select count(id) as count,stu.* from stu group by id;

having 对分组结果二次过滤:
select count(id) as count,id from stu group by id having id >= 2;

with rollup 对分组结果二次汇总
select count(id),stu.* from stu group by id,sname with rollup;

子查询
//=, != select * from emp where deptno = (select deptno from dept where deptname="技术部"); select * from emp where deptno != (select deptno from dept where deptname="技术部"); //in, not in //当需要使用里面的结果集的时候必须用in(); select * from emp where deptno in (select deptno from dept where deptname="技术部"); select * from emp where deptno not in (select deptno from dept where deptname="技术部"); //exists , not exists //当需要判断后面的查询结果是否存在时使用exists(); select * from emp where exists (select deptno from dept where deptno > 5); select * from emp where not exists (select deptno from dept where deptno > 5);

union记录联合
// union:返回去重之后的结果 select sname from stu union select sname from stu; // union all:返回所有结果#相当于一次查询俩列 select sname from stu union all select id from stu;

DCL-数据控制语言 (grant, revoke) 添加权限
grant select,insert on test.* to 'db_user_1'@'localhost'identified by '123456'; flush privileges;

回收权限
revoke insert on test.* from 'db_user_1'@'localhost';

参考:
在此非常感谢以下技术博文
来源:简书 战神悟空-Mysql 基础

    推荐阅读