最新消息:最新信息可以到系统基本设置里填写,如果不想要这一栏可以修改head.htm,将第53行到55行删除即可

java核心技术第二篇之数据库SQL语法

创意新鲜 dedesos.com

#查询products表记录
select * from products where price 2000;
-- 单行注释
/*
多行注释
*/
#创建数据库
create database hei66_day19_db;hei66_day19_db
#查看数据库
show databases;
#查看某个数据库的定义信息
show create database hei66_day19_db;
#删除数据库
drop database hei66_day19_db;














#切换数据库
use day21_267;
select * from products;
#查看当前工作的数据库
select database;
#创建学员信息表:
create table student,
stusex char,
stuage int
);
#查看数据库中有哪些表:
show tables;












#查看表结构:
desc account;


#删除表
drop table student;


#为student表添加一个address列
alter table student add address varchar;


#将student表的address字段修改为500个长度
alter table student modify address varchar;


#删除address列
alter table student drop address;




11.表记录操作相关的语句:
1.添加数据:insert into
两种格式:
1.insert into 表名 values--全字段添加
注意:
1).后面值列表中的数量必须跟表中列的数量匹配,而且顺序也要匹配。
2).值:数值类型,可以不用单引号
字符串类型,一定要使用单引号。
2.insert into 表名 values--部分字段添加,剩余字段添加:null


#把sc表的查询出来的数据,再添加到sc1表中
insert into sc1 ;
insert into sc1 ;
添加数据的时候,可以直接添加查询出来的所有数据
insert into sc select sno, 3, from sc where cno = 2) from student where sno not in ;

注意:
1).字段列表:可以是表的部分字段,也可以不按照定义顺序;
2).值列表:必须跟字段列表的数量和顺序要匹配。
3).未指定的字段,添加: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将置为零,从新开始
3).truncate table sc;//恢复表

































#1.添加记录--全字段
#1.insert into 表名 values--全字段添加
insert into student values;



#2.添加记录--部分字段
#2.insert into 表名 values--部分字段添加,剩余字段添加:null
insert into student values;



#3.修改记录
update student set stuage = 30 where stuno = 22;


#4.修改记录:修改汪峰:年龄为:23,性别:男
update student set stuage = 23,stusex = '男' where stuno = 22;
update student set stuage = 30 where stusex = '女'



#5.删除数据
day21_267


delete from products where price 2000;

/*
练习:
1.添加一个学员信息:1,'黄渤','男',22
2.添加一个需要信息:2,'孙红雷',,23
3.修改:stuno为3的,姓名改为:小沈阳,性别:男,年龄:20
4.删除:删除stuname='小沈阳'的记录

*/
insert into student values;
insert into student values;
insert into student values;
update student set stuname = '小沈阳',stusex='男',stuage = 20 where stuno = 3;
delete from student where stuname = '小沈阳';















4.查询数据:select 字段名 from 表名 where 字段的筛选条件
1.简单查询:
1).查询所有字段的所有记录:
select pid,pname,price,categoryname from product;
或者
select * from product;

查询条件是大写的单词
select * from 表名 where binary name = 'tom';

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;



















































注意:如果多个and和or运算,中间不要加逗号,可以使用改变运算顺序。
例如:查询所有价格大于2000元的电脑类商品或者服装类商品
select * from product where price 2000 and ;
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 ;

















扩展:all和any用法
create table #a
go
insert into #a values
insert into #a values
insert into #a values
insert into #a values
go
--all:对所有数据都满足条件,整个条件才成立,例如:5大于所有返回的id
select *
from #a
where 5 all
go
--any:只要有一条数据满足条件,整个条件成立,例如:3大于1,2
select *
from #a
where 3 any
go
--some和any一样
备注:any的用法中,在作数字比对时,也可以改用先select subquery的min/max value的方法,某些情况下效率更高



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;
要查询所有"生产日期"没有添加的所有商品:
select * from product where prodate is null;
3).添加一条记录:
insert into product values;
要查询出来这条记录:
select * from product where prodate = '';








































#1.查询所有字段的所有记录
select pid,pname,price,categoryname from product;
#或者
select * from product;
#2.查询部分字段:
select pname,price from product;






#3.使用别名
select pname as '商品名称' , price as '价格' from product;
#表别名
select p.pname,p.price from product p;
#4.去掉重复值
select distinct price from product;
#5.对查询结果进行运算
select pname,price + 100 from product;
#6.查询价格大于2000元的商品
select * from product where price 2000;
#7.查询价格小于2000元的商品
select * from product where price 2000;
#8.查询价格小于等于2000元的商品
select * from product where price = 2000;
#9.查询价格不等于2000元的商品
select * from product where price 2000;
#10.查询价格等于2000元的商品
select pname,price from product where price = 2000;


















