SQL语句-总结

SQL语句-操作数据库

01.数据库的概念:
	1).数据库的概念:数据库(Database),就是存储,维护,管理数据的仓库。
	2).作用:用来存储和管理大量数据的。内部采用了非常便于查询的机制来存储数据,能保证我们在大量数据的情况下
	         可以很快,并且很准确为我们查询到所需记录。
	3).什么是数据库管理系统:指一种操作和管理数据库的大型软件,用于建立、使用和维护数据库,对数据库进行统一管理和控制,
	                         以保证数据库的安全性和完整性。用户通过数据库管理系统访问数据库中表内的数据。
02.数据库内部的结构:
	数据库软件:
	   |--逻辑数据库(跟项目相关)
		|--表
		    |--列
		    |--行(记录)
		|--表
		....
	   |--逻辑数据库(跟项目相关)
	   ....
03.Java和数据库的对应关系:
	java		数据库
   --------------------------------------------
        项目		逻辑数据库
	类		表
	类中成员属性	表的字段(列)
	属性的数据类型	字段的数据类型
	对象		表中的一行记录
04.常见的数据库管理系统
	MYSQL	:开源免费的数据库,小型的数据库.已经被Oracle收购了.MySQL6.x版本也开始收费。
	Oracle	:收费的大型数据库,Oracle公司的产品。Oracle收购SUN公司,收购MYSQL。
	DB2:IBM公司的数据库产品,收费的。常应用在银行系统中.
	SQLServer:MicroSoft 公司收费的中型的数据库。C#、.net等语言常使用。
	SyBase	:已经淡出历史舞台。提供了一个非常专业数据建模的工具PowerDesigner。
	SQLite	: 嵌入式的小型数据库,应用在手机端。
	常用数据库:MYSQL,Oracle.
	这里使用MySQL数据库。MySQL中可以有多个数据库,数据库是真正存储数据的地方。
05.MySQL的安装和客户端连接:
	1.连接MySQL服务器端:
		1).使用命令行:
			mysql -uroot -p密码 (回车)
		2).使用SQLYog客户端:
			直接启动,在连接界面填写:服务器IP,端口,用户名、密码,点击:连接
06.SQL语句的介绍:
	1.普通话:标准的SQL语言,各个数据库厂商必须遵守的。
	2.方言:个数据库厂商自己开发的基于的SQL的一些新功能的语法。只在自己的数据库
	        上有效。
07.SQL语言的分类:(结构化查询语言)
	1.DDL:数据定义语言,来定义数据库对象:逻辑数据库,表,列等。关键字:create(创建),alter(修改),drop(删除)等
	2.DCL:数据控制语言.用来定义数据库的访问权限和安全级别,及创建用户。grant ,revoke,if.
	3.DML【重点掌握】:数据操作语言。用来对数据库中表的"记录"进行更新。关键字:insert(添加),delete(删除),update(修改)等
	4.DQL【重点掌握】:数据查询语言。用来查询数据库中表的"记录"。关键字:select,from,where,groud by ,order by,having ,limit 聚合函数等
08.SQL通用语法:	
	1.SQL语句可以单行或多行书写,以分号结尾
	2.可使用空格和缩进来增强语句的可读性
	3.MySQL数据库的SQL语句不区分大小写,关键字建议使用大写
	  例如:SELECT * FROM user。
	4.注释:
		1).#单行注释
		2).--(空格)单行注释
		3)./* ... */ 多行注释
09.数据库操作的相关语句:(了解)
	1.创建数据库:
		create database 数据库名;
		或者
		create database 数据库名 character set 字符集;
	2.查看所有数据库:
		show databases;
	3.查看某个数据库的定义的信息:	
		show create database 数据库名;
	4.删除数据库:
		drop database 数据库名;
	5.查看当前正在使用的数据库:
		select database();
	6.切换数据库:
		use 数据库名;
