MySQL

数据库

           概念:存储和管理数据的仓库
           常见的数据库产品:
                   Oracle:oracle公司   大型的关系型数据库,收费
                   DB2:IBM公司   大型的关系型数据库 ,收费
                   Mysql:mysql公司中小型的关系型数据库,免费
                   Sql Server:微软公司,中小型数据库,收费
                   Sqllite:安卓系统内置数据库,微型关系型数据库,免费
                   NoSql系列数据库:not only sql,非关系型数据库

数据库软件

          卸载:
                   1.关闭mysql服务:
                              1.手动关闭:我的电脑----->右键----->管理
                              2.cmd----->services.msc,打开服务面板
                              3.cmd----->net stop mysql(注意获取cmd管理员权限)
                     2.卸载
                     3.删除数据存储文件:找到mysql的安装目录中的my.ini文件,datadir目录,删除
           使用:
	                  登陆数据库:cmd-->mysql -uroot -p你自己的密码
	                  服务:系统后台进程
		              启动服务: net start mysql
		             停止服务: net stop mysql
           配置:
	                 修改mysql的密码步骤:
	                          1) 停止mysql服务 运行输入services.msc 停止mysql服务
		                       或者 cmd --  net stop mysql
	                          2) 在cmd下 输入 mysqld --skip-grant-tables 启动服务器 光标不动 (不要关闭该窗口)
	                         3) 新打开cmd 输入mysql -u root -p 不需要密码 
		                           use mysql;
	                               update user set password=password('abc') WHERE User='root';
	                        4) 关闭两个cmd窗口 在任务管理器结束mysqld 进程 
	                        5) 在服务管理页面 重启mysql 服务

SQL:结构化查询语言

sql分类:
	DDL(Data Definition Language):数据定义语言,用来定义数据库对象:库、表、列等;
	DML(Data Manipulation Language):数据操作语言,用来定义数据库记录(增、删、改)
	DCL(Data Control Language):数据控制语言,用来定义访问权限和安全级别;
	DQL(Data Query Language):数据查询语言,用来查询记录(数据)。

DDL:

DDL:操作数据库 和 表
	* 操作数据库:
		* 创建:create database 数据库名称;
		* 删除:drop database 数据库名称;
		* 修改:ALTER DATABASE mydb1 CHARACTER SET 要修改的字符集名称
		* 查询:show databases; -- 查询所有数据库的名称
				show create database 数据库名称; -- 查询创建数据库语句
	
	* 操作表:
		* 创建:
			* 列的数据类型:
				 	* int:整型		id int,
				 	* double:浮点型,例如double(5,2)表示最多5位,其中必须有2位小数,即最大值为999.99;
										money double(5,2)
				 	char:固定长度字符串类型;
							name char(10)		"张三"
				 	* varchar:可变长度字符串类型;
							name varchar(10)	"张三"
				
				 	text:字符串类型;存大格式的文本 比如存个小说 一般不用
				 	blob:字节类型;存字节类型的数据  比如电影字节  图片字节 但是一般不会把字节数据存到数据库当中
				 	date:日期类型,格式为:yyyy-MM-dd;
				 	time:时间类型,格式为:hh:mm:ss
					datetime:日期时间类型   yyyy-MM-dd hh:mm:ss
				 	* timestamp:时间戳类型	 yyyy-MM-dd hh:mm:ss
						* 如果该类型的字段不给赋值,则默认当前时间
		
			* 语法:
				create table 表名(
					列名1 类型1,
					列名2 类型2,
					...
					列名n 类型n
				
				);
			
				create table student(
					sname varchar(20),
					age int,
					gender varchar(6)
				);
			
			
			
		* 删除:drop table 表名;
		* 修改:
			1.	修改之添加列:给stu表添加classname列:
				ALTER TABLE stu ADD (classname varchar(100));
			2.	修改之修改列类型:修改stu表的gender列类型为CHAR(2):
				ALTER TABLE stu MODIFY gender CHAR(2);
			3.	修改之修改列名:修改stu表的gender列名为sex:
				ALTER TABLE stu change gender sex CHAR(2);
			4.	修改之删除列:删除stu表的classname列:
				ALTER TABLE stu DROP classname;
			5.	修改之修改表名称:修改stu表名称为student:
				ALTER TABLE stu RENAME TO student;

		
		* 查询:show tables; -- 查询该数据库下所有表名称
				desc 表名; -- 查询表结构
			* 注意:操作表之前,应该先选择一个数据库使用:use 数据库名称;