#11.查询商品类别不等于'电脑'
select * from product where categoryname '电脑';


#12.查询所有商品价格大于2000元的电脑类商品
select * from product where price 2000 and categoryname = '电脑';
#13.查询所有商品价格大于2000元,或者价格低于1000元的所有商品
select * from product where price 2000 or price 1000;
#14.查询商品价格不大于2000元的所有商品
select * from product where not;
#15.查询所有价格大于2000元的电脑类商品或者服装类商品
select * from product where price 2000 and ;
#16.查询生产日期在2017年1月份的所有商品
select * from product where prodate between '2017-01-01' and '2017-01-31';
#17.查询商品名称中包含"花"的商品信息
select * from product where pname like '%花%';












insert into product values;
select * from product where prodate is null;
insert into product values;
select * from product where categoryname = '';
=================================================================================================================================
学习目标总结:
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 表名;
写出删除表的sql语句
drop table 表名;
写出添加一列的sql语句
alter table 表名 add 列名 类型 [约束];
写出删除一列的sql语句
alter table 表名 drop 列名;
写出查看当前数据库下所有表的sql语句
show tables;
写出查看表结构的sql语句
desc 表名;
6,能够使用sql语句进行数据的添加修改和删除的操作
写出添加数据的sql语句
insert into 表名 values;
或者
insert into 表名 values
写出修改数据的sql语句
update 表名 set 字段1 = 值1 , 字段2 = 值2 , ... ,字段n = 值n where 条件;
写出删除数据的sql语句
delete from 表名 where 条件;


































在dos中怎么解决乱码?

win7系统中使用dos命令是出现乱码的解决方法
方法一:设置cmd显示字体
1、win+r打开运行窗口- 输入cmd- 回车,打开命令行提示符窗口
win7系统运行窗口
win7系统dos命令行提示窗口








2、在命令行标题栏上点击右键,选择 属性 - 字体 ,将字体修改为true type字体 lucida console ,然后点击确定将属性应用到当前窗口,确定
dos命令窗口右键菜单
dos命令行,设置字体



方法二:修改注册表
1、快捷键win+r,打开运行窗口,输入 regedit ,打开注册表编辑器
运行窗口打开注册表编辑器
2、修改注册表的参数值,
正常显示路径:hkey_current_user\console\%"systemroot"%_system32_cmd.exe
健名:codepage
修改前的值为:437,改为:936;
温馨提示:涉及注册表修改,请做好注册表备份



01.sql高级查询_排序:
1.使用的关键字:order by 字段名 asc / desc
例如:查询所有商品,要求结果按价格从小到大排序
select * from product order by prodate asc;
2.注意:升序可以不写asc关键字,例如:
select * from product order by prodata;//升序
3.排序:
升序:从小到大;
降序:从大到小;
4.对多列进行排序:
例如:对多列进行排序:按金额排序,如果金额相同,按生产日期升序排序
select * from product order by price asc,prodate asc;
先按第一个字段排序,在第一个字段值相同的情况下,再按第二个字段排。
5.如果有查询条件,写法:
select * from 表名 where 条件 order by 字段 ... ;
02.sql高级查询_聚合函数:
1.我经常会有需求,对某列进行汇总,这就需要使用"聚合函数";
2.今天我们掌握的五个聚合函数:
a).count:统计指定列不为null的记录行数--任何数据类型
例如:查询电脑类别的商品,共有多少种
select count from product where categoryname = '电脑';
b).sum:计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0--数值类型的列
例如:查询电脑类商品的价格总数是多少?
select sum from product where categoryname = '电脑';
c).max:计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算--数值类型、日期类型
例如:查询电脑类商品的最高价格?
select max from product where categoryname = '电脑';
d).min:计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算
例如:查询电脑类商品的最低价格?
select min from product where categoryname = '电脑';
e).avg:计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0
例如:查询电脑类商品的平均价格?
select avg from product where categoryname = '电脑';
注意:计算记录的总数量时,不包含null的记录。
所以如果计算的列中有null值,则结果不准确。
3.注意:聚合查询的结果,只能包含"聚合结果列",不要包含其他列,要包含,其结果是无意义的。
聚合的结果是"计算的结果",跟某行数据无关,所以不能关联显示其它字段。
















































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






















需求:查询出每个账户的收支总额,分别是多少?
账户 收支项 总金额
工商银行 收入 1500
工商银行 支出 300
交通银行 收入 3000
交通银行 支出 770

select 账户,收支项,sum from trans group by 账户,收支项;//先按账户分,再按收支项分。

04.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 ...;
05.分页查询:
1).基本语句:select * from 表名 limit m,n;
m值:从第几条记录开始取。
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 * 每页显示的条数