10.表操作的相关语句:(了解)
	1.创建表: 这个需要学会
		create table 表名(    
			字段名1  数据类型[长度]  [约束],
			字段名2  数据类型[长度]  [约束],
			...
			字段名n  数据类型[长度]  [约束]
		);
	   例如创建一个学员信息表,存储:学号、姓名、性别、年龄
		create table student(
			stuNo int,
			stuName	varchar(200),
			stuSex	char(5),
			stuAge	int
		);
	2.Java的数据类型与MySQL中的数据类型  (类型属于了解内容)
		java数据类型		MySQL数据类型
	  ------------------------------------------------------------
	        整数:
		int			int

		小数:
		float/double		float/double/decimal(m,n)

		
		字符:
		char			char

		字符串:
		String			char(定长)/varchar(不定长)
		在Java中char表示一个字符;而MySQL中的char表示:可变的字符串;

	        =============================================================================================================
		在MySQL中char和varchar的区别:
		(扩展)1.char:定长字符串:例如定义字段为:char(5):表示最多存储5个字符,如果不足5个字符,剩下的用空字符填充。
			           例如:定义char(5)-->要存储字符串"abc"-->在硬盘上存储的格式-->"abc  "
				                       要存储字符串"abcd"-->在硬盘上存储的格式-->"abcd "

		2.varchar:不定长字符串:例如定义字段为:varchar(5):表示最多存储5个字符,如果不足5个字符,不填充空字符。
				   例如:定义varchar(5)-->要存储字符串"abc"-->在硬盘上存储的格式-->"abc"
				                          要存储字符串"abcd"-->在硬盘上存储的格式-->"abcd"

		注意:
		1.char类型的在查询效率上要高于varchar,所以,尽量选择char类型;
		2.对于字段的平均长度相同或者变化不大的数据,优先使用char类型。
			例如:手机号码、身份证号、银行卡号....
		3.对于字段的平均长度相差比较大的数据,建议使用varchar类型。
			例如:个人介绍......

		=============================================================================================================
		日期类型: 看不看都行
		String
		Date			date(日期常用)	范围:YYYY-MM-DD 1000-01-01~9999-12-3
					datetime【常用】(日期和时间)范围:YYYY-MM-DD HH:MM:SS 1000-01-01 00:00:00~ 9999-12-31 23:59:59
		大文本:
		String			Text

		文本二进制
		byte[]			binary

		二进制(图片,视频)
		byte[]			Blob
	3.查看数据库中的所有表:
		show tables;
	4.查看表结构:
		desc 表名;
	5.删除表:
		drop table 表名;
	6.修改表:  了解一下就行了
		alter table 表名 add 列名 类型(长度) [约束];	
		作用:修改表添加列. 
		例如:
		#1,为分类表添加一个新的字段为分类描述 varchar(20)
		ALTER TABLE category ADD `desc` VARCHAR(20);

		alter table 表名 modify 列名 类型(长度) 约束;
		作用:修改表修改列的类型长度及约束.
		例如:
		#2, 为分类表的描述字段进行修改,类型varchar(50) 添加约束 not null
		ALTER TABLE category MODIFY `desc` VARCHAR(50) NOT NULL;

		alter table 表名 change 旧列名 新列名 类型(长度) 约束; 
		作用:修改表修改列名.
		例如:
		#3, 为分类表的分类名称字段进行更换更换为 snamesname varchar(30)
		ALTER TABLE category CHANGE `desc`description VARCHAR(30);

		alter table 表名 drop 列名;	
		作用:修改表删除列.
		例如:
		#4, 删除分类表中snamename这列
		ALTER TABLE category DROP description;

		rename table 表名 to 新表名;
		作用:修改表名
		例如:
		#5, 为分类表category改名成 category2
		RENAME TABLE category TO category2;

		alter table 表名 character set 字符集;
		作用:修改表的字符集
		例如:
		#6, 为分类表 category 的编码表进行修改,修改成 gbk
		ALTER TABLE category CHARACTER SET gbk;