DML

* DML:操作表中的数据
	* 增:
		* 语法:
			* insert into 表名(列名1,列名2,...)	values(值1,值2,....);
				* 注意:如果表的所有列都添加值,则列名可以省略
		
		insert into stu(sname,age) values("lisi",23);
		insert into stu(sname,age,sex) values("zhangsan",23,'1');
		insert into stu values("ww",23,'2');
	* 删:
		* 语法:
			* delete from 表名 [where 条件];
			* truncate table 表名;-- 删除所有记录
				* 先删除表,再创建表。
			
			delete from stu	where sname = 'lisi'
		
	* 改:
		* 语法:
			* update 表名	set 列名1 = 值1 , 列名2 = 值2... [where 条件]
			
			update stu set sex = "1" where sname = "lisi";
			
			update 
				customer 
			set 
				money = 500000
			where 
				id = xxx;

DQL

* DQL:查询
	* 语法:
		SELECT 
			selection_list /*要查询的列名称*/
		FROM 
			table_list /*要查询的表名称*/
		WHERE 
			condition /*行条件*/
		GROUP BY 
			grouping_columns /*对结果分组*/
		HAVING 
			condition /*分组后的行条件*/
		ORDER BY 
			sorting_columns /*对结果分组*/
		LIMIT 
			offset_start, row_count /*结果限定*/

	
	* 条件查询:where 子句
		=、!=、<>(不等于)、<、<=、>、>=;
		BETWEEN…AND;  在什么范围之间
		IN(set);
		IS NULL;为空
		IS NOT NULL 不为空
		AND; 并且
		OR;   或者
		NOT;非

模糊查询:

* 模糊查询:like
   * 通配符
			* _:匹配单个任意字符
			
		比如: 我要查询姓名是3个任意字符组成的
		select  * from student sname like='___';
		例如:我要查询第二个字符是m的
		select * from student where sanme like '_m%';
		
	* %:匹配多个任意字符
		例如:我要查询名字中包含m的 select * from student where sname like '%m%';
		例如我要查询名字是a开头的 select * from student where sname like 'a%';
		例如我要查询名字是b结尾的 select * from student wher like '%b';
		
	* 字段控制:
		* 修改字段的别名:AS (可以省略)
			* 给字段起别名:
			例如:   select sname as 姓名, sage 年龄 from student;
			*给运算字段起别名:
			 例如: select sname as 姓名, (工资+奖金) as 总收入 from student;

			* 给表起别名:给每一张表起一个别名。简化书写
	例如: select stu.sname, stu.sage from student as stu;
		* 字段运算:
			* null参与的运算,结果都为null  
			比如 工资 是100  奖金是null  我们让这两个字段运算 那结果就为null
			* 一般会将null替换为0: ifnull(字段名称,如果是null的替换值)  ifnull 是mysql的方言
			
			所有如果奖金字段为null 一般我们把奖金替换为0
			例如: select sname,(工资+ifnull(奖金,0)) as 总收入from student;
					
		* 去除重复记录   比如我查询工资是3000的 出现了多条工资为3000 的记录 那我只想展示一条3000的记录  所以可以用 distinct 去除重复记录
			* DISTINCT     

			例如: select distinct 工资  from student;

排序

	排序: order by  默认升序排列  ASC 默认值                DESC 降序排列
	 按工资从小到大排
	select * from student order by 工资 asc;
	按工资从大到小排
	select * from student order by 工资 desc 
	如果出现多条工资一样的 那我们可以指定第二排序条件 
	select * from student order by 工资 desc,奖金desc;

聚合函数:

