55、MySOL数据库

news2024/11/16 23:52:50

目录

一、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值'

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/139320.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

kettle - 清洗 mongodb 数据案例

文章目录前言kettle - 清洗 mongodb 数据案例一、需求二、kettle开发1、新建mongodb数据查询2、配置kettleTest集合与清洗后kettleTestClear集合字段映射3、根据_id进行排序4、使用java脚本将日期格式化5、进行字段选择6、将delete字段进行值映射7、mongo输出8、最后加一个写日…

详解哨兵之间是如何通信的

基于 pub/sub 机制的哨兵集群组成 哨兵实例之间可以相互发现&#xff0c;要归功于 Redis 提供的 pub/sub 机制&#xff0c;也就是发布 / 订阅机制。 哨兵只要和主库建立起了连接&#xff0c;就可以在主库上发布消息了&#xff0c;比如说发布它自己的连接信息&#xff08;IP 和…

PDF如何转换成PPT?教你们几个简单方法

我们在工作经常用PDF文件进行传输&#xff0c;因为PDF体积小&#xff0c;传输速度很快&#xff0c;还不会不同设备上出现不兼容的问题&#xff0c;可以很好的保持文件的排版&#xff0c;不过我们有时候需要进行文件的展示&#xff0c;所以需要将PDF文件转换为PPT文件&#xff0…

2023河南/北京/重庆/南京DAMA-CDGA/CDGP数据治理工程师认证报名

DAMA认证为数据管理专业人士提供职业目标晋升规划&#xff0c;彰显了职业发展里程碑及发展阶梯定义&#xff0c;帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力&#xff0c;促进开展工作实践应用及实际问题解决&#xff0c;形成企业所需的新数字经济下的核心职业…

论文阅读——Recognizing Emotion Cause in Conversations

文章目录摘要引言相关工作任务定义构造RECCON数据集情绪原因的类型实验任务1&#xff1a;Causal Span Extraction模型任务2&#xff1a;Causal Emotion Entailment模型面临的挑战摘要 识别文本中情绪背后的原因是NLP中一个未被探索的研究领域。这个领域的发展具有着改善情感模…

Docker基础1-3

Docker基础1-3 时间:2023-01-02 https://www.bilibili.com/video/BV1gr4y1U7CY/ xmind文档&#xff1a;https://www.aliyundrive.com/s/6iaQt9zLDVm 一、Docker简介 1、Docker解决了什么问题 Docker打破了过去「程序即应用」的观念。透过镜像(images)将作业系统核心除外&am…

LeetCode:15. 三数之和

15. 三数之和1&#xff09;题目2&#xff09;思路3&#xff09;代码4&#xff09;结果1&#xff09;题目 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] …

【Nginx】核心配置文件结构

文章目录Nginx核心配置文件结构全局块user指令work process指令其他指令events块events指令配置实例http块定义MIME-Type自定义服务日志其他配置指令server块和location块Nginx服务器基础配置实例Nginx核心配置文件结构 从前面的内容学习中&#xff0c;我们知道Nginx的核心配置…

给力!低代码开发平台广州流辰信息科技助您增辉创价值!

低代码平台开发公司流辰信息深耕行业多年&#xff0c;一直以市场为导向&#xff0c;凭借敏锐的市场洞察力砥砺前行、拼搏进取&#xff0c;提升研发创新能力&#xff0c;广州流辰信息科技与各新老客户朋友风雨同舟&#xff0c;携手共创宏伟新蓝图&#xff01; 一、熔铸前沿科技 …

kettle的安装以及注意(迭代中....)

1、下载 kettle的官网下载地址&#xff1a;Pentaho from Hitachi Vantara - Browse Files at SourceForge.net 如果需要下载其他版本&#xff1a; 直接点击对应的版本Name&#xff08;8.0以下的实在Data Integration文件夹里面&#xff09;进去&#xff0c;再选择client-too…

【C++】代码调试的学习笔记

1. IO输出调试&#xff1a;输出重定向 在《第八期-C基础与深度解析》课程中&#xff0c;老师使用了“输出重定向”的语句来查看cout和cerr的结果&#xff1a; ./HelloWorld >txt1 2>txt2 代码含义&#xff1a;将程序HelloWorld的标准输出stdout重定向至文件txt1&#xf…

百趣代谢组学分享:从SWATH到MRM:一种新型高覆盖度靶向代谢组学技术

百趣代谢组学文献分享&#xff0c;SWATHtoMRM: Development of High-Coverage Targeted Metabolomics Method Using SWATH Technology for Biomarker Discovery&#xff0c;是由中国科学院生物与化学交叉研究中心&#xff0c;Dr. Zheng-Jiang Zhu课题组发表在AC上的一篇技术型文…

verilog学习笔记- 3)SignalTap II 软件的使用

目录 SignalTap II简介&#xff1a; SignalTap II使用&#xff1a; SignalTap II简介&#xff1a; SignalTap II 全称 SignalTap II Logic Analyzer&#xff0c;是第二代系统级调试工具&#xff0c;可以捕获和显示实时信号&#xff0c;是 一款功能强大且极具实用性的 FPGA 片…

IO模型详解

什么是IO呢?什么是阻塞非阻塞IO?什么是同步异步IO?什么是IO多路复用?select/epoll跟IO模型有什么关系?有几种经典IO模型呢?BIO、NIO、AIO到底有什么区别的? 什么是IO呢? IO,英文全称是Input/Output,翻译过来就是输入/输出。平时我们听得挺多,就是什么磁盘IO,网络I…

LCHub:2023年低代码开发平台市场规模将增长25%至100亿美元

随着企业希望变得更加敏捷、业务流程更加自动化,并创建新的Web和移动应用来满足消费者的需求,自动化开发工具正在成为关键因素,尤其在IT人才持续短缺的情况下。 根据调研机构最近进行的一项研究,面对持续的IT技能短缺,低代码和无代码平台等能够实现流程自动化并使员工能…

便捷生活,你我共享 | 美格智能Cat.1模组为共享经济赋能

近年来&#xff0c;共享经济在国内的兴起&#xff0c;主要基于两大优势&#xff0c;一是资源共享&#xff0c;为人们的生活带来便捷&#xff1b;二是绿色低碳&#xff0c;符合社会的发展潮流。作为近年来经济发展的新业态&#xff0c;共享经济的快速普及&#xff0c;以及带来的…

SpringMVC的请求参数传递

1&#xff0c;简单参数类型 单个参数 发送&#xff1a; http://localhost/commonParam?nameitcast接收&#xff1a; Controller public class UserController {RequestMapping("/commonParam")ResponseBodypublic String commonParam(String name){System.out.pr…

LeetCode:12. 整数转罗马数字

12. 整数转罗马数字1&#xff09;题目2&#xff09;思路3&#xff09;代码4&#xff09;结果1&#xff09;题目 罗马数字包含以下七种字符&#xff1a;I&#xff0c; V&#xff0c; X&#xff0c; L&#xff0c;C&#xff0c;D 和 M。 字符 数值 I 1 V …

带有数字化伪装外观,全新ID.7轿车即将全球首发

一切就绪&#xff0c;ID.7即将出场&#xff01;今年的CES展会将于2023年1月5日至8日在拉斯维加斯举行。展览期间&#xff0c;大众汽车集团&#xff08;美国&#xff09;将展出基于模块化电驱动平台&#xff08;MEB&#xff09;打造的首款纯电三厢轿车。展车将采用智能伪装外观&…