11.表记录操作相关的语句:  重点掌握
	1.添加数据:insert into
		两种格式:
		1.insert into 表名 values(值1,值2,.....,值n)--全字段添加
		  注意:
		  1).后面值列表中的数量必须跟表中列的数量匹配,而且顺序也要匹配。
		  2).值:数值类型,可以不用单引号(用也可以)
		         字符串类型,一定要使用单引号。
	        2.insert into 表名(字段1,字段2,.....,字段n) values(值1,值2,....,值n)--部分字段添加,剩余字段添加:NULL
		  注意:
		  1).字段列表:可以是表的部分字段,也可以不按照定义顺序;
		  2).值列表:必须跟字段列表的数量和顺序要匹配。
		  3).未指定的字段,添加:NULL值。(前提是:字段允许NULL值)
	2.修改数据:update
		格式:update 表名 set 字段名1 = 值1 , 字段名2 = 值2 , .... , 字段名n = 值n   where 条件;
	3.删除数据:delete from
		格式:delete from 表名 where 条件;
	  清空表:  面试题 
		1).delete from 表名;逐行删除,效率低;不清空auto_increment记录数
		2).truncate 表名;先摧毁表,然后按照原结构再创建一个新表,效率高;auto_increment将置为零,从新开始

	4.SQL的约束:  了解是什么概念
	1).主键约束:
		1).主键的作用:唯一标识表中一条记录。用于作为条件,方便的进行增删改查操作。
		2).定义主键:
			create table product(
				pid int primary key,
				..其它字段..
				..
			)
		3).一个表中只能有一个主键;
		4).一个主键,可以由一个或多个字段组成[很少用];复合主键,联合主键
			客户信息表:将"客户姓名" + "工作单位" 同时作为一个主键
			客户姓名	工作单位	性别	年龄
			张三		人事部		男	20
			李四		人事部		女	22
			张三		业务部		男	23
			张三		人事部		男	18 //错误的数据
		5).任何类型的字段都可以做主键。当前使用int类型。后期varchar
		6).为某个字段添加了"主键约束",也同时自动添加:唯一约束、非空约束
		7).删除主键约束:
			ALTER TABLE 表名 DROP PRIMARY KEY;
	2).自动增长:
		1).自动增长:让某列的值根据某个基数,进行自增。这种约束通常用于"主键".
		2).添加自动增长约束:
			create table product(
				pid int primary key auto_increment,
				....
			)
		3).清空表对自动增长列的基数的变化:
			1).delete from 表名:逐行删除。不改变自动增长的基数。
			2).truncate 表名【效率高】:摧毁表,重建表。将自动增长的基数重新设置为1.
	3).非空约束:NOT NULL
		1).作用:强制某列的数据不能包含NULL值;
		2).添加非空约束:
			create table product(
				pid int primary key,
				pname varchar(200) not null,
				....
			)
			如下添加,会抛出异常:
			insert into product values(null,null,...);//第二个null是错误,pname字段不允许null值
		3).删除非空约束 
			ALTER TABLE 表名 MODIFY 列名 数据类型[长度] (后面不出现not null约束即可,就表示删除了not NULL约束) 
	4).唯一约束:unique
		1).作用:表示本列的值是唯一的
		2).添加唯一约束:
			create table product(
				pid int primary key,
				pname varchar(200) unique,
				...
			)
		   如果向pname字段添加重复的值,数据库会抛出异常。
		3).如果字段设置了唯一约束,可以写入"空字符串",但只能有一条。
		   也可以写入NULL值,可以写入多条。
		4).删除唯一约束:
			ALTER TABLE 表名 DROP INDEX 名称;
			如果添加唯一约束时,没有设置约束名称,默认是当前字段的字段名
		5).主键与唯一约束的区别:
			主键:代表:唯一、非空;一个表只能有一个主键;
			唯一:只代表:唯一;可以有多个NULL值;一个表可以有多个字段被设置为唯一约束;
	5).默认约束:default 值;(扩充内容) 看不看都行
		1).作用:可以设置某列的默认值,在添加数据时,可以不指定这列的数据,而使用默认值。
		2).设置默认约束:
			create table student(
				id	int	primary key auto_increment,
				stuName	varchar(20)	not null,
				sex	char(5)	default '男'
			)
			在添加时,如果要使用默认值:
			INSERT INTO student VALUES(NULL,'bbb',DEFAULT);
		3).删除默认约束:
			ALTER TABLE 表名 MODIFY 列名 数据类型[长度](后面不要出现default关键字即可)
