Java登陆第四天——SQL之DQL(二)

发布时间 2023-11-11 20:18:18作者: ocraft

分页查询

现实总是有很多数据,多数情况都需要用分页显示数据。(很多数据显示在一个页面不太现实。)

--关键字LIMIT
--索引总是从0开始的,页面大小为一页显示多少条数据
select 列名 from 表名 limit 索引,页面大小;

image
栗子:按照user_id降序排列,每页显示3条数据。
SQL语句:

select * from t_order order by user_id desc limit 0,3;
select * from t_order order by user_id desc limit 3,3;
select * from t_order order by user_id desc limit 6,3;

程序运行结果:
image

公式为:(n-1)*pagesize,pagesize n:页数。pagesize:一页多少条数据。

多表查询

基于两张表或两张以上的表进行查询。(实际应用中单表查询可能不满足需求)

--就是from后声明多张表,多表查询where逻辑语句不能少于表的个数-1,否则会出现笛卡尔积。
select 列名 from 表1,表2,...;

准备数据

-- 创建年份表
create table t_year(
  the_year SMALLINT not null comment '订单创建年份',
  year_name varchar(20) not null
);

-- 插入数据
insert into t_year(the_year,year_name) values
  ('2017','鸡年'),
  ('2018','狗年'),
  ('2019','猪年');

image

笛卡尔积展示:表1的所有行*表2的所有行。(9*3)

image
多表查询where后逻辑语句不能少于表的个数-1,否则会出现笛卡尔积。
即如果5张表一起多表查询需要4个逻辑语句

栗子:查询user_name的the_year并正确显示the_year对应的year_name。
注意:t_order表中不包含year_name,所以此时需要多表查询。

SQL语句:

select user_name, t_order.the_year, year_name from t_order, t_year
	where t_order.the_year = t_year.the_year;

程序运行结果:
image
因为t_order表与t_year表中均有the_year列,需显示注明。
访问某表中具体列需要使用:表名.列名

自连接

基于多表查询。不同的是自己和自己连接,一张表当作两张表用。

表要起别名否则表名相同会报错。
准备数据

-- 创建Person
create table Person(
  id int,
  name varchar(20),
  sex char,
  age int,
  teacher int
);

-- 插入数据
insert into Person values
	('1001','张三','M','11','2001'),
    ('1002','五六','M','12','2002'),
    ('1003','王正','W','11','2001'),
    ('2001','刘sir','M','33',null),
    ('2002','吴sir','W','36',null);

image

栗子:正确查询同学和他的老师。
SQL语句:

select stu.name as '学生名', tea.name as '老师名'
	from person as stu,person as tea
		where stu.teacher = tea.id;

程序运行结果:
image

子查询

待编辑