例题:select * from products limit 2; //表示从0页开始,取2条记录.


3).注意:m值和n值,只要是正数,不会抛异常,可能会返回空结果集。
但如果是负数,会抛异常。
06.备份和恢复数据库:
1).备份:在要备份的数据库上右键-- 备份/导出-- 以sql转储文件备份数据库
2).恢复:在sqlyog左侧右键-- 导入-- 从sql转储文件导入数据库
07.sql的约束:
1).主键约束:
1).主键的作用:唯一标识表中一条记录。用于作为条件,方便的进行增删改查操作。
2).定义主键:
create table product

?方式二:创建表时,在constraint约束区域,声明指定字段为主键:
?格式:[constraint 名称] primary key
?关键字constraint可以省略,如果需要为主键命名,constraint不能省略,主键名称一般没用。
?字段列表需要使用小括号括住,如果有多字段需要使用逗号分隔。声明两个以上字段为主键,我们称为联合主键。
create table persons
,
lastname varchar,
address varchar,
city varchar,
constraint pk_personid primary key
)

create table persons
,
lastname varchar,
address varchar,
city varchar,
primary key
)


















































先来看sql serve的isnull函数:

 

isnull

1、check_expression与replacement_value的数据类型必须一致。
2、如果check_expression为null,则返回replacement_value。
3、如果check_expression为null,则返回check_expression。



再来看mysql的ifnull函数:

ifnull
如果expr1不是null,ifnull返回expr1,否则返回expr2。


下面来看下sqlserver中isnull与nullif的具体用法。
sql server里的 isnull 与 asp 中的 isnull不同,sql server 中有两个参数。


一,isnull 语法:
isnull


1,check_expression 与 replacement_value 数据类型必须一致
2,如果 check_expression 为 null,则返回 replacement_value
3,如果 check_expression 不为 null,则返回 check_expression



二,nullif 用于检查两个表达式。
语法:
nullif



说明:
如果两个 expression 相等,则返回 null,该 null 为第一个 expression 的数据类型。
如果两个 expression 不相等,则返回第一个 expressio。





?方式三:创建表之后,通过修改表结构,声明指定字段为主键:
alter table persons add [constraint 名称] primary key

3).一个表中只能有一个主键;
4).一个主键,可以由一个或多个字段组成[很少用];复合主键,联合主键
客户信息表:将"客户姓名" + "工作单位" 同时作为一个主键
客户姓名 工作单位 性别 年龄
张三 人事部 男 20
李四 人事部 女 22
张三 业务部 男 23
张三 人事部 男 18 //错误的数据
5).任何类型的字段都可以做主键。当前使用int类型。后期varchar
6).为某个字段添加了"主键约束",也同时自动添加:唯一约束、非空约束,主键也不能为null.
7).删除主键约束:
alter table 表名 drop primary key;
2).自动增长:
1).自动增长:让某列的值根据某个基数,进行自增。这种约束通常用于"主键".
2).添加自动增长约束:
create table product
3).清空表对自动增长列的基数的变化:
1).delete from 表名:逐行删除。不改变自动增长的基数。
2).truncate 表名:摧毁表,重建表。将自动增长的基数重新设置为1.

?扩展:默认地,auto_increment 的开始值是 1,如果希望修改起始值,请使用下列 sql 语法:
alter table persons auto_increment=100

3).非空约束:not null
1).作用:强制某列的数据不能包含null值;
2).添加非空约束:
create table product not null,
....
)
如下添加,会抛出异常:
insert into product values;//第二个null是错误,pname字段不允许null值
3).删除非空约束
alter table 表名 modify 列名 数据类型[长度]
4).唯一约束:unique
1).作用:表示本列的值是唯一的
2).添加唯一约束:
create table product unique,
...
)

?方式2:创建表时,在约束区域,声明唯一:
create table persons
not null,
firstname varchar,
address varchar,
city varchar,
constraint 名称unique
如果添加唯一约束时,没有设置约束名称,默认是当前字段的字段名
)






















































?方式3:创建表后,修改表结构,声明字段唯一:
alter table persons add [constraint 名称] unique