=================================================================================================================================
学习目标总结:
1,能够理解数据库的概念
	说出数据库的概念
		1).数据库就是存储数据的仓库,其本质是一个文件系统,
		   数据库按照特定的格式将数据存储起来,用户可以对数据库中的数据进行增加,修改,删除及查询操作。
	说出数据库的作用
		2).存储、管理大量的数据。
	说出数据库与表的关系
		一个逻辑数据库包含多个表
	说出常见的数据库
		MySQL
		Oracle
		SQLServer

2,能够安装MySQL数据库
	参考安装文档。
3,能够启动,关闭及登录MySQL
	1.启动和关闭MySQL服务:
		1).我的电脑-->右键-->管理-->服务和应用程序-->服务-->MySQL-->启动/停止
	2.登录MySQL
		1).命令行:
			C:\>mysql -uroot -p密码 (回车)
		2).SQLYog:
			启动,填写连接信息,登录。

4,能够使用SQL语句操作数据库
	写出创建数据库的SQL语句
		create database 数据库名;
		或者
		create database 数据库名 character set 字符集;
	写出删除数据库的SQL语句
		drop database 数据库名;
	写出查看所有数据库的SQL语句
		show databases;
	写出切换数据库的SQL语句
		ues 数据库名;
5,能够使用SQL语句操作表结构
	写出创建表的SQL语句
		create table 表名(
			字段名1  数据类型[长度] [约束],
			字段名2  数据类型[长度] [约束],
			....
			字段名n  数据类型[长度] [约束]
		);
	写出删除表的SQL语句
		drop table 表名;
	写出添加一列的SQL语句
		alter table 表名 add 列名 类型(长度) [约束];
	写出删除一列的SQL语句
		alter table 表名 drop 列名;
	写出查看当前数据库下所有表的SQL语句
		show tables;
	写出查看表结构的SQL语句
		desc 表名;
6,能够使用SQL语句进行数据的添加修改和删除的操作
	写出添加数据的SQL语句
		insert into 表名 values(值1,值2,....,值n);
		或者
		insert into 表名(字段1,字段2,... ,字段n) values(值1,值2,... , 值n)
	写出修改数据的SQL语句
		update 表名 set 字段1 = 值1 , 字段2 = 值2 , ... ,字段n = 值n where 条件;
	写出删除数据的SQL语句
		delete from 表名 where 条件;

SQL语句-简单查询数据

01.查询数据:select 字段名 from 表名 where 字段的筛选条件
		1.简单查询:
			1).查询所有字段的所有记录:
				select pid,pname,price,categoryName from product;
				或者
				select * from product;
			2).查询部分字段的所有记录:
				select pname,price from product;
			3).使用别名:
				a).列别名:
					SELECT pname AS '商品名称' , price AS '价格' FROM product;
				b).表别名:
					SELECT p.pname,p.price FROM product p;//一般在多表中使用别名
			4).去掉重复值
					SELECT DISTINCT price FROM product;
			5).对查询结果进行运算:
				例如:将所有查询结果的商品的价格加100显示:
				select pname,price + 100 from product;
			        注意:只对查询结果进行更改,原数据没有更改。
		2.条件查询:
			1).比较运算符:
				1).">":大于。例如:查询价格大于2000元的商品		--针对数值类型查询
					select * from product where price > 2000;
				2)."<":小于。例如:查询价格小于2000元的商品		--针对数值类型查询
					select * from product where price < 2000;
				3).">=":大于等于。例如:查询价格大于等于2000元的商品	--针对数值类型查询
					select * from product where price >= 2000;
				4)."<=":小于等于。例如:查询价格小于等于2000元的商品	--针对数值类型查询
					select * from product where price <= 2000;
				5)."<>":不等于。例如:查询价格不等于2000元的商品	--针对各种类型
					select * from product where price <> 2000;
				   "!=":不等于						--针对各种类型
					select * from product where price != 2000;
				6)."=" :等于.例如:查询价格等于2000元的商品		--针对各种类型
					select * from product where price = 2000;
			2).逻辑运算符:
				1).and : 语义:并且
					例如:查询所有商品价格大于2000元的电脑类商品
					select * from product where price > 2000 and categoryName = '电脑';
				2).or  : 语义:或者
					例如:查询所有商品价格大于2000元,或者价格低于1000元的所有商品
					select * from product where price > 2000 or price < 1000;
				3).not : 语义:非
					例如:查询商品价格不大于2000元的所有商品
					select * from product where not(price > 2000);

				注意:如果多个and和or运算,中间不要加逗号,可以使用()改变运算顺序。
				例如:查询所有价格大于2000元的电脑类商品或者服装类商品
					select * from product where price > 2000 and (categoryName = '电脑' or categoryName = '服装');
			3).范围查询:between ... and ...(可以用于数值类型,也可以用于日期类型)
				1).用于查询数值范围:between(包含)....and(包含)...
				   例如:查询价格在1000元(包含)到2000元(包含)之间的所有商品
					select * from product where price >= 1000 and price <= 2000;
					或者
					select * from product where price between 1000 and 2000;
				2).用于查询日期范围:
				    例如:查询生产日期在2017年1月份的所有商品
					select * from product where proDate between '2017-01-01' and '2017-01-31';
			4).多个值的判断:in(值列表)
				例如:查询商品价格为200元,500元,1000元,2000元的商品信息
					select * from product where price = 200 or price = 500 or price = 1000 or price = 2000;
					或者使用in查询
					select * from product where price in (200,500,1000,2000);

			5).模糊查询:like 两个通配符:1)"%" : 任意的0到多个字符;2)"_":任意的1个字符
				例如:查询商品名称中包含"花"的商品信息
					select * from product where pname like '%花%';
				      查询商品名称中以"花"字开头的商品:
				        select * from product where pname like '花%';
				      商品名称以"花花"开头,全名是四个字的商品:
				        select * from product where pname like '花花__';
			6).查询空字段:
				1).添加一条记录时,不添加的字段可以指定为NULL值,例如:
					insert into product values(14,'果10',200,'食品',NULL);
				   要查询所有"生产日期"没有添加的所有商品:
					select * from product where proDate IS NULL;
				3).添加一条记录:
					insert into product values(15,'果11',300,'',null);
				   要查询出来这条记录:
					select * from product where proDate = '';
