mysql常用

328 阅读6分钟

看过很多mysql的博客, 准备敲一遍基础的,记录一下,方便后期查询, 毕竟不经常用,又忘记了

安装mysql

下载解压资源

  1. mysql5.7.27地址
  2. pan.baidu.com/s/1v8Gbn9_4… 提取码: 0lc0
  3. 解压到你需要存放mysql的文件夹或c盘或d盘

配置环境变量

新建配置文件

  1. 在安装目录下新建my.ini文件
[Client]
port = 3306
 
[mysqld]
#设置3306端口
port = 3306
# 设置mysql的安装目录
basedir=F:\mysql
# 设置mysql数据库的数据的存放目录
datadir=F:\mysql\data
# 允许最大连接数
max_connections=200
# 服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
 
[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8

初始化mysql

  1. cmd管理员权限进入到安装目录 D:\mysql-5.7.27-winx64 的bin文件夹下
  2. 执行命令mysqld --initialize --user=mysql --console 会得到如下随机密码,用于初次登陆mysql

创建data文件

  1. 在安装目录下新建data文件夹用于存放mysql表数据

安装mysql

输入命令mysqld --install mysql

修改root密码

  1. 启动服务 net start mysql
  2. 输入初始化时产生的随机密码 mysql -u root -p,输入初始密码,复制初始密码,点击右键可粘贴。
  3. 输入修改密码set password=password('新密码');

下载可视化工具(Navicat for MySQL)

地址: pan.baidu.com/s/1-R3jBER9… 提取码: jnzr

  1. 用用户名 root , 修改改的密码登陆成功安装完成

数据库

创建数据库

CREATE DATABASE IF NOT EXISTS eggTest

册除数据库

DROP DATABASE test1

选择数据库

USE eggTest

数据类型

数值类型

类型 大小 用途
TINYINT 1 字节 小整数值
SMALLINT 2 字节 大整数值
INT 4 字节 大整数值
BIGINT 8 字节 极大整数值
FLOAT 4 字节 单精度浮点数值
DOUBLE 8 字节 双精度浮点数值

日期类型

类型 格式 用途
DATE YYYY-MM-DD 日期值
TIME HH:MM:SS 时间值或持续时间
YEAR YYYY 年份值
DATETIME YYYY-MM-DD HH:MM:SS 混合日期和时间值
TIMESTAMP YYYYMMDD HHMMSS 混合日期和时间值,时间戳

字符串类型

类型 大小 用途
VARCHAR 0-65535 字节 变长字符串
CHAR 0-255字节 定长字符串
TINYBLOB 0-255字节 不超过 255 个字符的二进制字符串
TINYTEXT 0-255字节 短文本字符串
BLOB 0-65 535字节 二进制形式的长文本数据
TEXT 0-65 535字节 长文本数据

表操作

新建一个表

USE eggTest;
CREATE TABLE IF NOT EXISTS user(
userId INT(10) NOT NULL AUTO_INCREMENT COMMENT '用户id',
username VARCHAR(10) NOT NULL,
password VARCHAR(16) NOT NULL,
realname VARCHAR(10) NOT NULL,
updataTime  datetime NOT NULL,
createTime datetime NOT NULL,
loginTime  datetime NOT NULL,
PRIMARY key (userId)
)ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=21;

新建说明: AUTO_INCREMENT --为自增起始值

添加表数据

use eggTest;
INSERT INTO `user` (createTime,updataTime,username,password) values 
(NOW(),NOW(),'你好世界',123456),
(NOW(),NOW(),'BB',123456);

删除数据

user eggTest;
DROP TABLE eggTest;

修改数据

Use eggTest;
UPDATE `user` SET STATUS = 0, updataTime = NOW() WHERE userId = 21  
-- 批量修改
UPDATE table_name SET field=REPLACE(field, 'old-string', 'new-string') 
[WHERE Clause]

查询数据

use eggTest;
SELECT userId,userName FROM user WHERE userId > 0 LIMIT 10 OFFSET 20;
查询where语句
操作符
=
<>, !=
>
<
>=
<=
LIMIT查找分页
let result = {
  pageinator: {
    pageLength,
    pageNo
  }
}
let start = (pageNo - 1) * pageLength
let count = pageLength
let sql = `SELECT article.id  article_id, test.id test_id From article, test WHERE article.id = test.id AND artivle.status In(1) LIMIT ${start}, ${count}`
ORDER BY排序
// 升序(默认)  asc 
let sql1 = `SELECT * FROM user ORDER BY user_id ASC`
// 降序 desc
let sql2 = `SELECT * FROM user ORDER BY user_id DESC`
Like模糊查询
let sql = `SELECT article.name, test.title FROM article,test WHERE article.id=test.id AND article.name LIKE '%${title}%' AND status IN(1) LIMIT ${start}, ${count}`
GROUP分组查询

参考链接

// 查询各个部门最高薪资
let sql = `SELECT dept, MAX(SALARY) AS MAXIMUM FROM STAFF GROUP BY DEPT` 
//将 WHERE 子句与 GROUP BY 子句一起使用
//分组查询可以在形成组和计算列函数之前具有消除非限定行的标准 WHERE 子句。必须在GROUP BY 子句之前指定 WHERE 子句
let sql = `SELECT DEPT, EDLEVEL, MAX( SALARY ) AS MAXIMUM
FROM staff WHERE HIREDATE > '2010-01-01'
GROUP BY DEPT, EDLEVEL
ORDER BY DEPT, EDLEVEL`
// 可以在ground by 之后使用having,and,or来限定返回分组
// 此时返回是以组为单位整组过滤
let sql = `SELECT DEPT, MAX( SALARY ) AS MAXIMUM, MIN( SALARY ) AS MINIMUM
FROM staff
GROUP BY DEPT
HAVING COUNT( * ) >2
ORDER BY DEPT`
WITH ROLLUP 分组

在分组统计的基础上,在进行统计


join 连接数据
// 内连接 INER join, 是交集关系
// left join 左表会去不显示,右表没有的字段值为null
// right join 右表会去不显示,左表没有的字段值为null
let sql = `SELECT coalesce(name, '总数'), SUM(singin) as singin_count FROM  employee_tbl GROUP BY name WITH ROLLUP`
左联LEFT JOIN与 WHERE查询

左联的理解是,在没有匹配到值的时候也会放回null where是过滤的意思,在没有匹配到值时会过滤掉 看如下代码

let create_table_user = `
CREATE TABLE IF NOT EXISTS 'user'(
'id' int(11) NOT NULL AUTO_INCREMENT COMMENT '用户的id',
'name' varchar(12)  NOT NULL COMMENT '用户名',
‘score’ varchar (3) NOT NULL COMMENT '分数',
PRMARY KEY ('id)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COMMENT='用户表 AUTO_INCREMENT=28 ;
`
let create_table_city =   `
CREATE TABLE IF NOT EXISTS 'city'(
'id' int(11) NOT NULL AUTO_INCREMENT COMMENT '城市记录id',
'user_id' int(11)  NOT NULL COMMENT '用户id',
‘city’ varchar (3) COMMENT '用户城市',
PRMARY KEY ('id)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COMMENT='用户城市表' AUTO_INCREMENT=28 ;
`
let insert_user = INSERT INTO user ('id','name','score') VALUES (1,'张三',89), (2,'李四',88), (3,'王五',99),(4,'赵六',99);
let insert_city = INSERT INTO city ('id','user_id','city') VALUES (1,2,'湖南’), (2,2,'上海'), (3,1,null);

left join 查询(此时赵6也会返回,city为null)
let select_leftJoin = `SELECT id,name,city from user LEFT JOIN city on(user.id = city.user_id)`

where 查询 (此时赵6 不会会返回)
let select_where= `SELECT id,name,city from user ,city WHERE user.id=city.user_id`

Mysql中natural join和inner join的区别

nner join----
`SELECT * FROM TableA INNER JOIN TableB USING (Column1)`
`SELECT * FROM TableA INNER JOIN TableB ON TableA.Column1 = TableB.Column1`
natural join--它会去除重复的列名
SELECT * FROM TableA NATURAL JOIN Table

alter修改表字段

需要修改数据表名或者修改数据表字段时,就需要使用到MySQL ALTER命令

修改表名
ALTER table test rename to test_1
修改列名change 关键字
alter table test change name username vachar;
修改字段类型 modify 关键字
alter table test modify name char(10)
修改默认值
alter table test modify name char NOT NULL defaut 100,
删除
alter table test drop name;

函数

  1. count(*) / count(1) 总数在分页查询用的较多
  2. 去重distinct(name)
  3. IFNULL() 没有返回空,如下取第二高成绩人名 select IFNULL((select distinct(Salary) from Employee order by Salary desc limit 1,1),null) as SecondHighestSalary
  4. sum( SALARY ) 求某一列的总和
  5. MAX( SALARY ) 最大值
  6. MIN( SALARY ) 最小值
  7. NOW() 当前日期/2018-09-19 20:57:43
  8. coalesce(a,b,c); // 如果 a = null,则取b的值以此类推