mysql5.7 64位下载地址:
https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.19-winx64.zip
1.下载后得到zip压缩包.放在如上图的一个固定位置,之后不要删除
2.解压到自己想要安装到的目录,本人解压到的是D:\Environment\mysql-5.7.19
3.添加环境变量
1. 我的电脑->属性->高级->环境变量
2. 选择PATH,在其后面添加: 你的mysql 安装文件下面的bin文件夹
3. 在D:\Environment\mysql-5.7.19下新建 my.ini 文件
4. 编辑 my.ini 文件 ,注意替换路径位置
[mysqld]
basedir=D:\Program Files\mysql-5.7\
datadir=D:\Program Files\mysql-5.7\data\
port=3306
skip-grant-tables
5. 启动管理员模式下的CMD,并将路径切换至mysql下的bin目录,然后输入mysqld –install (安装mysql)
6. 再输入 mysqld --initialize-insecure --user=mysql 初始化数据文件
7. 然后再次启动mysql net start mysql 然后用命令 mysql –u root –p 进入mysql管理界面(密码可为空)
8. 进入界面后更改root密码
update mysql.user set authentication_string=password('root') where user='root' and Host = 'localhost';
(最后输入flush privileges; 刷新权限)
9. 修改 my.ini文件删除最后一句skip-grant-tables
10. 重启mysql即可正常使用
net stop mysql
net start mysql
11. 连接上后在cmd中
mysql -uroot-proot
表示使用root/root进行连接
(清空服务命令:sc delete mysql;)
常用sql命令
update user set password=password('123456')where user='root'; 修改密码
flush privileges; 刷新数据库
show databases; 显示所有数据库
use dbname; 打开某个数据库
show tables; 显示数据库mysql中所有的表
describe/desc user; 显示表mysql数据库中user表的列信息
create database [if not exists] name; 创建数据库
use databasename; 选择数据库
exit; 退出Mysql
? 命令关键词 : 寻求帮助
# 表示注释
/**/ 表示区域注释
声明:mysql的反引号,表示全词匹配
# 目标 : 创建一个school数据库
# 创建学生表(列,字段)
# 学号int 登录密码varchar(20) 姓名,性别varchar(2),出生日期(datatime),家庭住址,email
# 创建表之前 , 一定要先选择数据库
CREATE TABLE IF NOT EXISTS `student` (
`id` int(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
`name` varchar(30) NOT NULL DEFAULT '匿名' COMMENT '姓名',
`pwd` varchar(20) NOT NULL DEFAULT '123456' COMMENT '密码',
`sex` varchar(2) NOT NULL DEFAULT '男' COMMENT '性别',
`birthday` datetime DEFAULT NULL COMMENT '生日',
`address` varchar(100) DEFAULT NULL COMMENT '地址',
`email` varchar(50) DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
# 查看数据库的定义
SHOW CREATE DATABASE school;
# 查看数据表的定义
SHOW CREATE TABLE student;
# 显示表结构
DESC student;
# 设置严格检查模式(不能容错了)
SET sql_mode='STRICT_TRANS_TABLES';
create database boss_0227;--不能数字开头
show databases;
drop databases boss_0227;
user study;--使用该数据库
create table user(
id int PRIMARY key auto_increment,
password varchar(16)
)
desc user;--查看表设计
insert into user values(1,'张三');
select * from user;
delete from user where id=1;--sql server 可以不写from,mysql必须写,建议始终都写from
update user set password='123' where id=1;
rename table user to user2;--修改表名
select studentNo as no,studentName as name from student as stu;
select concat("a",studentName) as newName from student;
SELECT DISTINCT studentno FROM result; -- 了解:DISTINCT 去除重复项 , (默认是ALL)
# selcet查询中可以使用表达式
SELECT @@auto_increment_increment; # 查询自增步长
SELECT VERSION(); #查询版本号
SELECT 100*3-1 AS 计算结果; # 表达式
# 学员考试成绩集体提分一分查看
SELECT studentno,StudentResult+1 AS '提分后' FROM result;
SELECT studentno,studentresult FROM result
WHERE NOT studentno=1000; -- not 等于 !=
order by stuNo limit 0,10; -- 先排序后limit
常见函数
# 数学函数 (这里只列出一些常用的)
SELECT ABS(-8); /*绝对值*/
SELECT CEILING(9.4); /*向上取整*/
SELECT FLOOR(9.4); /*向下取整*/
SELECT RAND(); /*随机数,返回一个0-1之间的随机数*/
SELECT SIGN(0); /*符号函数: 负数返回-1,正数返回1,0返回0*/
#字符串函数
SELECT CHAR_LENGTH('狂神说坚持就能成功'); /*返回字符串包含的字符数*/
SELECT CONCAT('我','爱','程序'); /*合并字符串,参数可以有多个*/
SELECT INSERT('我爱编程helloworld',1,2,'超级热爱'); /*替换字符串,从某个位置开始替换某个长度,下标从1开始*/
SELECT LOWER('KuangShen'); /*小写*/
SELECT UPPER('KuangShen'); /*大写*/
SELECT LEFT('hello,world',5); /*从左边截取*/
SELECT RIGHT('hello,world',5); /*从右边截取*/
SELECT INSTR('hello','ll'); /*从返回str的的下标,下标从1开始*/
SELECT REPLACE('狂神说坚持就能成功,再坚持一下','坚持','努力'); /*替换所有符合regex的字符串*/
SELECT SUBSTR('狂神说坚持就能成功',4,6); /*截取字符串,开始index和长度,下标从1开始*/
SELECT REVERSE('狂神说坚持就能成功'); /*反转*/
#日期和时间函数
# 两者作用等价
SELECT CURRENT_DATE(); /*获取当前日期 2020-03-08 */
SELECT CURDATE(); /*获取当前日期 2020-03-08 */
SELECT NOW(); /*获取当前日期和时间 2020-03-08 20:03:08 */
SELECT LOCALTIME(); /*获取当前日期和时间 2020-03-08 20:03:08 */
SELECT SYSDATE(); /*获取当前日期和时间 2020-03-08 20:03:08 */
/*获取年月日,时分秒*/
SELECT YEAR(NOW());
SELECT MONTH(NOW());
SELECT DAY(NOW());
SELECT HOUR(NOW());
SELECT MINUTE(NOW());
SELECT SECOND(NOW());
#系统信息函数
SELECT VERSION(); /*版本*/
SELECT USER(); /*用户 @root */
/*COUNT:非空的*/
SELECT COUNT(studentname) FROM student;
SELECT COUNT(*) FROM student;
SELECT COUNT(1) FROM student; /*推荐*/
SELECT SUM(StudentResult) AS 总和 FROM result;
SELECT AVG(StudentResult) AS 平均分 FROM result;
SELECT MAX(StudentResult) AS 最高分 FROM result;
SELECT MIN(StudentResult) AS 最低分 FROM result;
MD5
insert into user values(4,'bob',MD5('123456'));
select * from `user`
where `name`='bob' AND pwd=MD5('123456');
# 创建外键的方式一 : 创建子表同时创建外键
# 年级表(id\年级名称)
CREATE TABLE `grade` (
`gradeid` INT(10) NOT NULL AUTO_INCREMENT COMMENT '年级ID',
`gradename` VARCHAR(50) NOT NULL COMMENT '年级名称',
PRIMARY KEY (`gradeid`)
) ENGINE=INNODB DEFAULT CHARSET=utf8
# 学生信息表
#(学号,姓名,性别,年级,手机,地址,出生日期,邮箱,身份证号)
CREATE TABLE `student` (
`studentno` INT(4) NOT NULL COMMENT '学号',
`studentname` VARCHAR(20) NOT NULL DEFAULT '匿名' COMMENT '姓名',
`sex` TINYINT(1) DEFAULT '1' COMMENT '性别',
`gradeid` INT(10) DEFAULT NULL COMMENT '年级',
`phoneNum` VARCHAR(50) NOT NULL COMMENT '手机',
`address` VARCHAR(255) DEFAULT NULL COMMENT '地址',
`borndate` DATETIME DEFAULT NULL COMMENT '生日',
`email` VARCHAR(50) DEFAULT NULL COMMENT '邮箱',
`idCard` VARCHAR(18) DEFAULT NULL COMMENT '身份证号',
PRIMARY KEY (`studentno`),
KEY `FK_gradeid` (`gradeid`),
CONSTRAINT `FK_gradeid` FOREIGN KEY (`gradeid`) REFERENCES `grade` (`gradeid`)
) ENGINE=INNODB DEFAULT CHARSET=utf8
# 创建外键方式二 : 创建子表完毕后,修改子表添加外键
ALTER TABLE student
ADD CONSTRAINT `FK_gradeid` FOREIGN KEY (`gradeid`) REFERENCES `grade` (`gradeid`);
# 删除外键
ALTER TABLE student DROP FOREIGN KEY FK_gradeid;
# 发现执行完上面的,索引还在,所以还要删除索引
# 注:这个索引是建立外键的时候默认生成的
ALTER TABLE student DROP INDEX FK_gradeid;
添加数据
INSERT命令
语法 :
INSERT INTO 表名[(字段1,字段2,字段3,...)] VALUES('值1','值2','值3')
注意 :
字段或值之间用英文逗号隔开.
'字段1,字段2...'该部分可省略 , 但添加的值务必与表结构,数据列,顺序相对应,且数量一致.
可同时插入多条数据 , values 后用英文逗号隔开.
复制代码
# 使用语句如何增加语句?
# 语法 : INSERT INTO 表名[(字段1,字段2,字段3,...)] VALUES('值1','值2','值3')
INSERT INTO grade(gradename) VALUES ('大一');
# 主键自增,那能否省略呢?
INSERT INTO grade VALUES ('大二');
# 查询:INSERT INTO grade VALUE ('大二')错误代码: 1136
# Column count doesn`t match value count at row 1
# 得出结论:'字段1,字段2...'该部分可省略 , 但添加的值务必与表结构,数据列,顺序相对应,且数量一致.
# 一次插入多条数据
INSERT INTO grade(gradename) VALUES ('大三'),('大四');
group by 和sqlserver用法不同
sql server 使用了stuNo作为分组字段,那么其他字段要么以聚合函数出现,要么不能出现;
但mysql不同,mysql即使只按照其中一个字段分组,其他字段同样可以直接查出来,
因为mysql中,系统用了limit(1)将查询的第一条数据显示。这是一个很大的区别。
补充
-- select now(); sqlserver中不支持
-- select curdate();sqlserver中不支持
-- select curtime();sqlserver中不支持
select PI();-- 3.141593 在sql server中运行结果:3.14159265358979
-- select mod(45,7);-- 求余sqlserver中不支持
select sqrt(25);-- 求开方
select round(12.345678,2)-- 12.35 sqlsever得到:12.350000
select 7.1 div 7; -- 相除的结果取整数
select 7.1 mod 8;-- 7.1 取余数
select length('小搬运工很帅!')-- 为啥得出长度是21
MySql中添加用户,新建数据库,用户授权,删除用户,修改密码(注意每行后边都跟个;表示一个命令语句结束):
1.新建用户
1.1 登录MYSQL:
@>mysql -u root -p
@>密码
1.2 创建用户:
mysql> insert into mysql.user(Host,User,Password) values("localhost","test",password("1234"));
这样就创建了一个名为:test 密码为:1234 的用户。
注意:此处的"localhost",是指该用户只能在本地登录,不能在另外一台机器上远程登录。如果想远程登录的话,将"localhost"改为"%",表示在任何一台电脑上都可以登录。也可以指定某台机器可以远程登录。
1.3 然后登录一下:
mysql>exit;
@>mysql -u test -p
@>输入密码
mysql>登录成功
2.为用户授权
授权格式:grant 权限 on 数据库.* to 用户名@登录主机 identified by "密码";
2.1 登录MYSQL(有ROOT权限),这里以ROOT身份登录:
@>mysql -u root -p
@>密码
2.2 首先为用户创建一个数据库(testDB):
mysql>create database testDB;
2.3 授权test用户拥有testDB数据库的所有权限(某个数据库的所有权限):
mysql>grant all privileges on testDB.* to test@localhost identified by '1234';
mysql>flush privileges;//刷新系统权限表
格式:grant 权限 on 数据库.* to 用户名@登录主机 identified by "密码";
2.4 如果想指定部分权限给一用户,可以这样来写:
mysql>grant select,update on testDB.* to test@localhost identified by '1234';
mysql>flush privileges; //刷新系统权限表
2.5 授权test用户拥有所有数据库的某些权限:
mysql>grant select,delete,update,create,drop on *.* to test@"%" identified by "1234";
//test用户对所有数据库都有select,delete,update,create,drop 权限。
//@"%" 表示对所有非本地主机授权,不包括localhost。(localhost地址设为127.0.0.1,如果设为真实的本地地址,不知道是否可以,没有验证。)
//对localhost授权:加上一句grant all privileges on testDB.* to test@localhost identified by '1234';即可。
3. 删除用户
@>mysql -u root -p
@>密码
mysql>Delete FROM user Where User='test' and Host='localhost';
mysql>flush privileges;
mysql>drop database testDB; //删除用户的数据库
删除账户及权限:>drop user 用户名@'%';
>drop user 用户名@ localhost;
4. 修改指定用户密码
@>mysql -u root -p
@>密码
mysql>update mysql.user set password=password('新密码') where User="test" and Host="localhost";
mysql>flush privileges;
执行如下命令,即可把root密码修改为admin
set password for root@localhost = password('admin');
mysql随机获取记录
SELECT * FROM mydb_user ORDER BY RAND() LIMIT 5;
获取当前日期+时间
select now();
select now() as Systemtime;
select sysdate() as Systemtime;
-- 2019-09-30 13:41:00
select curdate();
select current_date as Systemtime;
-- 2019-09-30
Incorrect integer value: '' for column 'id' at row 1
数据格式为datetime,而且navicat默认给的是Empty String所以存不进去,和填写的注释内容无关。
CREATE DATABASE mybatis DEFAULT CHARACTER SET utf8;
再补充
1,show create table 旧表;
这样会将旧表的创建命令列出。我们只需要将该命令拷贝出来,更改table的名字,就可以建立一个完全一样的表
4、复制旧表的数据到新表-新表需已存在(假设两个表结构不一样)
insert into 新表(字段1,字段2,.......) select 字段1,字段2,...... from 旧表
5,跨库只复制数据
insert into db1.table1 select * from db2.table2 (完全复制,需新表已存在)
insert into db1.table1 select distinct * from db2.table2(不复制重复纪录,需新表已存在)
insert into tdb1.able1 select top 5 * from db2.table2 (前五条纪录,需新表已存在)
select * from information_schema.tables
6,select * from tb_data_new limit 5,5;
查询出6-10,从5开始查处5条,但不包括第5行
SELECT * from user LIMIT 0,5;
-- 等价于 SELECT * FROM user LIMIT 5;
SELECT * from user LIMIT 2 OFFSET 3; -- 跳过3个查2个
-- 等价于 SELECT * FROM user LIMIT 3,2;
SELECT * FROM orange LIMIT 10,15; -- 检索记录11-25
第n页: limit (pageNo-1)*pageSize,pageSize
pageNo:页码 pageSize:单页显示条数
7,开启事务
start transaction https://www.v2ex.com/t/501189
begin