* 聚合函数:
	* 聚合函数是用来做纵向运算的函数:
	 	COUNT():统计指定列不为NULL的记录行数; 统计个数的 比如我统计有多少个学生
		select count(sid) from student;  或者传个星 号    select count(*) from student;         一般不要传有null 值的字段

	 	MAX():计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;
		例如 查询工资最大值    select max(工资) as 最高工资 from student;
		
	 	MIN():计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;
		例如 查询 最少工资   select min(工资) as 最小工资 from student;
	 	SUM():计算指定列的数值和,如果指 定列类型不是数值类型,那么计算结果为0;
		 例如 计算总工资  select sun(工资) as 总支出 from student;

	 	AVG():计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;
		例如:计算平均 工资 select avg(工资) as 平均工资 from student;

分组查询:

* 分组查询:group by     一般配合聚合函数使用 查出的数据才有意义
	* 查询的字段:
		1.分组字段本身
		2.聚合函数
	比如我按部分编号分组  比如有三个部门 然后我求每个部门的平均工资  那展示出来的数据应该有三条
	例如: select 部门编号,AVG(工资) from student group by 部门编号;

	1.例如查询 每个部门的部门编号 已经每个部门工资大于1500的人数
	     select 部门编号, count(*) from student where 工资>1500 group by 部门编号;
      	注意这里的 where 是对分组前的条件限定 也就是说不满足条件的 不参与分组

	* where和having
		* where:在分组之前对条件进行限定。不满足条件,就不会参与分组
		* having:在分组之后,对结果集的筛选

	2.例如 我要查询 各个部门平均工资 大于2000 的部门
	select 部门编号,avg(工资) from student group by 部门编号 having avg(工资)>2000;
	
	3. 例如我要查询 各个部门  员工工资大于1500 的平均工资  并且平均工资 大于2000的部门
	 上面这句话怎么理解呢? 首先查询各个部门 那肯定要按部门编号分组 分组前的条件限定是 员工工资大于1500的才参与分组
	计算出平均工资  然后对结果再进行筛选 筛选出 平均工资 大于2000的部门
	
	select 部门编号,avg(工资) from student group by 部门编号 where avg(工资)>1500 having  avg(工资)>2000;

分页查询:

* 分页查询:limit
	* limit 0,5 开始的记录索引, 每一页显示的条数     索引从0开始
		开始的记录索引  = 	(页码-1)*每一页显示的条数

	例如 我显示第一页  每页5条记录
	select * from student limit 0,5 ;  这是第一页 5 条记录
	select * from student limit 5,5 ; 这是第二页 5条记录
	select * from student limit 10,5 这是第三页 5条记录
	
	* oracle:rownum 分页方言
	* sqlserver:top 分页方言

约束

约束:为了保证数据的有效性和完整性

mysql中常用的约束:
		主键约束(primary key)  
		唯一约束(unique) 
		非空约束(not null) 
		外键约束(foreign key)
		sex ENUM('男','女')  -- 把一个字段的数据类型设置为枚举类型 也可以起到一种约束的效果

约束:

主键约束:被修饰过的字段唯一非空
	注意:一张表只能有一个主键,这个主键可以包含多个字段
	方式1:建表的同时添加约束 格式: 字段名称 字段类型 primary key
   	方式2:建表的同时在约束区域添加约束 
		所有的字段声明完成之后,就是约束区域了
		格式: primary key(字段1,字段2)
		
		create table pk01(
			id int,
			username varchar(20),
			primary key (id)
		);
		
		insert into pk01 values(1,'tom');-- 成功
		insert into pk01 values(1,'tom');-- 失败 Duplicate entry '1' for key 'PRIMARY'
		insert into pk01 values(null,'tom');-- 失败  Column 'id' cannot be null
		
		create table pk01(
			id int primary key,
			username varchar(20),
			primary key (id)
		);-- 错误的 一张表只能有一个主键
		
	方式3:建表之后,通过修改表结构添加约束
		create table pk02(
			id int,
			username varchar(20)
		);
		
		alter table pk02 add primary key(字段名1,字段名2..);
		alter table pk02 add primary key(id,username);
		
		insert into pk02 values(1,'tom');-- 成功
		insert into pk02 values(1,'tomcat');-- 成功
		insert into pk02 values(1,'tomcat');-- 失败

	删除主键约束:分两种情况
		情况1: 这个字段,只有主键约束,分两步来删除主键约束
		  第一步:       alter table 表名 drop primary key;  -- 这样只删除了唯一,他还有个非空约束,所以得再删除非空约束
		  第二步:       alter table [表名] modify [列名] varchar(20) null; --修改字段名还为原来的字段 加上null即可
		情况2: 这个字段,是一个int类型字段,既有主键约束,又有自增长约束,那么得先删除自增长约束,在删除主键约束
		   第一步:删除自增长约束,其实就是修改自增长字段名和数据类型还为原来的字段名和类型
			alter table 表名 change 字段名 字段名 数据类型; --删除自增长约束
                                               第二步:删除主键约束
			alter table 表名 drop primary key;
		   第三步:删除非空约束
		    ALTER TABLE test3 MODIFY sid INT NULL;  -- 就是修改字段值可以为null

