基础配置

  1. 服务端口默认3306

  2. 安装的时候选择自动添加path

  3. 编码格式utf8

  4. windows启动服务

    net start 服务名称(mysql)
    net stop 服务名称

登录

  1. 首先确保mysql服务已经打开,不确定话net start mysql试试

  2. mysql -uroot -pxxxx

    xxxx为你的密码,也可以不显示密码登录

    mysql -uroot -p

    然后输入密码(此时密码以*显示)即可登录。

密码重置(8.0.23)

网上老的教程可能已经过时,8.0以上不支持mysqld --skip-grant-tables

  1. 打开命令窗口cmd,输入命令:net stop mysql,停止MySQL服务,

  2. 开启跳过密码验证登录的MySQL服务,输入命令,然后不要关闭此窗口,命令如下:

    mysqld --console --skip-grant-tables --shared-memory

  3. 再打开一个新的cmd,无密码登录MySQL,输入登录命令:mysql -u root -p,然后回车即可

    1. 密码置为空,命令如下:

    use mysql

    update user set authentication_string='' where user='root';

    1. 退出,命令如下

      quit

  4. 关闭以-console --skip-grant-tables --shared-memory启动的MySQL服务(即关闭第一个打开的cmd窗口)

    1. 打开cmd,输入:net start mysql启动MySQL服务。

    2. 步骤4密码已经置空,所以无密码状态登录MySQL,输入登录命令:mysql -u root -p,然后回车即可登录

    3. 修改密码,如下:

      ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 你的密码';
  5. 验证更改后密码正确登录

  6. 输入quit,退出当前登录,输入登录命令:mysql -u root -p

  7. 输入密码,成功登录,到此,重置密码结束。

常用命令

;结尾

show databases;

use test

create database test2;

quit\exit

show tables;

source D:\xxx\xxx\xxx.sql

select version();

select database();

\c终止写了一半的语句

SQL语句简介

分类

  1. DQL:查询(select)

  2. DML:对表中的数据进行增删改,操作(insert delete update)


    以下是了解一下

  3. DDL:定义,(create drop alter)操作表结构增删改

  4. TCL:事务控制

    1. 事务提交:commit
    2. 事务回滚:rollback
  5. DCL:控制(授权,撤销授权等)

DQL

基础查询

desc tableName; //查询表的结构
select name form dept;//查询一个子段
select name,age from dept;//查询多个字段
select * from tableName; //查询所有字段,效率低,可读性差
select name hhh from dept;
select name as hhh from dept;//起别名
select name 'my hhh' from dept;//别名有空格加引号(单双都可,单最好用单引号,单引号是标准 ,如果别名是中文也要引号)
select name, age*12 from dept;//可以使用数学表达式
select 这里写个字符串或者数字(字面值) from emp;//返回的是n个字符串或数字,了解一下(查看表的结构)

条件查询

select name from dept where age = 12;
select name from dept where age <> 12;//就是!=的意思
select salary from emp where name = 'smith';

//常用的条件
=
<> !=
<
<=
>
>=
between ... and ...//等同于下边 的
>= and <=
is null//null 不能用=
is not null
and
or //and优先级大于or,可以加括号
in//后面跟个python中的list
not in

//模糊查询
like
%表示任意多个字符
_表示任意一个字符
select name from emp where like '%T%'; //如果包含下划线等可以用\转义;

排序

select
ename,sal
from
emp
order by
sal (asc); //升序,也可以用别名排序

select
ename,sal
from
emp
order by
sal desc; //降序

select
ename,sal
from
emp
order by
sal asc, ename asc; //多关键字排序

select
ename,sal
from
emp
order by
2; //按照第二列排序(不建议这么写)

综合

from,where,select,order顺序不能变

select ename, sal
from emp
where sal between 1000 and 2000
order by sal desc;

单行处理函数

一个输入对应一个输出

lower upper
select lower(ename) as ename from emp;//注意别名

substr
select substr(enmae, 1, 1) as ename from emp;//起始下标,从1开始,后面是截取长度

contact('a', 'b');//字符串拼接

length(name);

trim(name);//去除前后空白 ltrim, rtrim

round(double, n);//保留n个小数(四舍五入)n如果是-1的话,嘿嘿你试试

rand()

ifnull(数据,值)//有null参与的运算结果都是null,所以用ifnull来把null替换成一个值,如ifnull(sal, 0);

select ename, job (case job when 'MANAGER' then sal*1.1 when 'SALESMAN' then sal*1.5 else sal) as newsalary from emp;


分组函数

输入多行,输出一行,自动忽略null

不分组的话默认整张表是一组
max()
min()
sum()
avg() //不考虑null的行
count()

count (*) from emp;//即总行数

  1. 分组函数不能直接使用在where中
  2. 分组函数可以连起来用

分组查询

  1. 例如计算每个部门的工资和

    select ...
    from ...
    group by ...
  1. 关键字的执行顺序
