基础配置
服务端口默认
3306
安装的时候选择自动添加
path
编码格式
utf8
windows启动服务
net start 服务名称(mysql)
net stop 服务名称
登录
首先确保mysql服务已经打开,不确定话
net start mysql
试试mysql -uroot -pxxxx
xxxx为你的密码,也可以不显示密码登录
mysql -uroot -p
然后输入密码(此时密码以*显示)即可登录。
密码重置(8.0.23)
网上老的教程可能已经过时,8.0以上不支持
mysqld --skip-grant-tables
打开命令窗口cmd,输入命令:
net stop mysql
,停止MySQL服务,开启跳过密码验证登录的MySQL服务,输入命令,然后不要关闭此窗口,命令如下:
mysqld --console --skip-grant-tables --shared-memory
再打开一个新的cmd,无密码登录MySQL,输入登录命令:
mysql -u root -p
,然后回车即可- 密码置为空,命令如下:
use mysql
update user set authentication_string='' where user='root';
退出,命令如下
quit
关闭以
-console --skip-grant-tables --shared-memory
启动的MySQL服务(即关闭第一个打开的cmd窗口)打开cmd,输入:
net start mysql
启动MySQL服务。步骤4密码已经置空,所以无密码状态登录MySQL,输入登录命令:mysql -u root -p,然后回车即可登录
修改密码,如下:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 你的密码';
验证更改后密码正确登录
输入quit,退出当前登录,输入登录命令:
mysql -u root -p
输入密码,成功登录,到此,重置密码结束。
常用命令
以
;
结尾
show databases;
use test
create database test2;
quit\exit
show tables;
source D:\xxx\xxx\xxx.sql
select version();
select database();
\c
终止写了一半的语句
SQL语句简介
分类
DQL:查询(select)
DML:对表中的数据进行增删改,操作(insert delete update)
以下是了解一下
DDL:定义,(create drop alter)操作表结构增删改
TCL:事务控制
- 事务提交:commit
- 事务回滚:rollback
DCL:控制(授权,撤销授权等)
DQL
基础查询
desc tableName; //查询表的结构 |
条件查询
select name from dept where age = 12; |
排序
select |
综合
from,where,select,order顺序不能变
select ename, sal |
单行处理函数
一个输入对应一个输出
lower upper |
分组函数
输入多行,输出一行,自动忽略null
不分组的话默认整张表是一组 |
- 分组函数不能直接使用在where中
- 分组函数可以连起来用
分组查询
例如计算每个部门的工资和
select ...
from ...
group by ...
- 关键字的执行顺序
select job,sum(sal) from emp group by deptno;//当分组的时候,select只能跟分组函数和用来分组的字段名。 |
where不能用分组函数,只能用having,但是having不能单独用,且能用where尽量用where
from |
一些关键字
distinct
去重
select distinct job,deptno from emp;//表示job 和deptno当成一个字段来去重 |
连接查询
概述
从一张表叫单表查询,多个表称为连接查询,分为SQL92,SQL99,重点学习99
根据连接方式分类:
- 内连接
- 等值连接
- 非等值连接
- 自连接
- 外连接
- 左外连接(左连接)
- 右外连接(右连接)
- 全连接(不讲)
select ename,dname from emp,dept;//没有限制会匹配所有的(结果是两个行数乘积)笛卡尔积 |
内连接
等值连接
//sql92语法 |
注意,92的语法结构不清晰,因为表连接的条件和数据筛选条件放在一起,结构不清晰。99的on用来表连接条件,where用来筛选数据。结构清晰,92不用了!太tm老了!
inner
可以省略,妈的,虽然可读性好,一眼就看出来了内连接,但是很麻烦,省略了吧
非等值连接
select e.ename, e.sal, s.grade |
自连接
一张表看成两张表,分别起别名,最后会少一个,因为有个NULL!领导查不出来了!
select e1.ename, e2.ename |
外连接
左、右连接
在join前加left或者right,即转换为外连接,outer可以省略。以left为例,在on的基础上,如果join左边表某一条在右边中没有匹配,那么依然显示。因此,left使左边表成为主表,right相反。而内连接两个表是平等的。
//对上边自连接的改进 |
全连接
mysql> select e1.ename, e2.ename |
交叉连接
用笛卡尔积,返回所有的匹配
mysql> select e1.ename, e2.ename |
多张表的连接
内外join可以混合使用
select e.ename, d.dname, e.sal, s.grade |
子查询
嵌套查询
把一个查询结果放在select、from、where后面
select ename,sal from emp where sal > (select min(sal) from emp);//不能直接在where里使用分组函数 |
当放在select后面时,了解一下
select ename,sal,(selct dname from dept where dept.depno = emp.depno) from emp; |
union
可以将两个结果拼接起来,但是两个结果的列数应该一样,表头和第一个一样。oracle要求数据类型也要一样。
select ........ |
limit
放在最后,限制取出数量 limit startIndex(缺省值0), length
select ename,sal |
常用来分页显示
select ename,sal |
DDL
建表
create table talbe_name( |
数据类型
varchar 可变长度字符串,比较智能,会根据实际长度分配空间,最长255 |
删除表
drop table t_student; |
DML
增insert
insert into t_student(字段名1, 字段名2) values(值1, 值2);//如果字段名和括号都不写,那么值需要一一对应。不建议不x |
插入date类型
假设有一个字段是date类型,那么怎么插入呢
insert into t_user(id, name, birth) values(2, 'lisi', str_to_date('1990-10-01','%Y-%m-%d')); |
以上语句需要注意的是:
str_to_date()
第一个参数是字符串,第二个是对应的日期格式,分别有%Y %m %d %h %i %s
注意大小写。当要select的时候可以用
date_format()
来转换,如果不转换默认是上边的格式,即年-月-日。当字符串是年月日的类型时,可以直接传字符串。
insert into t_user(id, name, birth) values(2, 'lisi', '1990-10-01');
date与datetime
datetime
包括年月日时分秒。- 长日期默认格式是
%Y-&m-%d %h:%i:%s
- 具体用法同
date
now()
获取当前系统时间,类型是datetime
删delete
delete from t_user |
改update
update t_user |