唯一约束:

唯一约束:(了解)
	被修饰过的字段唯一,对null不起作用
	方式1:建表的同时添加约束 格式: 字段名称 字段类型 unique
		create table un(
			id int unique,
			username varchar(20) unique
		);
		
		insert into un value(10,'tom');-- 成功
		insert into un value(10,'jack');-- 错误 Duplicate entry '10' for key 'id'
		insert into un value(null,'jack');-- 成功
		insert into un value(null,'rose');-- 成功
		
	方式2:建表的同时在约束区域添加约束 
		所有的字段声明完成之后,就是约束区域了
		unique(字段1,字段值2...)
	方式3:建表之后,通过修改表结构添加约束
		alter table 表名 add unique(字段1,字段2);-- 添加的联合唯一
		alter table 表名 add unique(字段1);-- 给一个添加唯一
		alter table 表名 add unique(字段2);-- 给另一个添加唯一
		
		
			create table un01(
				id int,
				username varchar(20)
			); 
			alter table un01 add unique(id,username);
			insert into un01 values(1,'tom');-- 成功
			insert into un01 values(1,'jack');-- 成功
			insert into un01 values(1,'tom');-- 失败  Duplicate entry '1-tom' for key 'id'

非空约束:

非空约束(了解)
	特点:被修饰过的字段非空
	方式:
		create table nn(
			id int not null,
			username varchar(20) not null
		);
		
		insert into nn values(null,'tom');--  错误的 Column 'id' cannot be null

清空表truncate

格式:
    truncate 表名; 干掉表,重新创建一张空表
和delete from 区别:
	delete属于DML语句  truncate属于DDL语句
	delete逐条删除	truncate干掉表,重新创建一张空表

auto_increment自增

要求:
     1.被修饰的字段类型支持自增,一般int
     2.被修饰的字段必须是一个key,一般是primary key
create table ai01(
	id varchar(10) auto_increment
);-- 错误 Incorrect column specifier for column 'id'

create table ai01(
	id int auto_increment
);-- 错误 Incorrect table definition; there can be only one auto column and it must be defined as a key

案例1:创建多表

案例2-创建多表,可以描述出表于表之间的关系
需求:
	把网上商城里面用的实体创建成表,并且将他们之间建立关系
网上商城的实体:用户 订单 商品 分类
常见关系:
	一对多. 用户和订单  分类和商品
	多对多. 订单和商品	学生和课程
	一对一. 丈夫和妻子	
一对多
      在开发中,关系中的一方称之为主表或者一表,关系中的多方称之为多表或者从表,
为了表示一对多的关系,一般会在多表的一方添加一个字段,字段名称自定义(建议:主表的名称_id)
字段类型一般和主表的主键的类型保持一致,我们称这个字段为外键
一对多:用户和订单
-- 创建用户表
	create  table user(
		id int primary key auto_increment,
		username varchar(20)
	);
-- 创建订单表
create  table orders(
	id int primary key auto_increment,
	totalprice double,
	user_id int   
);

为了保证数据的有效性和完整性,添加约束(外键约束).
	在多表的一方添加外键约束
		格式:
			alter table 多表名称 add foreign key(外键名称) references 一表名称(主键);
		例如:
			alter table orders add foreign key(user_id) references user(id);
