MySql学习与总结(一)

继承潮汐
• 阅读 1104

再小的帆也能远航,不断学习,不断进步!
具体文档参考mysql官网文档,官方文档是学习的最好方式!
https://dev.mysql.com/doc/ref...

总结一下工作中常用的基本sql和命令

基本的命令行操作

命令行连接数据库
mysql -h地址 -u用户名 -P端口 -p密码 
查看当前数据库的版本
select version();
显示当前数据库中的所有表
show tables;
查看表结构
desc 表名;
查看建表语句
show create table 表名\G;

操作数据库语句

创建数据库
create database if not exists 数据库名;
删除数据库 
drop database if exists 数据库名;
使用数据库 
use `数据库名`;
查看数据库 
show databases;  查看所有的数据库
select database(); 查看当前位于哪个数据库
show create database 数据库名\G; 查看建库语句

数据库的列类型

数值
int 标准的整数
decimal 字符串形式的浮点数

字符串
varchar 可变字符串 0-65535 常用的变量
text 文本串 2^16-1 保存大文本

时间
datatime YYYY-MM-DD HH:mm:ss 最常用的时间格式
timestamp 时间戳 1970.1.1 到现在的毫秒数
year

Null
空值

操作数据表语句

创建表

CREATE TABLE IF NOT EXISTS `student`(
 `id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
 `name` VARCHAR(20) NOT NULL DEFAULT '匿名' COMMENT'姓名',
 `pwd` VARCHAR(30) NOT NULL DEFAULT '123456' COMMENT '密码',
 `sex` VARCHAR(2) NOT NULL DEFAULT '女' COMMENT '性别',
 `birthday` DATETIME DEFAULT NULL COMMENT'生日',
 `address` VARCHAR(100) DEFAULT NULL COMMENT 'j家庭地址',
  `email` VARCHAR(20) DEFAULT NULL COMMENT '邮箱',
  PRIMARY KEY(`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8;

修改表

修改表名 
alter table `旧表名`  rename as `新表名`;
增加表的字段 
alter table `表名` add `字段名` 列属性;
修改表的字段
alter table `表名`  modify  `字段名` 新约束;    只能修改约束
alter table `表名`  change `旧字段名`  `新字段名` [新|旧约束];   既可以修改字段名也可以修改约束
删除表的字段
alter table `表名` drop `字段名`;

删除表

drop table if exists `表名`;

查看表

查看表结构
desc `表名`;
查看建表语句
show create table `表名`\G;

MyISAM和INNODB的区别

MyISAM INNODB
事务支持 不支持 支持
数据行锁定 不支持 支持
全文索引 支持 不支持
外键索引 不支持 支持
表空间的大小 较小 较大,约为2倍

数据库级别的外键(物理外键)

DROP TABLE IF EXISTS `student`;
DROP TABLE IF EXISTS `grade`;
-- 创建年级表(主表)
CREATE TABLE IF NOT EXISTS `grade`(
 `grade_id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '年级id',
 `grade_name` VARCHAR(20) NOT NULL COMMENT '年级名称',
  PRIMARY KEY(`grade_id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8;

-- 创建学生表,创建表的时候添加外键引用
-- 学生表(从表)的grade_id字段要去引用年级表(主表)的grade_id字段
CREATE TABLE IF NOT EXISTS `student`(
 `id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
 `name` VARCHAR(20) NOT NULL DEFAULT '匿名' COMMENT'姓名',
 `pwd` VARCHAR(30) NOT NULL DEFAULT '123456' COMMENT '密码',
 `sex` VARCHAR(2) NOT NULL DEFAULT '女' COMMENT '性别',
 `birthday` DATETIME DEFAULT NULL COMMENT'生日',
 `address` VARCHAR(100) DEFAULT NULL COMMENT 'j家庭地址',
  `email` VARCHAR(20) DEFAULT NULL COMMENT '邮箱',
  `grade_id` INT(4) NOT NULL  COMMENT '年级id',
  PRIMARY KEY(`id`),
  KEY `FK_id` (`grade_id`),   -- 定义学生表的grade_id为key
  -- 约束 定义的grade_id 为外键同时引用年级表的grade_id字段
  CONSTRAINT `FK_id` FOREIGN KEY (`grade_id`) REFERENCES `grade`(`grade_id`) 
  )ENGINE=INNODB DEFAULT CHARSET=utf8; -- constraint 约束  foreign key  外键  refrences 引用  
-- 删除有外键引用的表时,必须先删除从表再删除主表
DROP TABLE IF EXISTS `student`;
-- 创建表后添加外键引用
CREATE TABLE IF NOT EXISTS `student`(
 `id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
 `name` VARCHAR(20) NOT NULL DEFAULT '匿名' COMMENT'姓名',
 `pwd` VARCHAR(30) NOT NULL DEFAULT '123456' COMMENT '密码',
 `sex` VARCHAR(2) NOT NULL DEFAULT '女' COMMENT '性别',
 `birthday` DATETIME DEFAULT NULL COMMENT'生日',
 `address` VARCHAR(100) DEFAULT NULL COMMENT 'j家庭地址',
  `email` VARCHAR(20) DEFAULT NULL COMMENT '邮箱',
  `grade_id` INT(4) NOT NULL  COMMENT '年级id',
  PRIMARY KEY(`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8;
-- 添加外键约束
ALTER TABLE `student` 
ADD CONSTRAINT `FK_id` FOREIGN KEY (`grade_id`) REFERENCES `grade` (`grade_id`);
DESC `student`;

DML语言(数据操作语言)

insert语句
INSERT INTO `grade`(`grade_name`) VALUES('大一');
-- 插入的时候字段和值要一一对应,字段是自增的时候可以省略
update语句
-- update 修改 
UPDATE `grade` SET `grade_name`='大二' WHERE grade_id=1;
-- 需要修改多个字段,使用逗号隔开
delete语句
-- delete 删除 
DELETE FROM `grade` WHERE grade_id = 1;
delete和truncate的区别
  • 相同点
    都能删除数据,都不会删除表结构
  • 不同点

    • truncate重新设置自增列,计数器会归零
    • truncate 不会影响事务

DQL(数据查询语言)

基本的Select语句
-- 查询所有数据  
SELECT * FROM `student`;
-- 查询指定字段 
SELECT `name` ,`pwd` FROM `student`;
-- 起别名 ,结果、字段、表都可以起别名,可以使用as,也可以省略 
SELECT `name` AS 姓名,`pwd` AS 密码 FROM `student`;
SELECT s.name AS 姓名 , s.pwd AS 密码 FROM `student` AS s;
-- 函数concat(a,b)
SELECT CONCAT("学生姓名:",`name`) AS 新姓名  FROM `student`;
-- 去重  
SELECT DISTINCT `name` FROM `student`;
Where子句

算术运算符

算术运算符 含义
= 等于
> 大于
< 小于
>= 大于等于
<= 小于等于
!= <> 不等于
and
or
between ...and 在某个区间内

逻辑运算符

逻辑运算符 含义
&&
双竖线
not

模糊查询-比较运算符

比较运算符 含义
is null null值
is not null 不为null值
like 匹配
in 集合
-- like 模糊查询  
-- like 结合 %(0-任意个字符) _(一个字符) 
SELECT `name` ,`pwd` FROM `student` WHERE `name` LIKE '刘%';
SELECT `name` ,`pwd` FROM `student` WHERE `name` LIKE '刘_';
-- in  集合  
SELECT `name`,`pwd` FROM `student` WHERE `id` IN (1,2,3);
-- is null   空  
SELECT `name` ,`id` FROM `student` WHERE `psd` IS NULL;
-- is not null  不为空 
SELECT `name` ,`id` FROM `student` WHERE `psd` IS NOT NULL;

联表查询

操作 描述
inner join 等值联结 只显示符合条件的记录
left join 左联结 左表的记录会全部显示,右表只会显示符合搜索条件的记录
right join 右联结 右表的记录会全部显示,左表只会显示符合搜索条件的记录
1:分许查询的字段都来自哪些表
2:确定交叉点(两个表中的哪些数据是相同的)
3:找到判断的条件

分页和排序

order by 排序的字段    asc 升序  desc  降序
limit 起始值,页面大小    
起始值=(n-1)*页面大小   n为当前页  
数据总数/页面大小 = 总页数  

聚合函数

聚合函数 含义
count() 统计
sum() 求和
max() 最大值
avg() 平均值
min() 最小值
三者的比较
count(*) 包括了所有列,相当于行数 统计结果不会忽略列值为null的
count(1) 忽略了所有列,用1代表代码行 统计结果不会忽略列值为null的
count(列名) 只包括列名那一列 统计结果会忽略列值为null的

分组函数
group by 有一个原则,就是select 后面的所有列中,没有使用聚合函数的列,必须出现在 group by 后面(重要)

区别
having 在分组之后过滤数据,条件中可以使用聚合函数
where 在分组之前过滤数据,条件中不能使用聚合函数
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
6个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
Python3:sqlalchemy对mysql数据库操作,非sql语句
Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这