select job,sum(sal) from emp group by deptno;//当分组的时候,select只能跟分组函数和用来分组的字段名。

where不能用分组函数,只能用having,但是having不能单独用,且能用where尽量用where

from
where
group by //后面跟多个字段时,相当于把两个字段合成一个字段
having
select
order by

一些关键字

distinct去重

select distinct job,deptno from emp;//表示job 和deptno当成一个字段来去重
select job, distinct deptno from emp;//错误写法

select count (disinct job) from emp;

连接查询

概述

从一张表叫单表查询,多个表称为连接查询,分为SQL92,SQL99,重点学习99

根据连接方式分类:

  • 内连接
    • 等值连接
    • 非等值连接
    • 自连接
  • 外连接
    • 左外连接(左连接)
    • 右外连接(右连接)
  • 全连接(不讲)
select ename,dname from emp,dept;//没有限制会匹配所有的(结果是两个行数乘积)笛卡尔积
select e.ename, d.dname from emp e, dept d where e,deptno = d.deptno;//注意from后面起的别名,以及.的应用

内连接

等值连接
//sql92语法
select e.ename, d.dname from emp e, dept d where e,deptno = d.deptno and 其他条件;

//sql99语法
select e.name, d.dname from emp e (inner) join dept d on e.deptno = d.deptno where 过滤条件;

注意,92的语法结构不清晰,因为表连接的条件和数据筛选条件放在一起,结构不清晰。99的on用来表连接条件,where用来筛选数据。结构清晰,92不用了!太tm老了!

inner可以省略,妈的,虽然可读性好,一眼就看出来了内连接,但是很麻烦,省略了吧

非等值连接
select e.ename, e.sal, s.grade
from emp e (inner) join salgrade s
on e.sal between s.losal and s.hisal;
自连接

一张表看成两张表,分别起别名,最后会少一个,因为有个NULL!领导查不出来了!

select e1.ename, e2.ename
from emp e1 join emp e2
on e1.mgr = e2.empno;

外连接

左、右连接

在join前加left或者right,即转换为外连接,outer可以省略。以left为例,在on的基础上,如果join左边表某一条在右边中没有匹配,那么依然显示。因此,left使左边表成为主表,right相反。而内连接两个表是平等的。

//对上边自连接的改进
mysql> select e1.ename, e2.ename
-> from emp e1 left (outer) join emp e2
-> on e1.mgr = e2.empno;
全连接
mysql> select e1.ename, e2.ename
-> from emp e1 full (outer) join emp e2
-> on e1.mgr = e2.empno;
交叉连接

用笛卡尔积,返回所有的匹配

mysql> select e1.ename, e2.ename
-> from emp e1 cross (outer) join emp e2

多张表的连接

内外join可以混合使用

select e.ename, d.dname, e.sal, s.grade
from emp e
join dept d on e.deptno = d.deptno
join salgrade s on e.sal between s.losal and s.hisal;

子查询

嵌套查询

把一个查询结果放在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 ........
union
select ........;

limit

放在最后,限制取出数量 limit startIndex(缺省值0), length

select ename,sal
from emp
order by sal desc
limit 2,3; //第三到第五

常用来分页显示

select ename,sal
from emp
order by sal desc
limit 0,3;
//第一页
limit 3,3;
//第二页
limit 6,3;
//第三页
limit 9,3;

DDL

建表

create table talbe_name(
字段名1 数据类型,
字段名2 数据类型
);

create table t_student(
no int,
name varchar(32),
sex char(1) default 'm',//通过default指定默认值,否则为NULL
age int(3),
email varchar(255)
)

数据类型

varchar 可变长度字符串,比较智能,会根据实际长度分配空间,最长255
char 定长字符串,效率高,浪费空间,性别给我用char!最长255
int 最长11
bigint
float
double
date 短日期
datetime 长日期
clob 字符大对象(最多可以存储4G的字符串,例如存储一个文章)charactor large object
blob 二进制大对象 binary large object(插入的时候需要用到io流)

删除表

drop table t_student;
drop table if exists 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'));

以上语句需要注意的是:

  1. str_to_date()第一个参数是字符串,第二个是对应的日期格式,分别有%Y %m %d %h %i %s注意大小写。

  2. 当要select的时候可以用date_format()来转换,如果不转换默认是上边的格式,即年-月-日。

  3. 当字符串是年月日的类型时,可以直接传字符串

    insert into t_user(id, name, birth) values(2, 'lisi', '1990-10-01');

date与datetime

  1. datetime包括年月日时分秒。
  2. 长日期默认格式是%Y-&m-%d %h:%i:%s
  3. 具体用法同date
  4. now()获取当前系统时间,类型是datetime

删delete

delete from t_user
where id = 2;//不加会删除所有的

改update

update t_user
set name = 'jack', birth = '2000-10-04'
where id = 2;//不加条件会改所有的!