添加了外键约束之后有如下特点:★
	1.主表中不能删除从表中已引用的数据
	2.从表中不能添加主表中不存在的数据
开发中处理一对多:★
	在多表中添加一个外键,名称一般为主表的名称_id,字段类型一般和主表的主键的类型保持一致,
	为了保证数据的有效性和完整性,在多表的外键上添加外键约束即可.
那如果添加了外键后我想删除主表中的数据 怎么办 ?
	方式1: 级联删除
		ALTER TABLE orders ADD FOREIGN KEY(user_id) REFERENCES users(id) ON DELETE CASCADE; 
        	          	然后你就可以删除主表中的数据了
		当然你可以级联删除和级联更新 都加上 FOREIGN KEY (sid) REFERENCES stu(sid) ON DELETE CASCADE ON UPDATE CASCADE)
	方式2:先把带有外键的多表的数据删除,再删除一表中的数据
多对多
	例子:商品和订单
		-- 创建商品表
	create table product(
		id int primary key auto_increment,
		name varchar(20),
		price double
	);

	-- 创建中间表
	create table orderitem(
		oid int,
		pid int
	);
		
	-- 添加外键约束 
	alter table orderitem add foreign key(oid) references orders(id);
	alter table orderitem add foreign key(pid) references product(id);
开发中处理多对多:★
	引入一张中间表,存放两张表的主键,一般会将这两个字段设置为联合主键,这样就可以将多对多的关系拆分
	成两个一对多了
	为了保证数据的有效性和完整性
		需要在中间表上添加两个外键约束即可.

案例2:多表查询

内连接:★
	格式1:显式的内连接
		select a.*,b.* from a [inner] join b on ab的连接条件
	格式2:隐式的内连接
		select a.*,b.* from a,b where ab的连接条件
外连接:★
	左外连接:★
		select a.*,b.* from a left [outer] join b on 连接条件;  outer 可以不写
		意思:
			先展示join左边的(a)表的所有数据,根据条件关联查询 join右边的表(b),符合条件则展示出来,不符合以null值展示.
	右外连接:
		select a.*,b.* from b right [outer] join a on 连接条件;  outer 可以不写
		意思:
			先展示jion右边的表(a)表的所有数据,根据条件关联查询join左边的表(b),符合条件则展示出来,不符合以null值展示.
子查询:★
	一个查询依赖另一个查询.
练习1:
	1.查询用户的订单,没有订单的用户不显示
		隐式内连接:
			select user.*,orders.* from user ,orders where user.id=orders.user_id;
		显示内连接
			select user.*,orders.* from user join orders on user.id=orders.user_id;
	2.查询所有用户的订单详情
		左外连接: user在左
			select user.*,orders.* from user left join orders on user.id=orders.user_id;
	3.查询所有订单的用户详情
		右外连接:orders 在右
			select orders.*,user.* from user right join orders on user.id=orders.user_id;
