Struct sea_query::query::SelectStatement [−][src]
pub struct SelectStatement { /* fields omitted */ }
Expand description
Select rows from an existing table
Examples
use sea_query::{*, tests_cfg::*};
let query = Query::select()
.column(Char::Character)
.table_column(Font::Table, Font::Name)
.from(Char::Table)
.left_join(Font::Table, Expr::tbl(Char::Table, Char::FontId).equals(Font::Table, Font::Id))
.and_where(Expr::col(Char::SizeW).is_in(vec![3, 4]))
.and_where(Expr::col(Char::Character).like("A%"))
.to_owned();
assert_eq!(
query.to_string(MysqlQueryBuilder),
r#"SELECT `character`, `font`.`name` FROM `character` LEFT JOIN `font` ON `character`.`font_id` = `font`.`id` WHERE `size_w` IN (3, 4) AND `character` LIKE 'A%'"#
);
assert_eq!(
query.to_string(PostgresQueryBuilder),
r#"SELECT "character", "font"."name" FROM "character" LEFT JOIN "font" ON "character"."font_id" = "font"."id" WHERE "size_w" IN (3, 4) AND "character" LIKE 'A%'"#
);
assert_eq!(
query.to_string(SqliteQueryBuilder),
r#"SELECT `character`, `font`.`name` FROM `character` LEFT JOIN `font` ON `character`.`font_id` = `font`.`id` WHERE `size_w` IN (3, 4) AND `character` LIKE 'A%'"#
);
Implementations
Construct a new SelectStatement
Take the ownership of data in the current SelectStatement
A shorthand to express if β¦ else β¦ when constructing the select statement.
Examples
use sea_query::{*, tests_cfg::*};
let query = Query::select()
.column(Char::Character)
.from(Char::Table)
.conditions(
true,
|x| { x.and_where(Expr::col(Char::FontId).eq(5)); },
|x| { x.and_where(Expr::col(Char::FontId).eq(10)); }
)
.to_owned();
assert_eq!(
query.to_string(MysqlQueryBuilder),
r#"SELECT `character` FROM `character` WHERE `font_id` = 5"#
);
assert_eq!(
query.to_string(PostgresQueryBuilder),
r#"SELECT "character" FROM "character" WHERE "font_id" = 5"#
);
assert_eq!(
query.to_string(SqliteQueryBuilder),
r#"SELECT `character` FROM `character` WHERE `font_id` = 5"#
);
Clear the select list
Add an expression to the select expression list.
Examples
use sea_query::{*, tests_cfg::*};
let query = Query::select()
.from(Char::Table)
.expr(Expr::val(42))
.expr(Expr::col(Char::Id).max())
.expr((1..10_i32).fold(Expr::value(0), |expr, i| {
expr.add(Expr::value(i))
}))
.to_owned();
assert_eq!(
query.to_string(MysqlQueryBuilder),
r#"SELECT 42, MAX(`id`), 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 FROM `character`"#
);
assert_eq!(
query.to_string(PostgresQueryBuilder),
r#"SELECT 42, MAX("id"), 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 FROM "character""#
);
assert_eq!(
query.to_string(SqliteQueryBuilder),
r#"SELECT 42, MAX(`id`), 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 FROM `character`"#
);
pub fn exprs<T, I>(&mut self, exprs: I) -> &mut Self where
T: Into<SelectExpr>,
I: IntoIterator<Item = T>,
pub fn exprs<T, I>(&mut self, exprs: I) -> &mut Self where
T: Into<SelectExpr>,
I: IntoIterator<Item = T>,
Add select expressions from vector of SelectExpr
.
Examples
use sea_query::{*, tests_cfg::*};
let query = Query::select()
.from(Char::Table)
.exprs(vec![
Expr::col(Char::Id).max(),
(1..10_i32).fold(Expr::value(0), |expr, i| {
expr.add(Expr::value(i))
}),
])
.to_owned();
assert_eq!(
query.to_string(MysqlQueryBuilder),
r#"SELECT MAX(`id`), 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 FROM `character`"#
);
assert_eq!(
query.to_string(PostgresQueryBuilder),
r#"SELECT MAX("id"), 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 FROM "character""#
);
assert_eq!(
query.to_string(SqliteQueryBuilder),
r#"SELECT MAX(`id`), 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 FROM `character`"#
);
Add a column to the select expression list.
Examples
use sea_query::{*, tests_cfg::*};
let query = Query::select()
.from(Char::Table)
.column(Char::Character)
.column(Char::SizeW)
.column(Char::SizeH)
.to_owned();
assert_eq!(
query.to_string(MysqlQueryBuilder),
r#"SELECT `character`, `size_w`, `size_h` FROM `character`"#
);
assert_eq!(
query.to_string(PostgresQueryBuilder),
r#"SELECT "character", "size_w", "size_h" FROM "character""#
);
assert_eq!(
query.to_string(SqliteQueryBuilder),
r#"SELECT `character`, `size_w`, `size_h` FROM `character`"#
);
use sea_query::{*, tests_cfg::*};
let query = Query::select()
.from(Char::Table)
.column((Char::Table, Char::Character))
.to_owned();
assert_eq!(
query.to_string(MysqlQueryBuilder),
r#"SELECT `character`.`character` FROM `character`"#
);
assert_eq!(
query.to_string(PostgresQueryBuilder),
r#"SELECT "character"."character" FROM "character""#
);
assert_eq!(
query.to_string(SqliteQueryBuilder),
r#"SELECT `character`.`character` FROM `character`"#
);
Please use the [SelectStatement::column
] with a tuple as [ColumnRef
]
pub fn columns<T, I>(&mut self, cols: I) -> &mut Self where
T: IntoColumnRef,
I: IntoIterator<Item = T>,
pub fn columns<T, I>(&mut self, cols: I) -> &mut Self where
T: IntoColumnRef,
I: IntoIterator<Item = T>,
Select columns.
Examples
use sea_query::{*, tests_cfg::*};
let query = Query::select()
.from(Char::Table)
.columns(vec![
Char::Character,
Char::SizeW,
Char::SizeH,
])
.to_owned();
assert_eq!(
query.to_string(MysqlQueryBuilder),
r#"SELECT `character`, `size_w`, `size_h` FROM `character`"#
);
assert_eq!(
query.to_string(PostgresQueryBuilder),
r#"SELECT "character", "size_w", "size_h" FROM "character""#
);
assert_eq!(
query.to_string(SqliteQueryBuilder),
r#"SELECT `character`, `size_w`, `size_h` FROM `character`"#
);
use sea_query::{*, tests_cfg::*};
let query = Query::select()
.from(Char::Table)
.columns(vec![
(Char::Table, Char::Character),
(Char::Table, Char::SizeW),
(Char::Table, Char::SizeH),
])
.to_owned();
assert_eq!(
query.to_string(MysqlQueryBuilder),
r#"SELECT `character`.`character`, `character`.`size_w`, `character`.`size_h` FROM `character`"#
);
assert_eq!(
query.to_string(PostgresQueryBuilder),
r#"SELECT "character"."character", "character"."size_w", "character"."size_h" FROM "character""#
);
assert_eq!(
query.to_string(SqliteQueryBuilder),
r#"SELECT `character`.`character`, `character`.`size_w`, `character`.`size_h` FROM `character`"#
);
pub fn table_columns<T, C>(&mut self, cols: Vec<(T, C)>) -> &mut Self where
T: IntoIden,
C: IntoIden,
Please use the [SelectStatement::columns
] with a tuple as [ColumnRef
]
Select column.
Examples
use sea_query::{*, tests_cfg::*};
let query = Query::select()
.from(Char::Table)
.expr_as(Expr::col(Char::Character), Alias::new("C"))
.to_owned();
assert_eq!(
query.to_string(MysqlQueryBuilder),
r#"SELECT `character` AS `C` FROM `character`"#
);
assert_eq!(
query.to_string(PostgresQueryBuilder),
r#"SELECT "character" AS "C" FROM "character""#
);
assert_eq!(
query.to_string(SqliteQueryBuilder),
r#"SELECT `character` AS `C` FROM `character`"#
);
pub fn expr_alias<T, A>(&mut self, expr: T, alias: A) -> &mut Self where
T: Into<SimpleExpr>,
A: IntoIden,
Please use the [SelectStatement::expr_as
] instead
From table.
Examples
use sea_query::{*, tests_cfg::*};
let query = Query::select()
.column(Char::FontSize)
.from(Char::Table)
.to_owned();
assert_eq!(
query.to_string(MysqlQueryBuilder),
r#"SELECT `font_size` FROM `character`"#
);
assert_eq!(
query.to_string(PostgresQueryBuilder),
r#"SELECT "font_size" FROM "character""#
);
assert_eq!(
query.to_string(SqliteQueryBuilder),
r#"SELECT `font_size` FROM `character`"#
);
use sea_query::{*, tests_cfg::*};
let query = Query::select()
.column(Char::FontSize)
.from((Char::Table, Glyph::Table))
.to_owned();
assert_eq!(
query.to_string(MysqlQueryBuilder),
r#"SELECT `font_size` FROM `character`.`glyph`"#
);
assert_eq!(
query.to_string(PostgresQueryBuilder),
r#"SELECT "font_size" FROM "character"."glyph""#
);
assert_eq!(
query.to_string(SqliteQueryBuilder),
r#"SELECT `font_size` FROM `character`.`glyph`"#
);
pub fn from_schema<S: 'static, T: 'static>(
&mut self,
schema: S,
table: T
) -> &mut Self where
S: IntoIden,
T: IntoIden,
π Deprecated since 0.9.0: Please use the [SelectStatement::from
] with a tuple as [TableRef
]
pub fn from_schema<S: 'static, T: 'static>(
&mut self,
schema: S,
table: T
) -> &mut Self where
S: IntoIden,
T: IntoIden,
Please use the [SelectStatement::from
] with a tuple as [TableRef
]
From schema.table.
Examples
use sea_query::{*, tests_cfg::*};
let query = Query::select()
.column(Char::FontSize)
.from_schema(Char::Table, Glyph::Table)
.to_owned();
assert_eq!(
query.to_string(MysqlQueryBuilder),
r#"SELECT `font_size` FROM `character`.`glyph`"#
);
assert_eq!(
query.to_string(PostgresQueryBuilder),
r#"SELECT "font_size" FROM "character"."glyph""#
);
assert_eq!(
query.to_string(SqliteQueryBuilder),
r#"SELECT `font_size` FROM `character`.`glyph`"#
);
pub fn from_as<R, A>(&mut self, tbl_ref: R, alias: A) -> &mut Self where
R: IntoTableRef,
A: IntoIden,
pub fn from_as<R, A>(&mut self, tbl_ref: R, alias: A) -> &mut Self where
R: IntoTableRef,
A: IntoIden,
From table with alias.
Examples
use sea_query::{*, tests_cfg::*};
let table_as: DynIden = SeaRc::new(Alias::new("char"));
let query = Query::select()
.from_as(Char::Table, table_as.clone())
.table_column(table_as.clone(), Char::Character)
.to_owned();
assert_eq!(
query.to_string(MysqlQueryBuilder),
r#"SELECT `char`.`character` FROM `character` AS `char`"#
);
assert_eq!(
query.to_string(PostgresQueryBuilder),
r#"SELECT "char"."character" FROM "character" AS "char""#
);
assert_eq!(
query.to_string(SqliteQueryBuilder),
r#"SELECT `char`.`character` FROM `character` AS `char`"#
);
use sea_query::{*, tests_cfg::*};
let table_as = Alias::new("alias");
let query = Query::select()
.from_as((Font::Table, Char::Table), table_as.clone())
.table_column(table_as, Char::Character)
.to_owned();
assert_eq!(
query.to_string(MysqlQueryBuilder),
r#"SELECT `alias`.`character` FROM `font`.`character` AS `alias`"#
);
assert_eq!(
query.to_string(PostgresQueryBuilder),
r#"SELECT "alias"."character" FROM "font"."character" AS "alias""#
);
assert_eq!(
query.to_string(SqliteQueryBuilder),
r#"SELECT `alias`.`character` FROM `font`.`character` AS `alias`"#
);
pub fn from_alias<R, A>(&mut self, tbl_ref: R, alias: A) -> &mut Self where
R: IntoTableRef,
A: IntoIden,
Please use the [SelectStatement::from_as
] instead
pub fn from_schema_as<S: 'static, T: 'static, A>(
&mut self,
schema: S,
table: T,
alias: A
) -> &mut Self where
S: IntoIden,
T: IntoIden,
A: IntoIden,
Please use the [SelectStatement::from_as
] with a tuple as [TableRef
]
pub fn from_subquery<T>(
&mut self,
query: SelectStatement,
alias: T
) -> &mut Self where
T: IntoIden,
pub fn from_subquery<T>(
&mut self,
query: SelectStatement,
alias: T
) -> &mut Self where
T: IntoIden,
From sub-query.
Examples
use sea_query::{*, tests_cfg::*};
let query = Query::select()
.columns(vec![
Glyph::Image
])
.from_subquery(
Query::select()
.columns(vec![
Glyph::Image, Glyph::Aspect
])
.from(Glyph::Table)
.take(),
Alias::new("subglyph")
)
.to_owned();
assert_eq!(
query.to_string(MysqlQueryBuilder),
r#"SELECT `image` FROM (SELECT `image`, `aspect` FROM `glyph`) AS `subglyph`"#
);
assert_eq!(
query.to_string(PostgresQueryBuilder),
r#"SELECT "image" FROM (SELECT "image", "aspect" FROM "glyph") AS "subglyph""#
);
assert_eq!(
query.to_string(SqliteQueryBuilder),
r#"SELECT `image` FROM (SELECT `image`, `aspect` FROM `glyph`) AS `subglyph`"#
);
pub fn left_join<R>(&mut self, tbl_ref: R, condition: SimpleExpr) -> &mut Self where
R: IntoTableRef,
pub fn left_join<R>(&mut self, tbl_ref: R, condition: SimpleExpr) -> &mut Self where
R: IntoTableRef,
Left join.
Examples
use sea_query::{*, tests_cfg::*};
let query = Query::select()
.column(Char::Character)
.table_column(Font::Table, Font::Name)
.from(Char::Table)
.left_join(Font::Table, Expr::tbl(Char::Table, Char::FontId).equals(Font::Table, Font::Id))
.to_owned();
assert_eq!(
query.to_string(MysqlQueryBuilder),
r#"SELECT `character`, `font`.`name` FROM `character` LEFT JOIN `font` ON `character`.`font_id` = `font`.`id`"#
);
assert_eq!(
query.to_string(PostgresQueryBuilder),
r#"SELECT "character", "font"."name" FROM "character" LEFT JOIN "font" ON "character"."font_id" = "font"."id""#
);
assert_eq!(
query.to_string(SqliteQueryBuilder),
r#"SELECT `character`, `font`.`name` FROM `character` LEFT JOIN `font` ON `character`.`font_id` = `font`.`id`"#
);
pub fn inner_join<R>(&mut self, tbl_ref: R, condition: SimpleExpr) -> &mut Self where
R: IntoTableRef,
pub fn inner_join<R>(&mut self, tbl_ref: R, condition: SimpleExpr) -> &mut Self where
R: IntoTableRef,
Inner join.
Examples
use sea_query::{*, tests_cfg::*};
let query = Query::select()
.column(Char::Character)
.table_column(Font::Table, Font::Name)
.from(Char::Table)
.inner_join(Font::Table, Expr::tbl(Char::Table, Char::FontId).equals(Font::Table, Font::Id))
.to_owned();
assert_eq!(
query.to_string(MysqlQueryBuilder),
r#"SELECT `character`, `font`.`name` FROM `character` INNER JOIN `font` ON `character`.`font_id` = `font`.`id`"#
);
assert_eq!(
query.to_string(PostgresQueryBuilder),
r#"SELECT "character", "font"."name" FROM "character" INNER JOIN "font" ON "character"."font_id" = "font"."id""#
);
assert_eq!(
query.to_string(SqliteQueryBuilder),
r#"SELECT `character`, `font`.`name` FROM `character` INNER JOIN `font` ON `character`.`font_id` = `font`.`id`"#
);
pub fn join<R>(
&mut self,
join: JoinType,
tbl_ref: R,
condition: SimpleExpr
) -> &mut Self where
R: IntoTableRef,
pub fn join<R>(
&mut self,
join: JoinType,
tbl_ref: R,
condition: SimpleExpr
) -> &mut Self where
R: IntoTableRef,
Join with other table by JoinType
.
Examples
use sea_query::{*, tests_cfg::*};
let query = Query::select()
.column(Char::Character)
.table_column(Font::Table, Font::Name)
.from(Char::Table)
.join(JoinType::RightJoin, Font::Table, Expr::tbl(Char::Table, Char::FontId).equals(Font::Table, Font::Id))
.to_owned();
assert_eq!(
query.to_string(MysqlQueryBuilder),
r#"SELECT `character`, `font`.`name` FROM `character` RIGHT JOIN `font` ON `character`.`font_id` = `font`.`id`"#
);
assert_eq!(
query.to_string(PostgresQueryBuilder),
r#"SELECT "character", "font"."name" FROM "character" RIGHT JOIN "font" ON "character"."font_id" = "font"."id""#
);
assert_eq!(
query.to_string(SqliteQueryBuilder),
r#"SELECT `character`, `font`.`name` FROM `character` RIGHT JOIN `font` ON `character`.`font_id` = `font`.`id`"#
);
pub fn join_as<R, A>(
&mut self,
join: JoinType,
tbl_ref: R,
alias: A,
condition: SimpleExpr
) -> &mut Self where
R: IntoTableRef,
A: IntoIden,
pub fn join_as<R, A>(
&mut self,
join: JoinType,
tbl_ref: R,
alias: A,
condition: SimpleExpr
) -> &mut Self where
R: IntoTableRef,
A: IntoIden,
Join with other table by JoinType
, assigning an alias to the joined table.
Examples
use sea_query::{*, tests_cfg::*};
let query = Query::select()
.column(Char::Character)
.table_column(Font::Table, Font::Name)
.from(Char::Table)
.join_as(
JoinType::RightJoin,
Font::Table,
Alias::new("f"),
Expr::tbl(Char::Table, Char::FontId).equals(Font::Table, Font::Id)
)
.to_owned();
assert_eq!(
query.to_string(MysqlQueryBuilder),
r#"SELECT `character`, `font`.`name` FROM `character` RIGHT JOIN `font` AS `f` ON `character`.`font_id` = `font`.`id`"#
);
assert_eq!(
query.to_string(PostgresQueryBuilder),
r#"SELECT "character", "font"."name" FROM "character" RIGHT JOIN "font" AS "f" ON "character"."font_id" = "font"."id""#
);
assert_eq!(
query.to_string(SqliteQueryBuilder),
r#"SELECT `character`, `font`.`name` FROM `character` RIGHT JOIN `font` AS `f` ON `character`.`font_id` = `font`.`id`"#
);
pub fn join_alias<R, A>(
&mut self,
join: JoinType,
tbl_ref: R,
alias: A,
condition: SimpleExpr
) -> &mut Self where
R: IntoTableRef,
A: IntoIden,
Please use the [SelectStatement::join_as
] instead
pub fn join_subquery<T>(
&mut self,
join: JoinType,
query: SelectStatement,
alias: T,
condition: SimpleExpr
) -> &mut Self where
T: IntoIden,
pub fn join_subquery<T>(
&mut self,
join: JoinType,
query: SelectStatement,
alias: T,
condition: SimpleExpr
) -> &mut Self where
T: IntoIden,
Join with sub-query.
Examples
use sea_query::{*, tests_cfg::*};
let sub_glyph: DynIden = SeaRc::new(Alias::new("sub_glyph"));
let query = Query::select()
.column(Font::Name)
.from(Font::Table)
.join_subquery(
JoinType::LeftJoin,
Query::select()
.column(Glyph::Id)
.from(Glyph::Table)
.take(),
sub_glyph.clone(),
Expr::tbl(Font::Table, Font::Id).equals(sub_glyph.clone(), Glyph::Id)
)
.to_owned();
assert_eq!(
query.to_string(MysqlQueryBuilder),
r#"SELECT `name` FROM `font` LEFT JOIN (SELECT `id` FROM `glyph`) AS `sub_glyph` ON `font`.`id` = `sub_glyph`.`id`"#
);
assert_eq!(
query.to_string(PostgresQueryBuilder),
r#"SELECT "name" FROM "font" LEFT JOIN (SELECT "id" FROM "glyph") AS "sub_glyph" ON "font"."id" = "sub_glyph"."id""#
);
assert_eq!(
query.to_string(SqliteQueryBuilder),
r#"SELECT `name` FROM `font` LEFT JOIN (SELECT `id` FROM `glyph`) AS `sub_glyph` ON `font`.`id` = `sub_glyph`.`id`"#
);
pub fn group_by_columns<T, I>(&mut self, cols: I) -> &mut Self where
T: IntoColumnRef,
I: IntoIterator<Item = T>,
pub fn group_by_columns<T, I>(&mut self, cols: I) -> &mut Self where
T: IntoColumnRef,
I: IntoIterator<Item = T>,
Group by columns.
Examples
use sea_query::{*, tests_cfg::*};
let query = Query::select()
.column(Char::Character)
.table_column(Font::Table, Font::Name)
.from(Char::Table)
.join(JoinType::RightJoin, Font::Table, Expr::tbl(Char::Table, Char::FontId).equals(Font::Table, Font::Id))
.group_by_columns(vec![
Char::Character,
])
.to_owned();
assert_eq!(
query.to_string(MysqlQueryBuilder),
r#"SELECT `character`, `font`.`name` FROM `character` RIGHT JOIN `font` ON `character`.`font_id` = `font`.`id` GROUP BY `character`"#
);
assert_eq!(
query.to_string(PostgresQueryBuilder),
r#"SELECT "character", "font"."name" FROM "character" RIGHT JOIN "font" ON "character"."font_id" = "font"."id" GROUP BY "character""#
);
assert_eq!(
query.to_string(SqliteQueryBuilder),
r#"SELECT `character`, `font`.`name` FROM `character` RIGHT JOIN `font` ON `character`.`font_id` = `font`.`id` GROUP BY `character`"#
);
use sea_query::{*, tests_cfg::*};
let query = Query::select()
.column(Char::Character)
.table_column(Font::Table, Font::Name)
.from(Char::Table)
.join(JoinType::RightJoin, Font::Table, Expr::tbl(Char::Table, Char::FontId).equals(Font::Table, Font::Id))
.group_by_columns(vec![
(Char::Table, Char::Character),
])
.to_owned();
assert_eq!(
query.to_string(MysqlQueryBuilder),
r#"SELECT `character`, `font`.`name` FROM `character` RIGHT JOIN `font` ON `character`.`font_id` = `font`.`id` GROUP BY `character`.`character`"#
);
assert_eq!(
query.to_string(PostgresQueryBuilder),
r#"SELECT "character", "font"."name" FROM "character" RIGHT JOIN "font" ON "character"."font_id" = "font"."id" GROUP BY "character"."character""#
);
assert_eq!(
query.to_string(SqliteQueryBuilder),
r#"SELECT `character`, `font`.`name` FROM `character` RIGHT JOIN `font` ON `character`.`font_id` = `font`.`id` GROUP BY `character`.`character`"#
);
Add a group by column.
use sea_query::{*, tests_cfg::*};
let query = Query::select()
.column(Char::Character)
.table_column(Font::Table, Font::Name)
.from(Char::Table)
.join(JoinType::RightJoin, Font::Table, Expr::tbl(Char::Table, Char::FontId).equals(Font::Table, Font::Id))
.group_by_col((Char::Table, Char::Character))
.to_owned();
assert_eq!(
query.to_string(MysqlQueryBuilder),
r#"SELECT `character`, `font`.`name` FROM `character` RIGHT JOIN `font` ON `character`.`font_id` = `font`.`id` GROUP BY `character`.`character`"#
);
assert_eq!(
query.to_string(PostgresQueryBuilder),
r#"SELECT "character", "font"."name" FROM "character" RIGHT JOIN "font" ON "character"."font_id" = "font"."id" GROUP BY "character"."character""#
);
assert_eq!(
query.to_string(SqliteQueryBuilder),
r#"SELECT `character`, `font`.`name` FROM `character` RIGHT JOIN `font` ON `character`.`font_id` = `font`.`id` GROUP BY `character`.`character`"#
);
pub fn group_by_table_columns<T, C>(&mut self, cols: Vec<(T, C)>) -> &mut Self where
T: IntoIden,
C: IntoIden,
Please use the [SelectStatement::group_by_columns
] with a tuple as [ColumnRef
]
pub fn add_group_by<I>(&mut self, expr: I) -> &mut Self where
I: IntoIterator<Item = SimpleExpr>,
pub fn add_group_by<I>(&mut self, expr: I) -> &mut Self where
I: IntoIterator<Item = SimpleExpr>,
Add group by expressions from vector of SelectExpr
.
Examples
use sea_query::{*, tests_cfg::*};
let query = Query::select()
.from(Char::Table)
.column(Char::Character)
.add_group_by(vec![
Expr::col(Char::SizeW).into(),
Expr::col(Char::SizeH).into(),
])
.to_owned();
assert_eq!(
query.to_string(MysqlQueryBuilder),
r#"SELECT `character` FROM `character` GROUP BY `size_w`, `size_h`"#
);
assert_eq!(
query.to_string(PostgresQueryBuilder),
r#"SELECT "character" FROM "character" GROUP BY "size_w", "size_h""#
);
assert_eq!(
query.to_string(SqliteQueryBuilder),
r#"SELECT `character` FROM `character` GROUP BY `size_w`, `size_h`"#
);
Having condition, expressed with any!
and all!
.
Examples
use sea_query::{*, tests_cfg::*};
let query = Query::select()
.column(Glyph::Aspect)
.expr(Expr::col(Glyph::Image).max())
.from(Glyph::Table)
.group_by_columns(vec![
Glyph::Aspect,
])
.cond_having(
all![
Expr::tbl(Glyph::Table, Glyph::Aspect).is_in(vec![3, 4]),
any![
Expr::tbl(Glyph::Table, Glyph::Image).like("A%"),
Expr::tbl(Glyph::Table, Glyph::Image).like("B%")
]
]
)
.to_owned();
assert_eq!(
query.to_string(MysqlQueryBuilder),
r#"SELECT `aspect`, MAX(`image`) FROM `glyph` GROUP BY `aspect` HAVING `glyph`.`aspect` IN (3, 4) AND (`glyph`.`image` LIKE 'A%' OR `glyph`.`image` LIKE 'B%')"#
);
And having condition.
Examples
use sea_query::{*, tests_cfg::*};
let query = Query::select()
.column(Glyph::Aspect)
.expr(Expr::col(Glyph::Image).max())
.from(Glyph::Table)
.group_by_columns(vec![
Glyph::Aspect,
])
.and_having(Expr::col(Glyph::Aspect).gt(2))
.cond_having(Expr::col(Glyph::Aspect).lt(8))
.to_owned();
assert_eq!(
query.to_string(MysqlQueryBuilder),
r#"SELECT `aspect`, MAX(`image`) FROM `glyph` GROUP BY `aspect` HAVING `aspect` > 2 AND `aspect` < 8"#
);
assert_eq!(
query.to_string(PostgresQueryBuilder),
r#"SELECT "aspect", MAX("image") FROM "glyph" GROUP BY "aspect" HAVING "aspect" > 2 AND "aspect" < 8"#
);
assert_eq!(
query.to_string(SqliteQueryBuilder),
r#"SELECT `aspect`, MAX(`image`) FROM `glyph` GROUP BY `aspect` HAVING `aspect` > 2 AND `aspect` < 8"#
);
π Deprecated since 0.12.0: Please use [ConditionalStatement::cond_having
]. Calling or_having
after and_having
will panic.
Please use [ConditionalStatement::cond_having
]. Calling or_having
after and_having
will panic.
Or having condition. Please use cond_having
instead.
Calling or_having
after and_having
will panic.
Examples
use sea_query::{*, tests_cfg::*};
let query = Query::select()
.column(Glyph::Aspect)
.expr(Expr::col(Glyph::Image).max())
.from(Glyph::Table)
.group_by_columns(vec![
Glyph::Aspect,
])
.or_having(Expr::col(Glyph::Aspect).gt(2))
.or_having(Expr::col(Glyph::Aspect).lt(8))
.to_owned();
assert_eq!(
query.to_string(MysqlQueryBuilder),
r#"SELECT `aspect`, MAX(`image`) FROM `glyph` GROUP BY `aspect` HAVING `aspect` > 2 OR `aspect` < 8"#
);
assert_eq!(
query.to_string(PostgresQueryBuilder),
r#"SELECT "aspect", MAX("image") FROM "glyph" GROUP BY "aspect" HAVING "aspect" > 2 OR "aspect" < 8"#
);
assert_eq!(
query.to_string(SqliteQueryBuilder),
r#"SELECT `aspect`, MAX(`image`) FROM `glyph` GROUP BY `aspect` HAVING `aspect` > 2 OR `aspect` < 8"#
);
Limit the number of returned rows.
Examples
use sea_query::{*, tests_cfg::*};
let query = Query::select()
.column(Glyph::Aspect)
.from(Glyph::Table)
.limit(10)
.to_owned();
assert_eq!(
query.to_string(MysqlQueryBuilder),
r#"SELECT `aspect` FROM `glyph` LIMIT 10"#
);
assert_eq!(
query.to_string(PostgresQueryBuilder),
r#"SELECT "aspect" FROM "glyph" LIMIT 10"#
);
assert_eq!(
query.to_string(SqliteQueryBuilder),
r#"SELECT `aspect` FROM `glyph` LIMIT 10"#
);
Reset limit
Offset number of returned rows.
Examples
use sea_query::{*, tests_cfg::*};
let query = Query::select()
.column(Glyph::Aspect)
.from(Glyph::Table)
.limit(10)
.offset(10)
.to_owned();
assert_eq!(
query.to_string(MysqlQueryBuilder),
r#"SELECT `aspect` FROM `glyph` LIMIT 10 OFFSET 10"#
);
assert_eq!(
query.to_string(PostgresQueryBuilder),
r#"SELECT "aspect" FROM "glyph" LIMIT 10 OFFSET 10"#
);
assert_eq!(
query.to_string(SqliteQueryBuilder),
r#"SELECT `aspect` FROM `glyph` LIMIT 10 OFFSET 10"#
);
Reset offset
pub fn order_by_tbl<T, C>(
&mut self,
table: T,
col: C,
order: Order
) -> &mut Self where
T: IntoIden,
C: IntoIden,
Please use the [OrderedStatement::order_by
] with a tuple as [ColumnRef
]
pub fn order_by_columns<T>(&mut self, cols: Vec<(T, Order)>) -> &mut Self where
T: IntoColumnRef,
pub fn order_by_table_columns<T, C>(
&mut self,
cols: Vec<(T, C, Order)>
) -> &mut Self where
T: IntoIden,
C: IntoIden,
Please use the [OrderedStatement::order_by_columns
] with a tuple as [ColumnRef
]
Please use [ConditionalStatement::cond_where
]. Calling or_where
after and_where
will panic.
Trait Implementations
Where condition, expressed with any
and all
.
Calling cond_where
multiple times will conjoin them.
Calling or_where
after cond_where
will panic. Read more
And where condition. This cannot be mixed with ConditionalStatement::or_where
.
Calling or_where
after and_where
will panic. Read more
Optional and where, short hand for if c.is_some() q.and_where(c)
. Read more
Please use [ConditionalStatement::cond_where
]. Calling or_where
after and_where
will panic.
Or where condition. This cannot be mixed with ConditionalStatement::and_where
.
Calling or_where
after and_where
will panic. Read more
Order by column. Read more
Please use the [OrderedStatement::order_by
] with a tuple as [ColumnRef
]
Order by SimpleExpr
.
Order by custom string.
Order by vector of columns.
fn build_collect<T: QueryBuilder>(
&self,
query_builder: T,
collector: &mut dyn FnMut(Value)
) -> String
fn build_collect<T: QueryBuilder>(
&self,
query_builder: T,
collector: &mut dyn FnMut(Value)
) -> String
Build corresponding SQL statement for certain database backend and collect query parameters
Examples
use sea_query::{*, tests_cfg::*};
let query = Query::select()
.column(Glyph::Aspect)
.from(Glyph::Table)
.and_where(Expr::expr(Expr::col(Glyph::Aspect).if_null(0)).gt(2))
.order_by(Glyph::Image, Order::Desc)
.order_by_tbl(Glyph::Table, Glyph::Aspect, Order::Asc)
.to_owned();
assert_eq!(
query.to_string(MysqlQueryBuilder),
r#"SELECT `aspect` FROM `glyph` WHERE IFNULL(`aspect`, 0) > 2 ORDER BY `image` DESC, `glyph`.`aspect` ASC"#
);
let mut params = Vec::new();
let mut collector = |v| params.push(v);
assert_eq!(
query.build_collect(MysqlQueryBuilder, &mut collector),
r#"SELECT `aspect` FROM `glyph` WHERE IFNULL(`aspect`, ?) > ? ORDER BY `image` DESC, `glyph`.`aspect` ASC"#
);
assert_eq!(
params,
vec![Value::Int(0), Value::Int(2)]
);
fn build_collect_any(
&self,
query_builder: &dyn QueryBuilder,
collector: &mut dyn FnMut(Value)
) -> String
fn build_collect_any(
&self,
query_builder: &dyn QueryBuilder,
collector: &mut dyn FnMut(Value)
) -> String
Build corresponding SQL statement for certain database backend and collect query parameters
Build corresponding SQL statement for certain database backend and return SQL string Read more
Build corresponding SQL statement for certain database backend and collect query parameters into a vector Read more
Auto Trait Implementations
impl !RefUnwindSafe for SelectStatement
impl Send for SelectStatement
impl Sync for SelectStatement
impl Unpin for SelectStatement
impl !UnwindSafe for SelectStatement
Blanket Implementations
Mutably borrows from an owned value. Read more
type Output = T
type Output = T
Should always be Self