目录
一、MySQL安装和配置
二、数据库
三、表
四、数据库的C [create] R [read] U [update] D [delete] 语句
1、insert语句
2、update语句
3、delete语句
4、select语句
五、Mysql常用数据类型(列类型):编辑
六、函数
*合计 / 统计函数
*数学相关函数
*时间日期相关的函数
*加密和系统函数
*流程控制函数
七、mysql表查询--加强版
八、mysql表外连接
九、mysql约束
1、primary key
2、not null
3、unique
4、foreign key
5、check
7、自增长
十、mysql索引
十一、mysql事务
十二、视图(view)
十三、MySQL用户管理
一、MySQL安装和配置
1、引入
2、B站《韩顺平 零基础30天学会java》第731集,安装MySQL的详细步骤
3、使用命令行窗口连接MySQL数据库
(1)
mysql -h 主机名IP -P 端口 -u 用户名 -p密码
注意:-p密码,中间不要有空格
mysql -h 127.0.0.1 -P 3306 -u root -pliufu668
(2)登录前,保证服务启动
(3)如果如果没有写-h 主机名IP,默认就是本机
(4)如果没有写-P 端口,默认就是3306 (在实际工作中,3306一般修改)
4、下载安装破解版navicat和SQLyog
安装包:
http://t.csdn.cn/C9TYN
安装视频:
Navicat 15 安装与破解_哔哩哔哩_bilibili
使用示范:
(1)使用命令行cmd:
(2)使用navicat:
5、SQLyog的下载与安装
http://t.csdn.cn/1XSOi
二、数据库
核心:用一个系统管理多个仓库,仓库里有一叠填写了货物信息的表
1 、数据库三层结构:
(1)所谓安装MySQL数据库,就是在主机安装一个数据库管理系统(DBMS),这个管理程序可以管理多个数据库,DBMS(database manage system)
(2)一个数据库中可以创建多个表,以保存数据(信息)
(3)数据库管理系统(DBMS)、数据库和表的关系如下:
2、数据在数据库中的存储方式:
3、SQL语句分类:
(1)DDL:数据定义语句[ create 表,库。。。]
(2)DML:数据操作语句[ 增加 insert,修改 updata,删除delete]
(3)DQL:数据查询语句[ select ]
(4)DCL:数据控制语句[ 管理数据库 ,比如用户权限 grant revoke]
4、
五、用SQLyog操作数据库
1、创建数据库
语法:
CREATE DATABASE [IF NOT EXISTS] db_name
[create_specification ,create_specification...]
说明:
create_specification:
[DEFAULT] CHARACTER SET charset_name :
指数据库采用的字符集,如果不指定字符集,默认utf8
[DEFAULT] COLLATE collation_name:
指定数据库字符集的校对规则(常用的utf8_bin,utf8_general_ci(默认))
(1)hsp_db02
(2)hsp_db03
2、查看、删除数据库
语法:
#显示数据库:
SHOW DATABASES
#显示数据库创建语句:
SHOW CREATE DATABASE db_name
#删除数据库语句:
DROP DATABASE [IF EXISTS] db_name
3、备份恢复数据库
(1)语法:
(2)练习:
4、综合练习:
* 安装ecshop数据库:
方法一:
(1) 把ecshop数据库的数据备份到“新查询编辑器”中
(2)全选,执行
方法二:
(1) 把ecshop数据库的数据备份到目录d:\\ecshop.sql
(2)在命令行中输入,回车
* 备份ecshop数据库
在dos下输入:mysqldump -u root -p -B ecshop > d:\\ecshop.sql
三、表
1、创建表
(1)基本介绍:
语法:
CREATE TABLE table_name(
field1 datatype,
field2 datatype,
field3 datatype)CHARACTER SET COLLATE ENGINE
说明:
character set 字符集
collate 如不指定则为所在数据库校对规则
engine引擎
field 指定列名
datatype 指定列类型(字段类型)
character set 如不指定则为所在数据库字符集
注意:创建表时,要根据需保存的数据创建相应的列,并根据数据的类型定义相应的列类型
(2)练习:
建表users:
(1)方式一:新建表
(2)方式二:sql语句
2、修改表、删除表
(1)基本介绍:
法一:指令语法:
#增加列
ALTER TABLE tablename
ADD (column datatype [DEFAULT expr]
[,column datatype]...);
#修改列
ALTER TABLE tablename
MODIFY (column datatype [DEFAULT expr]
[,column datatype]...);
删除列
ALTER TABLE tablename
DROP (column);
查看表的结构:desc 表名;
修改表名:Rename table 表名 to 新表名;
修改表字符集:alter table 表名 character set 字符集;
法二:界面修改
(2)应用实例:
我的答案:
老师的答案:
四、数据库的C [create] R [read] U [update] D [delete] 语句
1、insert语句
(1)使用INSERT语句向表中插入数据
INSERT INTO table_name [(column [, colum...])]
VALUES (value [, value...]);
(2)案例
---------------------------------------------------------------------------
(3)细节说明:
1)插入的数据应与字段的数据类型相同,比如把'abc'添加到int类型会报错
2)数据的长度应在列的规定范围内,例如:不能将一个长度为80的字符串加入到长度为40的列中
3)在values中列出的数据位置必须与被加入的列的排列位置相对应
4)字符和日期数据应包含在单引号中
5)列可以插入空值[前提是该字段允许为空],insert into table value(null)
(后来接有NOT NULL说明不能为空)
6)insert into tab_name(列名……)values(),(),()形式添加多条记录
7)如果是给表中的所有字段添加数据,可以不写前面的名称
8)默认值的使用,当不给某个字段值时,如果有默认值就会添加,否则报错
2、update语句
(1)基本介绍:
UPDATE tb1_name
SET col_name1=expr1[, col_name2=expr2...]
[WHERE where_definition]
(2)案例:
(3)使用细节:
1)UPDATE语法可以用新值更新原有表行中的各列
2)SET子句指示要修改哪些列和要给予哪些值
3)WHERE子句指定应更新哪些行,若没有WHERE子句,则更新所有的行(慎用)
4)如果需要修改多个字段,可以通过set字段1=值1,字段2=值2……
3、delete语句
(1)基本介绍
DELETE FROM tb1_name
[WHERE where_definition]
(2)案例
(3)使用细节:
1)如果不使用where子句,将删除表中所有数据
2)DELETE语句不能删除某一列的值(可使用UPDATE设为null或者‘ ’)
3)使用DELETE语句仅删除记录,不删除表本身,如要删除表,使用DROP TABLE语句,
DROP TABLE 表名;
4、select语句
(1)基本语法:
SELECT [DISTINCT] *| (column1,column2,column3...)
FROM tablename;
(2)注意事项:
1)Select指定查询哪些列的数据
2)column指定列名
3)* 号代表查询所有列
4)From指定查询哪张表
5)DISTINCT可选,指显示结果时,是否去掉重复数据
(3)细节:
#使用表达式对查询的列进行运算
SELECT *| (column1 | expression, column2 | expression...)
FROM tablename;
#使用as语句
SELECT column_name as 别名 from 表名;
(4)在where子句中经常使用的运算符
比较运算符 | > < <= >= = !=或<>都是不等于 | |
---|---|---|
BETWEEN...AND... | 显示在某一区间的值 | |
IN(set) | 显示在in列表中的值,如in(100,200) | |
LIKE '张pattern' NOT LIKE '' | 模糊查询 模糊查询 | |
IS NULL | 判断是否为空 | |
逻辑运算符 | and | 多个条件同时成立(逻辑与) |
or | 多个条件任一成立(逻辑或) | |
not | 不成立,如where not (salary>100);(取反) |
----------------------------------------------
(5)使用order by 子句排序查询结果
SELECT column1, column2, column3...
FROM table
order by column asc...;
或
SELECT column1, column2, column3...
FROM table
order by column desc...;
*注意:
1)Order by指定排序的列,排序的列既可以是表中的列名,也可以是select语句后指定的列名
2)Asc升序(默认),Desc降序
3)ORDER BY子句应位于SELECT语句的结尾
(6)group by和having子句
#使用group by子句对列进行分组
SELECT column1, column2,column3...FROM table
GROUP BY column
#使用having子句对分组后的结果进行过滤
SELECT column1, column2, column3...
FROM table
GROUP BY column having...
*注意
1)group by 用于对查询的结果分组统计,having子句用于限制分组显示结果
2)
#部门表
CREATE TABLE dept(
deptno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0,
dname VARCHAR(20) NOT NULL DEFAULT "",
loc VARCHAR(13) NOT NULL DEFAULT "");
#添加部门信息
INSERT INTO dept VALUES(10,'ACCOUNTING','NEW YORK'),#财务部accounting,纽约
(20,'RESEARCH','DALLAS'),#研发部research,达拉斯
(30,'SALES','CHICACO'),#销售部sales,芝加哥
(40,'OPERATIONS','BOSTON');#业务部operations,波士顿
SELECT * FROM dept;
#员工表
CREATE TABLE emp(
empno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0,#编号
ename VARCHAR(20) NOT NULL DEFAULT "",#名字
job VARCHAR(9) NOT NULL DEFAULT "",#工作
mgr MEDIUMINT UNSIGNED,#上级编号
hiredate DATE NOT NULL,#入职时间
sal DECIMAL(7,2) NOT NULL,#薪水
comm DECIMAL(7,2),#红利
deptno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0);#部门编号
#添加员工信息
INSERT INTO emp VALUES
(7369,'SMITH','CLERK',7902,'1990-12-17',800.00,NULL,20),
(7499,'ALLEN','SALESMAN',7698,'1991-2-20',1600.00,300.00,30),
(7521,'WARD','SALESMAN',7698,'1991-2-22',1250.00,500.00,30),
(7566,'JONES','MANAGER',7839,'1991-4-2',2975.00,NULL,20),
(7654,'MARTIN','SALESMAN',7698,'1991-9-28',1250.00,1400.00,30),
(7698,'BLAKE','MANAGER',7839,'1991-5-11',2850.00,NULL,30),
(7782,'CLARK','MANAGER',7839,'1991-6-9',2450.00,NULL,10),
(7788,'SCOTT','ANALYST',7566,'1997-4-19',3000.00,NULL,20),
(7839,'KING','PRESIDENT',NULL,'1991-11-17',5000.00,NULL,10),
(7844,'TURNER','SALESMAN',7698,'1991-9-8',1500.00,NULL,30),
(7900,'JAMES','CLERK',7698,'1991-12-3',950.00,NULL,30),
(7902,'FORD',' ANALYST',7566,'1991-12-3',3000.00,NULL,20),
(7934,'MILLER','CLERK',7782,'1992-1-23',1300.00,NULL,10);
SELECT * FROM emp;
#工资级别表
CREATE TABLE salgrade(
grade MEDIUMINT UNSIGNED NOT NULL DEFAULT 0,#工资级别
losal DECIMAL(17,2) NOT NULL,#该级别的最低工资
hisal DECIMAL(17,2) NOT NULL);#该级别的最高工资
#添加工资信息
INSERT INTO salgrade VALUES(1,700,1200);
INSERT INTO salgrade VALUES(2,1201,1400);
INSERT INTO salgrade VALUES(3,1401,2000);
INSERT INTO salgrade VALUES(4,2001,3000);
INSERT INTO salgrade VALUES(5,3001,9999);
SELECT * FROM salgrade;
#显示每个部门的平均工资和最高工资
SELECT AVG(sal),MAX(sal),deptno
FROM emp GROUP BY deptno;#按照部门来分组查询
#显示每个部门的每种岗位的平均工资和最低工资
SELECT AVG(sal),MAX(sal),deptno,job
FROM emp GROUP BY deptno,job;#先按部门分,再按岗位分组查询
#显示平均工资低于2000的部门号和它的平均工资
#1、显示各个部门的平均工资和部门号
#2、在1的结果基础上,进行过滤,保留AVG(sal) < 2000
SELECT AVG(sal),deptno
FROM emp GROUP BY deptno
HAVING AVG(sal) < 2000;
#3、使用别名过滤
SELECT AVG(sal) AS avg_sal,deptno
FROM emp GROUP BY deptno
HAVING avg_sal < 2000;#此处可使用别名,避免了重复计算工作
五、Mysql常用数据类型(列类型):
*mysql5.1参考手册下载:http://t.csdn.cn/rgSPl
1、数值型(整数)的基本使用:
(1)说明:
使用规范:在能够满足需求的情况下,尽量选择占用空间小的类型(保小不保大)
(2)应用实例:
*如何定义一个无符号的整数:
create table t10 (id tinyint); //默认是有符号的
create table t11 (id tinyint unsigned); //无符号的
2、数值型(bit)的使用
(1)基本使用:
mysql > create table t02(num bit(8));
mysql > insert into t02(1, 3);
mysql > insert into t02 values(2, 65);
(2)细节说明:
*bit字段显示时,按照位的方式显示
*查询时仍然可以用添加的数值
*如果一个值只有0,1可以考虑使用bit(1),可以节约空间
*位类型,M指定位数,默认值1,范围1~64
*使用不多
(3)案例演示:
3、数值型(小数)的基本使用:
(1)FLOAT/DOUBLE [UNSIGNED]
(2)DECIMAL[M,D] [UNSIGNED]
*可以支持更加精确的小数位,M是小数位数(精度)的总数,D是小数点(标度)后面的位数
*如果D是0,则值没有小数点或分数部分,M最大65,D最大是30,如果D被省略,默认是0,如果M被省略,默认是10
*建议:如果希望小数的精度高,推荐使用decimal
(3)案例演示:
4、字符串的基本使用:
(1)CHAR(size):
固定长度字符串,最大 255 字符
(2)VARCHAR(size) :
可变长度字符串,0~65535 字节 [utf8编码最大21844字符,1~3个字节用于记录大小]
(3)案例演示:
(4)使用细节:
1)char(4)
*这个4表示字符数(最大255),不是字节数,不管是中文还是字母都是放4个,按字符计算
2)varchar(4)
*这个4表示字符数,不管是字母还是中文都以定义好的表的编码来存放数据
*不管是中文还是英文字母,都是最多存放4个,是按照字符来存放的
3)char(4) 是定长,即,即使你插入‘aa’,也会占用分配的4个字符的空间
varchar(4)是变长,即,如果你插入了‘aa’,实际占用的空间大小并不是4个字符,而是按照实际占用空间来分配
注:varchar本身还需占用1~3个字节来记录存放内容长度(备注)
4)什么时候使用char,什么时候使用varchar
* 如果数据是定长,推荐使用char,比如md5的密码、邮编、手机号、身份证号码等,char(32)
* 如果一个字段的长度是不确定,我们使用varchar,比如留言、文章
查询速度:char > varchar
(5)在存放文本时,也可使用Text数据类型,可以将Text列视为VARCHAR列,注意Text不能有默认值,大小0~2^16字节。如果希望存放更多字符,可以选择(中等大小)MEDIUMTEXT 0~2^24 或者 LONGTEXT 0~2^32。如果想简单点,可直接使用TEXT
5、日期类型的基本使用:
(1)基本使用:
CREATE TABLE birthday(t1 DATE, t2 DATETIME, t3 TIMESTAMP
NOT NULL DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP);
mysql > INSERT INTO birthday(t1, t2)
VALUES('2022-11-11', '2022-11-11 10:10:10');
(2)细节说明:
TimeStamp在Insert和update时,自动更新
6、练习题
//我的答案:(运行失败- _ -)
//老师的答案:
//简化版:
六、函数
*合计 / 统计函数
1、count 返回行的总数
SELECT COUNT(*) FROM tablename
[WHERE where_difinition]
或
SELECT COUNT (列名) FROM tablename
[WHERE where_difinition]
-------------------------------------------------
2、Sum函数返回满足where条件的行的和
SELECT SUM(列名) (, SUM(列名)...) FROM tablename
[WHERE where_definition]
3、AVG函数返回满足where条件的一列的平均值
SELECT AVG(列名)(,AVG(列名)...) FROM tablename
[WHERE where_definition]
4、MAX / MIN函数返回满足where条件的一列的最大 / 最小值
SELECT MAX(列名)FROM tablename
[WHERE where_definition]
5、字符串相关函数
#CHARSET(str)返回字串字符集
SELECT CHARSET(ename) FROM emp;
#concat(string2 [,...])连接字串,将多个列拼接成一列
SELECT CONCAT(ename,' 工作是 ',job) FROM emp;
#INSTR(string,substring)返回substring在string中出现的位置,没有返回0
SELECT INSTR('hanshunping','ping') FROM DUAL;
#UCASE(string2)转换成大写
SELECT UCASE(ename) FROM emp;
#LCASE(string2)转换成小写
SELECT LCASE(ename) FROM emp;
#LEFT(string2,length)从string2中的左边起取length个字符
SELECT LEFT(ename,2) FROM emp;
#RIGHT(string2,length)从string2中的右边起取length个字符
SELECT RIGHT(ename,2) FROM emp;
#LENGTH(string) string长度[按照字节]
SELECT LENGTH(ename) FROM emp;
#REPLACE(str,search_str,replace_str)
#在str中用replace_str替换search_str
SELECT ename,REPLACE(job,'MANAGER','经理') FROM emp;
#STRCMP(string1,string2)逐字符比较两字串大小
SELECT STRCMP('hsp','hsp') FROM DUAL;
#SUBSTRING(str,position,length)
#从str的position开始[从1开始计算],取length个字符
#从ename列的第一位置开始取出2个字符
#SUBSTRING(str,position)
#从str的position开始[从1开始计算],取后面所有的字符
SELECT SUBSTRING(ename,1,2) FROM emp;
#LTRIM(string2) RTRIM(string2) trim去除前端空格或后端空格
SELECT LTRIM(' 老韩') FROM DUAL;
SELECT LTRIM('老韩 ') FROM DUAL;
SELECT LTRIM(' 老韩 ') FROM DUAL;
SELECT * FROM emp;
*数学相关函数
*时间日期相关的函数
1、细节说明:
(1)DATE_ADD()中的interval后面可以是year minute second day(年、分、秒、日)等
(2)DATE_SUB()中的interval后面可以是year minute second day等
(3)DATEDIFF(date1, date2)得到的是天数,而且是date1-date2的天数,因此可以取负数
(4)这四个函数的日期类型可以是date, datetime或者timestamp
(5)在实际开发中,我们也经常使用int来保存一个unix时间戳,然后使用from_unixtime()进行转换,还是非常有实用价值的
2、案例演示:
#CURRENT_DATE() 当前日期
SELECT CURRENT_DATE() FROM daul;
#CURRENT_TIME() 当前时间
SELECT CURRENT_TIME() FROM DUAL;
#CURRENT_TIMESTAMP() 当前时间戳
SELECT CURRENT_TIMESTAMP() FROM DUAL;
#创建信息表
CREATE TABLE mes(
id INT,
content VARCHAR(30),
send_time DATETIME);
#添加记录
INSERT INTO mes
VALUES(1,'北京新闻',CURRENT_TIMESTAMP());
INSERT INTO mes
VALUES(2,'上海新闻',NOW());
INSERT INTO mes
VALUES(3,'广州新闻',NOW());
#查询
SELECT * FROM mes;
SELECT NOW() FROM DUAL;#查询当前时间
#显示新闻信息的发布日期,不用显示时间
SELECT id,content,DATE(send_time)
FROM mes;
#查询在10分钟内发布的新闻
SELECT * FROM mes
WHERE DATE_ADD(send_time,INTERVAL 10 MINUTE) >= NOW()#当前时间大于(发送时间+10分钟)10分钟 <= 发送时间-当前时间
SELECT * FROM mes
WHERE send_time >= DATE_SUB(NOW(),INTERVAL 10 MINUTE)#发送时间大于(当前时间-10分钟)10分钟 >= 当前时间-发送时间
#请在mysql的sql语句中求出2011-11-11和1990-1-1相差多少天
SELECT DATEDIFF('2011-11-11','1990-1-1') FROM DUAL;
#请用mysql的sql语句求出你活了多少天?2002-11-12出生
SELECT DATEDIFF(NOW(),'2002-11-12') FROM DUAL;
#请用mysql的sql语句求出你活了多少年?2002-11-12出生
SELECT DATEDIFF(NOW(),'2002-11-12') /365 FROM DUAL;
#如果你能活到80岁,求出你还能活多少天?2002-11-5出生
#先求出活到80岁时的日期x,再使用datediff(x,now());
SELECT DATEDIFF(DATE_ADD('2002-11-5',INTERVAL 80 YEAR),NOW())
FROM DUAL;
#上面INTERVAL 80 YEAR:YEAR可以是年月日、时分秒
#上面'2002-11-5':形式可以是date, datetime,timestamp
#计算两个时间的差
SELECT TIMEDIFF('10:11:11','06:10:10') FROM DUAL;
#YEAR | MONTH | DAY | DATE(datetime)
SELECT YEAR(NOW()) FROM DUAL;
SELECT MONTH(NOW()) FROM DUAL;
SELECT DAY(NOW()) FROM DUAL;
SELECT MONTH('2013-11-10') FROM DUAL;#查询'2013-11-10'这个日期的月份
#UNIX_TIMESTAMP(): 返回的是1970-1-1 00:00:00到现在的秒数
SELECT UNIX_TIMESTAMP()FROM DUAL;
#FROM_UNIXTIME(): 可以把一个unix_timestamp秒数,转成指定格式的日期
SELECT FROM_UNIXTIME(1671681728,'%Y-%m-%d') FROM DUAL;#2022-12-22
SELECT FROM_UNIXTIME(1671681728,'%Y-%m-%d %H:%i:%s') FROM DUAL;#2022-12-22 12:02:08
*加密和系统函数
存密码时要加密,不要直接存明文,容易被人攻击,泄露出去
#USER()查询用户
#可以查看登录到mysql的有哪些用户,以及登录的IP
SELECT USER() FROM DUAL;#用户IP地址: root@localhost
#DATABASE()查询当前使用数据库名称
SELECT DATABASE() FROM DUAL;#hsp_db05
#MS5(str)为字符串算出一个MD5 32的字符串,常用(用户密码)加密
#root密码是hsp->加密md5->在数据库中存放的是加密后密码
SELECT MD5('hsp') FROM DUAL;
SELECT LENGTH(MD5('hsp')) FROM DUAL;
#演示用户表,存放密码时,是md5
CREATE TABLE users(
id INT,
`name` VARCHAR(32) NOT NULL DEFAULT ' ',
pwd CHAR(32) NOT NULL DEFAULT ' ');
#加密存密码,存密码时不要直接存明文,容易被人攻击,泄露出去
INSERT INTO users
VALUES(100,'猪肉炖粉条',MD5('hsp'));
SELECT * FROM users;
SELECT * FROM users
WHERE `name`='猪肉炖粉条' AND pwd=MD5('hsp');
#PASSWORD(str)加密函数,MySQL数据库的用户密码就是PASSWORD函数加密
SELECT PASSWORD('hsp') FROM DUAL;
#*81220D972A52D4C51BB1C37518A2613706220DAC
#SELECT * FROM mysql.user\G从原文密码str计算并返回密码字符串
#通常用于对mysql数据库的用户密码加密
#mysql.user表示数据库.表
SELECT * FROM mysql.user#主要是看一些权限
*流程控制函数
#IF(expr1,expr2,expr3)如果expr1为True,则返回expr2,否则返回expr3
SELECT IF(TRUE,'北京','上海') FROM DUAL;
#IFNULL(expr1,expr2)如果expr1不为空,则返回expr2,否则返回expr3
SELECT IFNULL(NULL,'北京','上海') FROM DUAL;
#SELECT CASE WHEN expr1 THEN expr2 WHEN expr3 THEN expr4 ELSE expr5 END;
#如果expr1为TRUE,则返回expr2,如果expr2为TRUE,返回expr4,否则返回expr5
SELECT CASE
WHEN TRUE THEN'jack'
WHEN FALSE THEN'tom'
ELSE 'mary' END
#查询emp表,如果comm是NULL,则显示0.0
#判断是否为NULL要使用IS NULL,判断不为空,使用IS NOT
SELECT ename,IF(comm IS NULL,0.0,comm)
FROM emp;
SELECT ename,IFNULL(comm,0.0)
FROM emp;
#如果emp表的job是CLERK,则显示职员,如果是MANAGER则显示经理
#如果是SALESMAN则显示销售人员,其它正常显示
SELECT ename,(SELECT CASE
WHEN job='CLERK'THEN'职员'
WHEN job='MANAGER'THEN'经理'
WHEN job='SALESMAN'THEN'销售人员'
ELSE job END) AS 'job'
FROM emp;
七、mysql表查询--加强版
1、WHERE子句和ORDER BY子句
2、分页查询
SELECT ...
LIMIT START,ROWS
#表示从start+1行开始取,取出rows行,当成该页的内容。start从0开始计算
3、使用分组函数和分组子句group by
*如果select语句同时包含有group by, having, limit, order by,那么他们的顺序是group by, having, order by
SELECT column1, column2, column3...FROM tablename
GROUP BY column
HAVING condition
ORDER BY column
LIMIT start, rows;
应用案例:
//我的答案:
//老师的答案:
4、mysql多表查询
(1)说明:多表查询是指基于两个或两个以上的表查询
(2)
#显示雇员名,雇员工资及所在部门的名字[笛卡尔集]
#1、雇员名、雇员工资来自emp表
#2、部门的名字来自dept表
#3、需求对emp和dept查询
SELECT *
FROM emp,dept#过滤前,52条
WHERE emp.deptno=dept.deptno#过滤后,13条
#由这个表和下一个表的相同的某个条件去下一个表里查其他信息
SELECT ename,sal,dname#过滤条件
FROM emp,dept
WHERE emp.deptno=dept.deptno
#当多个表同时拥有相同的信息,需要指定显示某个的列,即表.列表
SELECT ename,sal,dname,emp.deptno
FROM emp,dept
WHERE emp.deptno=dept.deptno
SELECT * FROM emp;
SELECT * FROM dept;
#提示:多表查询的条件不能少于表的个数 - 1,否则会出现笛卡尔集
#显示部门号为10的部门名、员工名和工资
#思路:先写下简单的结构,再添加过滤条件
SELECT ename,sal,dname,emp.deptno
FROM emp,dept
WHERE emp.deptno=dept.deptno AND dept.deptno=10 #用emp.deptno=10也行
#显示各个员工的姓名、工资,及其工资的级别
SELECT ename,sal,grade
FROM emp,salgrade
WHERE sal BETWEEN losal AND hisal;
#练习:显示雇员名、雇员工资及所在部门的名字,并按部门排序[降序排]
SELECT ename,sal,dname,emp.deptno
FROM emp,dept
ORDER BY emp.deptno DESC;
5、自连接
(1)自连接是指在同一张表的连接查询 [将同一张表看成两张表]
6、mysql表子查询
(1)子查询是指嵌入在其他sql语句中select语句,也叫嵌套查询
(2)单行子查询是指只返回一行数据的子查询语句
(3)多行子查询指返回多行数据的子查询,使用关键字in
(4)
#如何显示与SMITH同一部门的所有员工?
#1、先查到SMITH的部门号
SELECT deptno
FROM emp
WHERE ename='SMITH'
#2、把上面的select语句当作一个子查询来用
SELECT *
FROM emp
WHERE deptno=(
SELECT deptno
FROM emp
WHERE ename='SMITH'
)
#课堂练习:如何查询和部门10的工作相同的雇员的
#名字、岗位、工资、部门号,但是不含10号部门自己的成员
#1、查询到10号部门有哪些工作
#2、把上面查询的结果当作子查询用
SELECT DISTINCT job
FROM emp
WHERE deptno=10;
#组合后
SELECT ename,job,sal,deptno
FROM emp
WHERE job IN(
SELECT DISTINCT job
FROM emp
WHERE deptno=10;
)AND deptno <> 10 #不等于
#查询ecshop中各个类别中,价格最高的商品
#把子查询当作一张临时表可以解决很多很多复杂的查询问题
SELECT cat_id,MAX(shop_price)
FROM eos_goods
GROUP BY cat_id
SELECT goods_id,eos_goods,cat_id,goods_name,shop_price
FROM(
SELECT cat_id,MAX(shop_price) AS max_price
FROM eos_goods
GROUP BY cat_id
) temp,eos_goods
WHERE temp.cat_id=eos_goods.cat_id
AND temp.max_price=eos_goods.shop_price
(5)
#在多行子查询中使用all操作符
-- 思考:显示工资比部门号为30的所有员工的工资高的员工的姓名、工资和部门号
SELECT ename,sal,deptno
FROM emp
WHERE sal>ALL(
SELECT sal
FROM emp
WHERE deptno=30)
#在多行查询中使用any操作符
-- 思考:如何显示工资比部门号为30的其中一个员工的工资高的员工姓名、工资和部门号
SELECT ename,sal,deptno
FROM emp
WHERE sal>ANY(
SELECT sal
FROM emp
WHERE deptno=30)
#显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号
SELECT ename,sal,deptno
FROM emp
WHERE sal>ALL(
SELECT sal
FROM emp
WHERE deptno=30
)
SELECT ename,sal,deptno
FROM emp
WHERE sal>(
SELECT MAX(sal)
FROM emp
WHERE deptno=30
)
#显示工资比部门30的其中一个员工的工资高的员工的姓名、工资和部门号
SELECT ename,sal,deptno
FROM emp
WHERE sal>ANY(
SELECT sal
FROM emp
WHERE deptno=30
)
SELECT ename,sal,deptno
FROM emp
WHERE sal>(
SELECT MIN(sal)
FROM emp
WHERE deptno=30
)
(6)多列子查询是指查询返回多个列数据的子查询语句
#查询与smith的部门和岗位完全相同的所有雇员(并且不含smith本人)
#1、得到smith的部门和岗位
SELECT deptno,job
FROM emp
WHERE ename='SMITH'
#2、
SELECT *
FROM emp
WHERE (deptno,job)=(
SELECT deptno,job
FROM emp
WHERE ename='SMITH'
) AND ename !='SMITH'
SELECT * FROM emp;
#查询和宋江数学、语文、英语成绩完全相同的学生
SELECT chinese,english,math
FROM student
WHERE `name`='宋江'
SELECT *
FROM student
WHERE (chinese,english,math)=( #注意顺序
SELECT chinese,english,math
FROM student
WHERE `name`='宋江'
)
SELECT * FROM student;
(6)
#在FROM子句中使用子查询
查找每个部门工资高于本部门平均工资的人的资料,
使用数据查询的小技巧:把一个子查询当作一个临时表使用
#查找每个部门工资高于本部门平均工资的人的资料
#1、先得到每个部门的部门号和对应的平均工资
SELECT deptno,AVG(sal) AS avg_sal
FROM emp
GROUP BY deptno
#2、把上面的结果当作子查询,和emp进行多表查询
SELECT ename,sal,temp.avg_sal,emp.deptno
FROM emp,(
SELECT deptno,AVG(sal) AS avg_sal
FROM emp
GROUP BY deptno
) temp #一共查两个表
WHERE emp.deptno=temp.deptno AND emp.sal > temp.avg_sal
#查找每个部门工资最高的人的详细资料
SELECT ename,sal,temp.max_sal,emp.deptno
FROM emp,(
SELECT deptno,MAX(sal) AS max_sal
FROM emp
GROUP BY deptno
) temp #一共查两个表
WHERE emp.deptno=temp.deptno AND emp.sal = temp.max_sal
#显示每个部门的信息(包括:部门名,编号,地址)和人员数量
SELECT * FROM emp
SELECT * FROM temp
#统计各部门人员数量
SELECT *
FROM emp
GROUP BY deptno
SELECT empno,deptno,
#1、统计各部门的人员数量
SELECT COUNT(*),deptno
FROM emp
GROUP BY deptno;
SELECT dname,dept.deptno,loc,tmp.per_num AS '人数'
FROM dept,(
SELECT COUNT(*) AS per_num,deptno
FROM emp
GROUP BY deptno
) tmp #tmp是临时表的表名
WHERE tmp.deptno=dept.deptno
#另一种写法,表.* 表示将该表所有列都显示出来,可以简化sql语句
#在多表查询中,当多个表的列不重复时,才可以直接写列名
SELECT dname,loc,tmp.*
FROM dept,(
SELECT COUNT(*) AS per_num,deptno
FROM emp
GROUP BY deptno
) tmp #tmp是临时表的表名
WHERE tmp.deptno=dept.deptno
(7)合并查询
在实际应用中,为了合并多个select语句的结果,可以使用集合操作符号union, union all
1)union all 该操作符用于取得两个结果集的并集,当使用该操作符时,不会取消重复行
2)union 与union all 相似,但是会自动去掉结果中的重复行
7、表复制
(1)自我复制数据(蠕虫复制)
有时,为了对某个sql语句进行效率测试,我们需要海量数据时,可以使用此法为表创建海量数据
#表的复制
CREATE TABLE my_tab01(
id INT,
`name` VARCHAR(32),
sal DOUBLE,
job VARCHAR(32),
deptno INT);
DESC my_tab01
#演示如何自我复制
#1、先把emp表的记录复制到my_tab01
INSERT INTO my_tab01(
id,`name`,sal,job,deptno)
SELECT empno,ename,sal,job,deptno
FROM emp;
#2、自我复制
INSERT INTO my_tab01
SELECT * FROM my_tab01;
SELECT COUNT(*) FROM my_tab01;
#如何删掉一张表的重复记录
#1、先创建一张表my_tab02
#2、让my_tab02有重复的记录
CREATE TABLE my_tab02 LIKE emp;#这个语句把emp表的结构(列),复制到my_tab02
DESC my_tab02;
INSERT INTO my_tab02
SELECT * FROM emp;
SELECT * FROM my_tab02;
#3、考虑去重my_tab02的记录
#(1)先创建一张临时表my_tmp,该表的结构和my_tab02一样
CREATE TABLE my_tmp LIKE my_tab02
#(2)把my_tmp的记录通过distinct关键字处理后,把记录复制到my_tmp
INSERT INTO my_tmp
SELECT DISTINCT * FROM my_tab02;
#(3)清除掉my_tab02记录
DELETE FROM my_tab02;
#(4)把my_tmp表的记录复制到my_tab02
INSERT INTO my_tab02
SELECT * FROM my_tmp;
#(5)drop 掉 临时表my_tmp
DROP TABLE my_tmp;
SELECT * FROM my_tab02;
#为什么不直接去重呢?因为直接去重只是显示出来的数据去重,实际上并没有去重
八、mysql表外连接
1、外连接
(1)左外连接:左侧的表完全显示
SELECT ...
FROM 表1 LEFT JOIN 表2
ON 条件 [ 表1:左表,表2:右表
(2)右外连接:右侧的表完全显示
SELECT ...
FROM 表1 RIGHT JOIN 表2
ON 条件 [ 表1:左表,表2:右表
(3)练习:
*提示:在实际的开发中,我们绝大多数情况下使用的是前面学过的连接
九、mysql约束
约束用于确保数据库的数据满足特定的商业规则。在mysql中,约束包括:not null, unique, primary key, foreign key和check五种
1、primary key
CREATE TABLE t31
(id INT PRIMARY KEY, #表示id列是主键
`name` VARCHAR(32),
email VARCHAR(32));
#主键不能重复且不能为null
INSERT INTO t31
VALUES(NULL,'hsp','hsp@sohu.com');
#一张表最多只能有一个主键,但可以是复合主键
CREATE TABLE t32
(id INT,
`name` VARCHAR(32),
email VARCHAR(32),
PRIMARY KEY(id,`name`)
);
#主键的指定方式有两种
#1、直接在字段名后指定:字段名 primary key
CREATE TABLE t33
(id INT,
`name` VARCHAR(32) PRIMARY KEY,
email VARCHAR(32)
);
#2、在表定义最后写primary key(列名);
CREATE TABLE t34
(id INT,
`name` VARCHAR(32),
email VARCHAR(32),
PRIMARY KEY(`name`)
);
#使用desc 表名,可以看到primary key的情况
DESC t31 #查看t31表的结果,显示约束的情况
2、not null
3、unique
4、foreign key
(1)用于定义主表和从表之间的关系:外键约束要定义在从表上,主表则必须具有主键约束或是unique约束,当定义外键约束后,要求外键列数据必须在主表的主键列存在或是为null
(2)
(3)细节说明:
1)外键指向的表的字段,要求是primary key或者是unique
2)表的类型是innodb,这样的表才支持外键
3)外键字段的类型要和主键字段的类型一致(长度可以不同)
4)外键字段的值,必须在主键字段中出现过,或者为null [前提是外键字段允许为null ]
5)一旦建立主外键的关系,数据不能随意删除了
5、check
(1)用于强制行数据必须满足的条件,假定在sal列定义了check约束,并要求sal列值在1000~2000之间如果不再1000~2000之间就会提示出错
(2)oracle和sql server均支持check,但是mysql5.7目前还不支持check,只做语法校验,但不会生效
*在mysql中实现check的功能,一般是在程序中控制,或者通过触发器完成
6、练习
CREATE DATABASE shop_db;
#goods
CREATE TABLE goods
(goods_id INT PRIMARY KEY,
goods_name VARCHAR(64) NOT NULL DEFAULT ' ',
unitprice DECIMAL(10,2) NOT NULL DEFAULT 0
CHECK(unitprice >= 1.0 AND unitprice <= 9999.99),
category INT NOT NULL DEFAULT 0,
provider VARCHAR(64) NOT NULL DEFAULT ' ');
#customer
CREATE TABLE customer
(customer_id CHAR(8) PRIMARY KEY,
`name` VARCHAR(64) NOT NULL DEFAULT ' ',
address VARCHAR(64) NOT NULL DEFAULT ' ',
email VARCHAR(64) UNIQUE NOT NULL,
sex ENUM('男','女') NOT NULL, #用枚举
card_id CHAR(18));
#purchase
CREATE TABLE purchase
(order_id INT UNSIGNED PRIMARY KEY,
customer_id CHAR(8) NOT NULL DEFAULT '',
goods_id INT NOT NULL DEFAULT 0,
nums INT NOT NULL DEFAULT 0,
FOREIGN KEY (customer_id) REFERENCES customer(customer_id),
FOREIGN KEY (goods_id) REFERENCES customer(goods_id);
DESC goods;
DESC customer;
DESC puchase;
7、自增长
*细节:
(1)一般来说自增长是和primary key配合使用的
(2)自增长也可以单独使用 [ 但需要配合一个unique ]
(3)自增长修饰的字段为整数型的(虽然小数也可以,但是非常少这样使用)
(4)自增长默认从1开始,你也可以通过如下命令修改alter table 表名 auto_increment = xxx;
(5)如果你添加数据时,给自增长字段(列)指定的有值,则以指定的值为准,如果指定了自增长,一般来说,就按照自增长的规则来添加数据
十、mysql索引
1、索引的原理:
(1)没有索引为什么会慢?
——因为全表扫描
(2)有索引为什么会快?
——形成一个索引的数据结构,比如二叉树
(3)索引的代价:
1)磁盘战胜
2)对dml(update delete insert)语句的效率影响,但项目中select的操作占到90%,比update,delete, insert多得多
2、索引的类型:
(1)主键索引,主键默认也为主键索引(类型primary key)
(2)唯一索引(UNIQUE)
(3)普通索引(INDEX)
(4)全文索引(FULLTEXT)[适用于MyISAM]
开发中考虑使用:全文搜索Solr和ElasticSearch(ES)。mysql自带的全文索引不好用。
3、索引使用
添加索引
CREATE [UNIQUE] INDEX index_name ON tal_name (col_name[(LENGTH)][ASC | DESC],...);
ALTER TABLE table_name ADD INDEX[index_name](index_col_name,...)添加主键(索引)
ALTER TABLE 表名 ADD PRIMARY KEY(列名,...);删除索引
DROP INDEX index_name ON tbl_name;
ALTER TABLE table_name DROP INDEX index_name;删除主键索引
ALTER TABLE t_ DROP PRIMARY KEY;
#创建索引
CREATE TABLE t38
(id INT,
`name` VARCHAR(32));
#查询表是否有索引
SHOW INDEXES FROM t38;
#添加索引:
#1、添加唯一索引
CREATE UNIQUE INDEX id_index ON t38(id);
#2、添加普通索引方式1:
CREATE INDEX id_index ON t38(id);
#添加普通索引方式2:
ALTER TABLE t38 ADD INDEX id_index(id)
#如果某列的值,是不会重复的,则优先考虑使用unique索引,否则使用普通索引
#3、添加主键索引
CREATE TABLE t39
(id INT,
`name` VARCHAR(32));
ALTER TABLE t39 ADD PRIMARY KEY(id)
SHOW INDEX FROM t39
#删除索引
DROP INDEX id_index ON t38
#删除主键索引
ALTER TABLE t39 DROP PRIMARY KEY
#修改索引:先删除,再添加新的索引
#查询索引
#方式1:
SHOW INDEX FROM t38
#方式2:
SHOW INDEXES FROM t38
#方式3:
SHOW KEYS FROM t38
#方式4:(不推荐)
DESC t38
4、练习
(1)
(2)
(3)
5、小结:
哪些列适合使用索引
(1)较频繁地作为查询条件字段应该创建索引
SELECT * FROM emp WHERE empno=1;
(2)唯一性太差的字段不适合单独创建索引,即使频繁作为查询条件
SELECT * FROM emp WHERE sex='男'
(3)更新非常频繁的字段不适合创建索引
SELECT * FROM emp WHERE logincount=1
(4)不会出现在WHERE子句中字段不该创建索引
十一、mysql事务
1、基本介绍:
事务用于保证数据的一致性,它由一组相关的dml语句组成,该组的dml语句要么全部成功,要么全部失败。如:转账就要用事务来处理,用以保证数据的一致性
2、事务和锁:
当执行事务操作时(dml语句),mysql会在表上加锁,防止其它用户改表的数据。
3、事务操作
(1)回退事务
保存点(savepoint):事务中的点用于取消部分事务,当结束事务时(commit) 会自动的删除该事务所定义的所有保存点。当执行回退事务时,通过指定保存点可以回退到指定的点。
(2)提交事务
使用commit语句可以提交事务,当执行了commit语句子后,会确认事务的变化、结束事务、删除保存点、释放锁,数据生效。
当使用commit语句结束事务子后,其它会话[其他连接]将可以查看到事务变化后的新数据[所有数据就正式生效.]
4、事务细节
(1)如果不开始事务,默认情况下,dml操作是自动提交的,不能回滚
(2)如果开始一个事务,你没有创建保存点。你可以执行rollback,默认就是回退到你事务开始的状态
(3)你也可以在这个事务中(还没有提交时),创建多个保存点。比如:
savepoint aaa;
savepoint bbb; #执行dml
(4)你可以在事务没有提交前,选择回退到哪个保存点
(5)mysql的事务机制需要innodb的存储引擎还可以使用,myisam不好使
(6)开始一个事务start transaction 或 set autocommit=off;
5、事务隔离级别
(1)多个连接开启各自事务操作数据库中数据时,数据库系统要负责隔离操作,以保证各个连接在获取数据时的准确性。(通俗解释)
(2)如果不考虑隔离性,可能会引发如下问题:
1)脏读 (dirty read):一个事务读取另一个事务尚未提交的修改
2)不可重复读(nonrepeatable read):同一查询在同一事务中多次进行,由于其他提交事务所做的修改或删除,每次返不同的结果集
3)幻读(phantom read):同一查询在海务中多次进行,由于其他提交事务所做的插入操作,每次返回不同的结果集
(3)查看当前会话隔离级别:select @@tx_isolation;
·全局修改, 修改mysql.ini配置文件,在最后加上
#可选参数有: READ-UNCOMMITTED,READ-COMMITTED,REPEATABLE-READ,SERIALIZABLE.
[mysqld]
transaction-isolation = REPEATABLE-READ
6、事务的acid特性
(1)原子性(Atomicity)
原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生
(2)一致性(Consistency)
事务必须使数据库从一个一致性状态变换到另外一个一致性状态
(3)隔离性(Isolation)
事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离
(4)持久性(Durability)
持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的。接下来即便数据库发生故障也不应该对其有任何影响
7、mysql类型和存储引擎
(1)基本介绍:
1)MySQL的表类型由存储引擎(Storage Engines)决定,主要包括MyISAM、innoDB、Memory等。
2)MySQL数据表主要支持六种类型,分别是: CSV、Memory、 ARCHIVE、MRG_MYISAM、MYISAM、InnoBDB.
3)这六种又分为两类,一类是”事务安全型”((transaction-safe),比如:
InnoDB:其余都属于第二类,称为”非事务安全型(non-transaction-safe)[mysiam和memory]
(2)主要的存储引擎 / 表类型特点
(3)细节:
1)MyISAM不支持事务、也不支持外键, 但其访问速度快,对事务完整性没有要求
2)InnoDB存储引擎提供了具有提交、回滚和前恢复能力的事务安全。但是比起MyISAM存储引擎,InnoDB写的处理效率差一些并且会占用更多的磁盘空间以保留数据和索引。
3)MEMORY存储引擎使用存在内存中的内容来创建表。每个MEMORY表只实际对应一个磁盘文件。MEMORY类型的表访问非常快,因为它的数据是放在内存中的,并且默认使用HASH索引。但是一旦服务关闭,表中的数据就会丢失掉,表的结构还在
(4)如何选择表的存储引擎
1)如果你的应用不需要事务, 处理的只是基本的CRUD操作,选MyISAM,速度快
2)如果需要支持事务,选择InnoDB
3)Memory存储引擎就是将数据存储在内存中,由于没有磁盘I./0的等待,速度极快。但由于是内存存储引擎,所做的任何修改在服务器重启后都将消失。(经典用法:用户的在线状态)
十二、视图(view)
1、引入
2、基本介绍:
(1)视图:是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含列,其数据来自对应的真实表(基表)
(2)视图和对应的真实表(基本)的关系
3、视图的基本使用
*create view 视图名 as select 语句
*alter view 视图名 as select 语句
*SHOW CREATE VIEW 视图名
*drop view 视图名1,视图名2
4、细节:
(1)创建视图后,到数据库去看,对应视图只有一个视图结构文件(形式:视图名.frm)
(2)视图的数据变化会影响到基表,基表的数据变化也会影响到视图[insert update delete]
——针对前面的员管理系统——
mysql> create view myview as select empno,ename,job,comm from emp;
mysql> select * from myview;
mysql> update myview set comm=200 where empno=7369;//修改视图,对基表都有变化
mysql> update emp set comm=100 where empno=7369;//修改基表,对视频也有变化
(3)视图中可以再使用视图,数据仍然来自基表【案例演示】
#创建一个视图,只能查询emp表的(empno, ename, job和deptno)信息
#创建视图
CREATE VIEW emp_view01
AS
SELECT empno,ename,job,deptno FROM emp;
#查看视图
DESC emp_view01
SELECT * FROM emp_view01;
SELECT empno,job FROM emp_view01;
#查看创建视图
SHOW CREATE VIEW emp_view01
#删除视图
DROP VIEW emp_view01;
#细节:
#1、创建视图后,到数据库去看,对应视图只有一个视图结构文件(形式:视图名.frm)
#2、视图的数据变化会影响到基表,基表的数据变化也会影响到视图
#修改视图
UPDATE emp_view01
SET job='MANAGER'
WHERE empno=7369
SELECT * FROM emp; #查询基表
SELECT * FROM emp_view01;
#修改基表,会影响到视图
UPDATE emp
SET job='SALESMAN'
WHERE empno=7369
#3、视图中可以再使用视图,比如从emp_view01视图中,
#选出empno和ename做出新视图
CREATE VIEW emp_view02
AS
SELECT empno,ename FROM emp_view01
5、实践
(1)安全。一些数据表有着重要的信息。有些字段是保密的,不能让用户直接看到。这时就可以创建一个视图,在这张视图中只保留一部分字段。这样,用户就可以查询自己需要的字段,不能查看保密的字段
(2)性能。关系数据库的数据常常会分表存储,使用外键建立这些表的之间关系。这时,数据库查询通常会用到连接(JOIN)。这样做不但麻烦,效率相对也比较低。如果建立一个视图,将相关的表和字段组合在一起,就可以避免使用JOIN查询数据
(3)灵活。如果系统中有一张旧的表, 这张表由于设计的问题,即将被废弃。然而,很多应用都是基于这张表,不易修改。这时就可以建立一张视图,视图中的数据直接映射到新建的表。这样,就可以少做很多改动,也达到了升级数据表的自的
6、练习
十三、MySQL用户管理
1、基本介绍
(1)mysql中的用户,都存储在系统数据库mysql中的user表中
(2)其中user表的重要字段说明:
1)host:允许登录的“位置”,localhost表示该用户只允许本机登录,也可以指定ip地址,比如:192.168.1.100
2)user: 用户名;
3)authentication_string:密码,是通过mysql的password()函数加密之后的密码。
2、使用
(1)创建用户
create user '用户名' @ '允许登录位置' identified by '密码'
#创建用户,同时指定密码
(2)删除用户
drop user '用户名' @ '允许登录位置' ;
(3)用户修改密码
#修改自己的密码:
set password = password('密码');
#修改他人的密码(需要有修改用户密码权限)
set password for '用户名' @ '登录位置' = password('密码');
3、细节
(1)在创建用户的时候,如果不指定Host,则为%,%表示表示所有IP都有连接权限
create user xxx;
(2)你也可以这样指定
create user 'xxx' @ '192.168.1.%' 表示xxx用户在192.168.1.*的ip可以登录mysql
(3)在删除用户的时候,如果host不是%,需要明确指定 '用户' @ 'host值'