练习:
	一. 查看用户为张三的订单详情
		1.先查询张三的id
			select id from User where username = '张三';// 3
		2.select * from orders where user_id = ?;
		
		两个合二为一  注意:后面的条件 把括号带上
			select * from orders where user_id = (select id from User where username = '张三'); --注意带上括号
	二. 查询出订单的价格大于300的所有用户信息。
		1.先查询出订单价格>300的用户的id
			select user_id from orders where price >300;//(3,3,5,null)
		2.select * from user where id in(3,3,5,null);
		
		两个合二为一:
			select * from user where id in(select user_id from orders where price >300);
	三. 查询订单价格大于300的订单信息及相关用户的信息。
		方式1:内连接:
			select orders.*,user.* from orders,user where user.id=orders.user_id  and orders.price>300 ;
		
		方式2:子查询: 是将一个查询的结果作为一张临时表	
			
			先查出 订单大于三百的 订单  然后把可以作为一个临时表    select * from orders where price>300
			合二为一条  注意给临时表 起个别名 注意给表起别名 名字不要带引号
			 其实用的就是内链接 查两张表 注意把临时表用户括号括起来
			select user.*,tmp.* from user,(select * from orders where price>300) as tmp where user.id=tmp.user_id;
	
	给表起别名
		格式: 表 [as] 别名

	
	## 5.自连接查询---通过表的别名,给一张表起两个别名,将他视为两张表,来进行查询

 		 比如:我要查询emp表中 员工姓名 所对应的 老板姓名
	
 		 因为这些信息都在一张表 emp中 
  		比如 员工号7369 的 SMITH 他对应的老板编号是(MGR) 7902 而7902 又是员工FORD(7902) 那FORD 对应的老板编号又是 7566
  		所以说 一个员工既是某几个员工的老板,他也有自己的老板
  		所以我要查询这个员工的所对应的老板 就可以使用自连接查询

		我们假设有两张表一张员工表,一张老板表,如果员工的老板号=老板的员工号 就表示这个员工是另外一个员工的老板
		 select e.ename as 员工姓名,b.ename as 老板姓名 from emp e,emp b where e.mgr=b.empno; 
 多表查询练习表
	初始化数据:
	-- 用户表(user) 
	   create table `user` (                                  
			  `id` int auto_increment primary key,                
			  `username` varchar(50)  -- 用户姓名                                                
			);

	-- 订单表(orders)
	   create table `orders` (                                                  
			  `id` int  auto_increment primary key,                                  
			  `price` double,                                           
			  `user_id` int                                       
			);
	-- 给订单表添加外键约束
	alter table orders add constraint user_fk foreign key (user_id) references user(id); 

	-- 向user表中添加数据
			insert into user values(3,'张三');
			insert into user values(4,'李四');
			insert into user values(5,'王五');
			insert into user values(6,'赵六');

	-- 向orders 表中插入数据
			insert into orders values(1,1314,3);
			insert into orders values(2,1314,3);
			insert into orders values(3,15,4);
			insert into orders values(4,315,5);
			insert into orders values(5,1014,null);

存储过程procedure

概念:
     存储过程是数据库中的一个对象,存储在服务端,用来封装多条SQL语句且带有逻辑性,可以实现一个功能,由于他在创建时,就已经对SQL进行了编译,所以执行效率高,而且可以重复调用,类似与我们Java中的方法
语法:
    DELIMITER $$
CREATE
    PROCEDURE `performance_schema`.`myTestPro`()
    BEGIN
    END$$
DELIMITER ;
注意:创建存储过程需要管理员分配权限

触发器 Trigger

概念: 
      数据库中的一个对象,相当于JS中的监听器,触发器可以监听 增删改 三个动作
 比如说我想监听一张表,只要我增删改了这张表中的数据,我就可以触发这个触发器,去往另外一张表中记录一下日志

视图 View

1.概念
视图:有结构(有行有列),但没有结果(结构中不真实存储数据)的虚拟的表,
     虚拟表的结构来源不是自己定义,而是从对应的基表中产生(视图数据的来源)
2.创建视图语法
	create view 视图名称 as select语句(这个语句可以是一张或多张表的的普通查询,或多表查询)
    例如:创建单表视图 
	create view my_v1 as select * from student;

    例如:创建多表视图 注意:不要查询两张表中的同名字段 不然会报错
	create view my_v2 as select a.字段名,b.字段名 from a,b where a.id=b.id;
	注意:MySQL中视图不支持封装子查询查出来的数据

3.查看视图 其实视图是一张 虚拟表 那关于查询表的语句 对视图都是可以用的
	比如:show tables;  desc my_v1
	只是在查看视图创建语句的的时候 把table 改成view
	如:show create view my_v1;

4.视图一旦创建,系统会在视图对应的数据库文件夹下,创建一个对应的结构文件:frm文件.

5.视图的使用: 视图的使用,指示为了查询,你可以把 视图当作表一样去使用 例如:select * from my_v1;
	       视图的执行:其实本质就是执行封装的select 语句
7.删除视图: drop view 视图名称  
	     例如:drop view my_v1

6.修改视图:视图本身不可以修改,但是视图的来源是可以修改的(其实就是修改select 语句)
	   语法: alter view 视图名字 as 新的select语句