03.SQL高级查询_排序:
	1.使用的关键字:order by 字段名 ASC(升序--默认) / DESC(降序)
	  例如:查询所有商品,要求结果按价格从小到大排序
		SELECT * FROM product ORDER BY proDate ASC;
	2.注意:升序可以不写asc关键字,例如:
		select * from product order by proData;//升序
	3.排序:
		升序(ASC):从小到大;
		降序(DESC):从大到小;
	4.对多列进行排序:
	  例如:对多列进行排序:按金额排序,如果金额相同,按生产日期升序排序
		SELECT * FROM product ORDER BY price ASC,proDate ASC;
		先按第一个字段排序,在第一个字段值相同的情况下,再按第二个字段排。
	5.如果有查询条件,写法:
		select * from 表名 where 条件  order by 字段 ... ;
04.SQL高级查询_聚合函数:
	1.我经常会有需求,对某列进行汇总,这就需要使用"聚合函数";
	2.今天我们掌握的五个聚合函数:
		a).count(*/字段名):统计指定列不为NULL的记录行数--任何数据类型
			例如:查询电脑类别的商品,共有多少种
			SELECT COUNT(*) FROM product WHERE categoryName = '电脑';
		b).sum(列名):计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0--数值类型的列
			例如:查询电脑类商品的价格总数是多少?
			select sum(price) from product where categoryName = '电脑';
		c).max(列名):计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算--数值类型、日期类型
			例如:查询电脑类商品的最高价格?
			select max(price) from product where categoryName = '电脑';
		d).min(列名):计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算
			例如:查询电脑类商品的最低价格?
			select min(price) from product where categoryName = '电脑';
		e).avg(列名):计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0
			例如:查询电脑类商品的平均价格?
			select avg(price) from product where categoryName = '电脑';
			注意:计算记录的总数量时,不包含NULL的记录。
			      所以如果计算的列中有NULL值,则结果不准确。
	3.注意:聚合查询的结果,只能包含"聚合结果列",不要包含其他列,要包含,其结果是无意义的。
	        聚合的结果是"计算的结果",跟某行数据无关,所以不能关联显示其它字段。

