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 连接的端口号

相关文件夹

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数据库 基本语法_第1张图片

指定宽度

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

浮点数和定点数类型

浮点数类型

在这里插入图片描述

定点数类型

在这里插入图片描述

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

位类型

在这里插入图片描述

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

create table t6 (id bit(1));
select bin(id) from t6;

日期和时间类型

Mysql数据库 基本语法_第2张图片

当前系统日期

timestamp:返回yyyy-mm-dd hh:mm:ss 宽度19

timestamp:不适合存放久远日期,超出范围则会采用零值填充

//不同格式的显示零值格式
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数据库 基本语法_第3张图片

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数据库 基本语法_第4张图片

比较运算符

Mysql数据库 基本语法_第5张图片

在这里插入图片描述

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数据库 基本语法_第6张图片

位运算符

Mysql数据库 基本语法_第7张图片

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数据库 基本语法_第8张图片

查看数据表

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

show tables;

效果展示

Mysql数据库 基本语法_第9张图片

示例:查表的基本信息 MySQL命令:

show create table student;

Mysql数据库 基本语法_第10张图片

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

desc student;

效果展示

Mysql数据库 基本语法_第11张图片

修改数据表

示例:修改表名 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 基础

你可能感兴趣的:(Mysql,mysql,数据库,database)