7.视图的意义:(1)视图可以节省SQL语句,将一条复杂的查询语句,使用视图进行保存,以后可以直接对视图进行操作.
	      (2)数据安全,视图操作注意是针对查询语句的,如果对视图结构进行处理(比如删除),不会影响基表的数据.
		  所以相对来说数据比较安全
	      (3)视图往往是在大项目中去使用,而且是多系统中去使用.我可以对外提供一些有用的数据,隐藏一些关键的数据.
	      (4)视图对外可以提供友好的数据:不同的视图提供不同的数据,对外提供的数据好像是经过专门设计的一样.
	      (5)视图可以更好的进行权限控制 比如对外隐藏我的一些基表的名称


8.视图数据的操作:视图是可以进行数据操作的(比如 增,删,改,视图中的数据),但是有很多限制
		视图插入数据:

		(1)多表视图不能插入数据
		(2)单表视图中可以插入数据(如果视图中字段没有基表中不能为空的字段且没有默认值的字段,是插入不成功的)
		(3)视图是可以向基表中插入数据的 (视图的操作是影响基表的)

		视图删除数据
		(1):多表视图不能删除数据
		(2):单表视图可以删除数据,也会影响到基表
		 
		 视图更新数据
		 (1):单表视图,多表视图都可以更新数据
		     更新限制:with check option
		     例如:create view my_v1 as select * from student where age>30 with check option;
		     表示视图数据的来源都是年龄大于30的,with check option 决定通过视图更新的时候,不能将已得到
		     数据age>30的学生 改成age<30 的.

		     那么:update  my_v1 set age=20 where id=1; 就会报错 不允许改 因为做了限制

数据库的权限

-- mysql数据库权限问题:root :拥有所有权限(可以干任何事情)
 -- 权限账户,只拥有部分权限(CURD)例如,只能操作某个数据库的某张表
 -- 如何修改mysql的用户密码?
 -- password: md5加密函数(单向加密)
 SELECT PASSWORD('root'); -- *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B
 
--  mysql数据库,用户配置 : user表
USE mysql; -- 使用数据库
Select password(‘root’ )   查询用户密码
SELECT * FROM USER;  -查询数据库用户

-- 修改密码
UPDATE USER SET PASSWORD=PASSWORD('123456') WHERE USER='root';

-- 分配权限账户
	权限: select insert delete update drop create/  或,all
	@ 后面可以是localhost 也可以是ip  也可以给% 那%代表任意一台计算机都可以连接上来
	语法
GRANT 权限 ON 数据库名.某张表名 TO '用户名'@'localhost' IDENTIFIED BY '123456';

GRANT SELECT ON day16.employee TO 'eric'@'localhost' IDENTIFIED BY '123456';
GRANT DELETE ON day16.employee TO 'eric'@'localhost' IDENTIFIED BY '123456';
	注意分配多个权限用逗号隔开
GRANT DELETE,SELECT,UPDATE ON day16.employee TO 'eric'@'localhost' IDENTIFIED BY '123456';

	删除用户
	Delete FROM user Where User='eric' and Host='localhost';

--- 数据库备份和还原 注意备份还原不需要登陆数据库
备份:mysqldump -uroot -p day02 > d:/back.sql
C:\Documents and Settings\Administrator>mysqldump -uroot -p day02 > d:/back.sql
       Enter password: ****	
     恢复:mysql -uroot -p day02 < d:/back.sql
      注意恢复之前 先创建跟你原来一样的名称的数据库 相当于一个空的数据库,然后再还原
     C:\Documents and Settings\Administrator>mysql -uroot -p day02 < d:/back.sql
     Enter password: ****

导出数据

方法一:导为sql语句,必须在DOS窗口下执行
cmd > mysqldump -uroot -p 库名 >>要保存的文件.sql     (source的逆操作,内部是sql语句)
例:cmd  >mysqldump -uroot -p mydb >>e:\\1.sql
导入时: 
     建库:create database mydb;
                source e:\\1.sql

MySQL_第1张图片
在这里插入图片描述
MySQL_第2张图片

方法二:把表中的数据保存到文本文件当中(load data infile的逆操作)
select *from 表 into outfile  '文件路径\文件名'
例:select *from user into outfile 'e:\\a.txt' 

MySQL_第3张图片
在这里插入图片描述

你可能感兴趣的:(MySQL数据库)