如果向pname字段添加重复的值,数据库会抛出异常。
3).如果字段设置了唯一约束,可以写入"空字符串",但只能有一条。
也可以写入null值,可以写入多条。
4).删除唯一约束:
alter table 表名 drop index 名称;
如果添加唯一约束时,没有设置约束名称,默认是当前字段的字段名
5).主键与唯一约束的区别:
主键:代表:唯一、非空;一个表只能有一个主键;
唯一:只代表:唯一;可以有多个null值;一个表可以有多个字段被设置为唯一约束;
5).默认约束:default 值;
1).作用:可以设置某列的默认值,在添加数据时,可以不指定这列的数据,而使用默认值。
2).设置默认约束:
create table student not null,
sex char default '男'
)
在添加时,如果要使用默认值:
insert into student values;
3).删除默认约束:
alter table 表名 modify 列名 数据类型[长度]
-----------------------------------------------------------------------------------------------------------------------------
08.多表_分表的作用:
1.在制作表时要注意:一个表只描述一件事情。如果需要描述多件事情,可以创建多表,然后通过某个字段去引用
另一个表的数据。这样可以使每个表的数据单独管理,互不影响。
2.分表后:
主表:被其它表引用的表;
从表:引用其它表的表;
09.多表_表和表之间的关系:
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号
10.外键约束:
1).作用:设置在"从表"的外键字段上,可以强制外键字段的值必须参考主表中的主键字段的值。
2).设置外键约束:
alter table 从表 add [constraint] [外键名称] foreign key references 主表 ;
例如:alter table product1 addconstraint fk_product1 foreign key references category;
3).使用外键目的:
保证数据完整性


如何删除外键?
sp_help 表名 可以看到外键名
alter table xxx drop constraint fk_xxx
===============================================================================================================================
学习目标总结:
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 from product;
c, 写出获取某一列数据平均值的sql语句
select avg ...
d, 写出获取某一列数据的最大值的sql语句
select max ...
e, 写出获取某一列数据的最小值的sql语句
select min ...
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 references category ;
c, 通过sql语句能够建立多表及其关系
创建表的外键,并且创建外键约束。

能够使用dos窗口的方式进行数据的备份和恢复


数据库备份
数据库的备份是指将数据库转换成对应的sql文件。数据库导出sql脚本的命令如下:
?mysqldump u用户名 p密码 数据库名 生成的脚本文件路径;
以上备份数据库的命令中需要用户名和密码,即表明该命令要在用户没有登录的情况下使用
数据库恢复
数据库的恢复指的是使用备份产生的sql文件恢复数据库,即将sql文件中的sql语句执行就可以恢复数据库内容。因为数据库备份只是备份了数据库内容,所以备份产生的sql文件中没有创建数据库的sql语句,在恢复数据库之前需要自己动手创建数据库。
?在数据库外恢复
mysql -u root -p 数据库名 文件路径
注意:要求数据库必须先创建出来.
?.在数据库内恢复
source sql脚本路径:使用这种方式恢复数据,首先要登录数据库



备份
mysqldump u root p abc mydb c:/mydb.sql
恢复
1.mysql u root p mydb c:/mydb.sql
source c:/mydb.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 ;
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 = ;
c).使用子查询作为第三张表:select * from
select * from products p , 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 ;
改进:
select * from products where category_id 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 );
================================================================================================================================
扩展:三表联查:
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;

#1.多表交叉查询
select * from products,category;
#2.内连接--隐式内连接
select * from category,products where products.category_id = category.cid;
#3.只显示部分字段
select p.pname,p.price,c.cname from products p , category c where p.category_id = c.cid;
#4.查询"市"的所有信息,并且显示对应的"省名"
select c.cname as '市',p.pname as '省' from city c,province p where c.pid = p.pid;
#5.显示内连接 查询商品信息,要显示所对应类别信息
select p.pname,p.price,c.cname from products p inner join category c on p.category_id = c.cid;





























































#6.左外连接查询
#需求:查询出所有商品,有类别的商品要显示类别名称。
select * from products p left join category c on p.category_id = c.cid;
#7.右外连接查询
#需求:查询出所有的商品类别,如果类别下有商品的,要同时显示商品信息;
select * from products p right join category c on p.category_id = c.cid;






select * from products where price ;

select * from products p , category c where p.category_id = c.cid and c.cname = '化妆品';
select * from products where category_id = ;
select * from products p , c where p.category_id = c.cid;



select * from users u , role r,user_role ur where u.uid = ur.uid and ur.rid = r.rid;
select * from users u inner join user_role ur on u.uid = ur.uid inner join role r on ur.rid = r.rid;


?单列多行子查询
?可以使用in,any或all操作
any:大于子查询中的最小值。
all: 大于子查询中的最大值。
any:小于子查询中的最大值。
all: 小于子查询中的最小值。
=any:大于等于子查询中的最小值。
=all:大于等于子查询中的最大值。
=any:小于等于子查询中最大值。
=all:小于等于子查询中最小值。
!=any或 any:不等于子查询中的任意值。
!=all或 all:不等于子查询中的所有值。
=any:等于子查询中任意值。
=all:等于子查询中所有值


sql语句中:
查询:select * from 表名 where 0/1; 0表示查询不到任何表信息,1表示可以查询任何信息 例如:or '1=1 : 就是利用这个sql注入问题,返回一个true,表示登录成功






















    与本文相关的文章

    网友最新评论