05.SQL高级查询_分组:
	1.分组:对某列中"相同的值"作为一组,进行分组。分组只是手段,后续经常需要进行汇总:
	2.例如:一条语句查询出每种商品的最高价格是多少?
		SELECT categoryName,MAX(price) FROM product GROUP BY categoryName;
		练习:查询每种商品的价格的总和
		SELECT categoryName,SUM(price) FROM product GROUP BY categoryName;
		练习:查询每种商品的商品数量是多少
		SELECT categoryName,COUNT(*) FROM product GROUP BY categoryname;
	3.注意:
	   1).分组查询的结果字段中,只能包含"分组字段","聚合结果字段"。不能再包含其他字段,如果包含,其结果也是无意义的。
	4.having子句:
	   1).由于where不能对聚合后的结果进行筛选。所以要对聚合后的结果进行筛选,需要使用having子句。
		例如:查询每种商品的价格总额,结果保留大于1000元的。
			select categoryName,sum(price) from product group by categoryName having sum(price) > 1000;
	5.对多列进行分组:
	    收支流水表:trans
	    id		收支项		账户		金额
	    1		工资收入	工商银行	1000
	    2		红包收入	工商银行	500
	    3		收入		交通银行	3000
	    4		支出		工商银行	300
	    5		支出		交通银行	770

	    需求:查询出每个账户的收支总额,分别是多少?
		账户		收支项		总金额
		工商银行	收入		1500
		工商银行	支出		300
		交通银行	收入		3000
		交通银行	支出		770
	   
	   select 账户,收支项,sum(金额) from trans group by 账户,收支项;//先按账户分,再按收支项分。
	  
06.SQL语句的执行顺序:
	1).from
	2).where
	3).group by
	4).having
	5).select
	6).distinct
	7).order by

   SQL语句的编写顺序:
	select ... from ...  where ... group by ... having ... order by ...;
07.分页查询:(mysql方言)
	1).基本语句:select * from 表名 limit M,N;
	             M值:从第几条(第一条记录为0)记录开始取。
		     N值:取几条记录
	2).例如:查询所有的商品,每页显示5条:
		第一页:
		select * from product limit 0,5;
		第二页:
		select * from product limit 5,5;
		第三页:
		select * from product limit 10,5
	
		固定算法:
		select * from product limit (当前的页数 - 1) * 每页显示的条数
	3).注意:M值和N值,只要是正数,不会抛异常,可能会返回空结果集。
	         但如果是负数,会抛异常。
08.备份和恢复数据库:
	1).备份:在要备份的数据库上右键-->备份/导出-->以SQL转储文件备份数据库
	2).恢复:在SQLYog左侧右键-->导入-->从SQL转储文件导入数据库

-----------------------------------------------------------------------------------------------------------------------------
09.多表_分表的作用:
	1.在制作表时要注意:一个表只描述一件事情。如果需要描述多件事情,可以创建多表,然后通过某个字段去引用
	                    另一个表的数据。这样可以使每个表的数据单独管理,互不影响。
                                
	2.分表后:
		主表:被其它表引用的表;
		从表:引用其它表的表;
        3.作用:
                避免主键冲突,减少数据冗余
10.多表_表和表之间的关系:
	1.一对多关系【最常用】:
		1).应用场景:客户和订单;分类和商品;部门和员工
			客户表:主表				订单表:从表                            外键
			----------------------------------------------------------------------------------------
			客户ID	登录名	支付宝			订单ID	订单时间	总金额		客户ID
			001	zhangsan  xxx			001	xxx		xxx		001
						  		002	xxx		xxx		001
								
		2).建表原则:在从表(多方)创建一个字段,字段作为外键指向主表(一方)的主键.
			
	2.多对多关系【较常用】:
		1).应用场景:订单和商品、用户和角色
			订单表					商品表:
			-----------------------------------------------------------------------------------------
			订单ID	订单日期   总金额  		商品ID	名称	单价	
			d001	2017-07-04  100			p001	奥利奥	5.5
			d002	2017-07-05  200			p002	红牛	4
								p003	啤酒	2.00

						订单_商品_关系表
						订单Id		商品ID	数量	总价
						d001		p001	2	11
						d001		p002	3	12
						d001		p003	
						d002		p001
		2).建表原则:需要创建第三张表,中间表中至少两个字段,这两个字段分别作为外键指向各自一方的主键。
	3.一对一关系【不建议用】:
		1).客户信息表:						地址表
			姓名	性别	年龄	地址ID			id	省	市	区	街道门牌
			张三	男	22	01			01	北京	北京	顺义	99号
			李四	女	23	02			02	河北	廊坊	安次	88号
		------------------------------------------------------------------------------------------------
		   合并为一个客户表:
			姓名	性别	年龄	省	市	区	街道门牌
			张三	男	22	北京	北京	顺义	99号
			李四	女	23	河北	廊坊	安次	88号
