看过很多mysql的博客, 准备敲一遍基础的,记录一下,方便后期查询, 毕竟不经常用,又忘记了
安装mysql
下载解压资源
- mysql5.7.27地址
- pan.baidu.com/s/1v8Gbn9_4… 提取码: 0lc0
- 解压到你需要存放mysql的文件夹或c盘或d盘
配置环境变量
新建配置文件
- 在安装目录下新建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
- cmd管理员权限进入到安装目录
D:\mysql-5.7.27-winx64的bin文件夹下 - 执行命令
mysqld --initialize --user=mysql --console会得到如下随机密码,用于初次登陆mysql
创建data文件
- 在安装目录下新建data文件夹用于存放mysql表数据
安装mysql
输入命令mysqld --install mysql
修改root密码
- 启动服务
net start mysql - 输入初始化时产生的随机密码
mysql -u root -p,输入初始密码,复制初始密码,点击右键可粘贴。 - 输入修改密码
set password=password('新密码');
下载可视化工具(Navicat for MySQL)
地址: pan.baidu.com/s/1-R3jBER9… 提取码: jnzr
- 用用户名 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;
函数
count(*) / count(1)总数在分页查询用的较多- 去重
distinct(name) - IFNULL() 没有返回空,如下取第二高成绩人名
select IFNULL((select distinct(Salary) from Employee order by Salary desc limit 1,1),null) as SecondHighestSalary - sum( SALARY ) 求某一列的总和
- MAX( SALARY ) 最大值
- MIN( SALARY ) 最小值
- NOW() 当前日期/2018-09-19 20:57:43
- coalesce(a,b,c); // 如果 a = null,则取b的值以此类推