11.外键约束:
	1).作用:设置在"从表"的外键字段上,可以强制外键字段的值必须参考主表中的主键字段的值。
	2).设置外键约束:
		alter table 从表 add [constraint] [外键名称] foreign key (从表外键字段名) references 主表 (主表的主键);
	3).使用外键目的:
		保证数据完整性
===============================================================================================================================
学习目标总结:
3,能够使用SQL语句进行排序
a,	说出排序语句中的升序和降序关键字
		order by 字段名 ASC(升序-默认) / DESC(降序)
b,	写出排序语句
		select * from product order by price desc;
4,能够使用聚合函数
a,	写出获取总记录数的SQL语句
		select count(*) from product;
b,	写出获取某一列数据总和的SQL语句
		select sum(price) from product;
c,	写出获取某一列数据平均值的SQL语句
		select avg(price) ...
d,	写出获取某一列数据的最大值的SQL语句
		select max(price) ...
e,	写出获取某一列数据的最小值的SQL语句
		select min(price) ...
5,能够使用SQL语句进行分组查询
a,	写出分组的SQL语句
		group by 字段名
b,	写出分组后条件过滤器的SQL语句
		gruup by 字段名 having 聚合函数 条件;
6,能够完成数据的备份和恢复
	1.备份:在要备份的数据库上右键-->备份/导出-->以SQL转储文件备份数据库
	2.恢复:在SQLYog左边右键-->导入-->以SQL转储文件导入数据库。
7,能够使用可视化工具连接数据库,操作数据库
	使用SQLYog连接数据库。操作数据库

8,能够说出多表之间的关系及其建表原则
a,	说出一对多的应用场景及其建表原则
		1).应用场景:客户和订单,分类和商品,部门和员工.
		2).在从表(多方)创建一个字段,字段作为外键指向主表(一方)的主键.
b,	说出多对多的应用场景及其建表原则
		1).应用场景:学生和课程、用户和角色
		2).需要创建第三张表,中间表中至少两个字段,这两个字段分别作为外键指向各自一方的主键.
9,能够理解外键约束
a,	说出外键约束的作用
		作用:强制外键字段的值必须参考主表中主键字段的值。
b,	写出创建外键的SQL语句
		alter table product add constraint fk_fkname foreign key (categoryid) references category (cid);
c,	通过sql语句能够建立多表及其关系
		创建表的外键,并且创建外键约束。

SQL语句-多表查询数据

01.多表查询_交叉查询【了解】
	1.查询结果=左表的总记录数 * 右表的总记录数 -- 笛卡尔积
02.多表查询_内连接查询【重点掌握】
	1.隐式内连接【常用】:
		1).格式:select 字段列表 from 表1,表2 where 表1和表2的等值关系;
		2).例如:查询商品信息,要显示所对应类别信息
			select * from products , category where products.category_id = catetory.cid;
			只保留两个表的部分字段,使用表别名:
			SELECT p.pname,p.price,c.cname FROM products p , category c WHERE p.category_id = c.cid;
		3).练习:查询"市"的所有信息,并且显示对应的"省名"
			SELECT c.cname AS '市',p.pname AS '省' FROM city c,province p WHERE c.pid = p.pid;
			
	2.显示内连接:
		1).格式:select 字段列表 from 表1 INNER JOIN 表2 ON 等值关系;
		2).例如:查询商品信息,要显示所对应类别信息
			select * from products p inner join category c on p.category_id = c.cid;
		3).练习:查询"市"的所有信息,并且显示对应的"省名"
			SELECT c.cname AS '市',p.pname AS '省' from city c inner join province p on c.pid = p.pid;
	注意:
	1.内连接的查询结果:两个表中的等值记录;
	2.两种内连接都可以再添加其它where条件:
		隐式内连接:select .. from 表1,表2 where 等值条件 and 其它条件...
		显示内连接:select .. from 表1 inner join 表2 on 等值条件 where 其它条件....
	3.两种查询的格式说明:
		隐式内连接:select .. from 表1,表2 on 等值条件//错误
		显示内连接:select .. from 表1 inner join 表2 where 等值条件//OK的
03.多表查询_外连接查询【重点掌握】
	1.左外连接查询:
		1).格式:select 字段列表 from 表1 left join 表2 on 等值关系;
		2).查询结果:左表的所有记录,和右表的等值记录;
		3).例如:需求:查询出所有商品(包括没有类别的商品),有类别的商品要显示类别名称。
			SELECT * FROM products p LEFT JOIN category c ON p.category_id = c.cid;

	2.右外连接查询:
		1).格式:select 字段列表 from 表1 right join 表2 on 等值关系;
		2).查询结果:右表的所有记录,和左表中的等值记录;
		3).例如:需求:查询出所有的商品类别,如果类别下有商品的,要同时显示商品信息;
			SELECT * FROM products p RIGHT JOIN category c ON p.category_id = c.cid;
04.子查询【重点掌握】
	1.在一个查询内部,可以再写一个查询,这个写在内部的查询就叫:子查询;
	2.子查询的结果可以作为另一个查询:判断条件,表使用。
	3.例子:查询价格高于"劲霸"的商品信息;
		SELECT * FROM products WHERE price > (SELECT price FROM products WHERE pname = '劲霸');
	4.练习:
		1).查询化妆品类别的商品信息
		   a).使用多表连接查询:
			select * from products p , category c where p.category_id = c.cid and c.cname = '化妆品';
		   b).使用子查询(单表查询)
			SELECT * FROM products WHERE category_id = (SELECT cid FROM category WHERE cname = '化妆品');
		   c).使用子查询作为第三张表:select * from (子查询)
			SELECT * FROM products p ,(SELECT * FROM category WHERE cname = '化妆品') c WHERE p.category_id = c.cid;
		2).查询所有"家电","服饰"类商品的信息:
			select * from products where category_id = 1 or category_id = 2;
			改进:
			select * from products where category_id in (1,2);
			改进:
			select * from products where category_id in (select cid from category where cname in ('家电','服饰'));
============================================================================================================================================
学习目标总结:
1,能够使用内连接进行多表查询
a,	说出内连接的两种查询方式
		1.隐式内连接
		2.显示内连接
b,	写出显式内连接的SQL语句
		select * from products p inner join category c on p.category_id = c.cid;
c,	写出隐式内连接的SQL语句
		select * from products p , category c where p.category_id = c.cid;
2,能够使用外连接进行多表查询
a,	说出外连接的两种查询方式
		1.左外查询
		2.右外查询
b,	写出左外连接的SQL语句
		select * from products p left join category c on p.category_id = c.cid;//所有左表中的记录,和右表的等值记录
c,	写出右外连接的SQL语句
		select * from products p right join category c on p.category_id = c.cid;//所有右表中的记录,和左表的等值记录
3,能够使用子查询进行多表查询
	select * from products where category_id in (select cid from category where cname in ('家电','服饰'));
================================================================================================================================
扩展:三表联查:
	1.隐式内连接:使用user表,role表,user_role表进行测试
		select * from users u , role r,user_role ur where u.uid = ur.uid and ur.rid = r.rid;
	2.显示内连接:
		select * from users u inner join user_role ur on u.uid = ur.uid inner join role r on ur.rid = r.rid;

三表联查
SELECT
 jrl.total_rebate_amount AS totalRebateAmount,
          ju.user_id  AS userId ,
          ju.alipay AS alipay,
          ju.no_wx AS noWx,
          jai.account_number AS accountNumber
FROM jq_user ju
LEFT JOIN jq_account_information jai ON ju.user_id = jai.user_id
LEFT JOIN jq_return_list jrl ON ju.user_id= jrl.user_id
WHERE ju.user_id=268




sql去重

select  distinct id from  biaoming 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值