[][src]Struct quaint::ast::Select

pub struct Select<'a> { /* fields omitted */ }

A builder for a SELECT statement.

Methods

impl<'a> Select<'a>[src]

pub fn from_table<T>(table: T) -> Self where
    T: Into<Table<'a>>, 
[src]

Creates a new SELECT statement for the given table.

let query = Select::from_table("users");
let (sql, _) = Sqlite::build(query);

assert_eq!("SELECT `users`.* FROM `users`", sql);

The table can be in multiple parts, defining the database.

let query = Select::from_table(("crm", "users"));
let (sql, _) = Sqlite::build(query);

assert_eq!("SELECT `crm`.`users`.* FROM `crm`.`users`", sql);

It is also possible to use a nested SELECT.

let select = Table::from(Select::default().value(1)).alias("num");
let query = Select::from_table(select.alias("num"));
let (sql, params) = Sqlite::build(query);

assert_eq!("SELECT `num`.* FROM (SELECT ?) AS `num`", sql);
assert_eq!(vec![ParameterizedValue::from(1)], params);

pub fn value<T>(self, value: T) -> Self where
    T: Into<DatabaseValue<'a>>, 
[src]

Selects a static value as the column.

let query = Select::default().value(1);
let (sql, params) = Sqlite::build(query);

assert_eq!("SELECT ?", sql);
assert_eq!(vec![ParameterizedValue::from(1)], params);

Creating a qualified asterisk to a joined table:

let join = "dogs".on(("dogs", "slave_id").equals(Column::from(("cats", "master_id"))));

let query = Select::from_table("cats")
    .value(Table::from("cats").asterisk())
    .value(col!("dogs", "age") - val!(4))
    .inner_join(join);

let (sql, params) = Sqlite::build(query);

assert_eq!(
    "SELECT `cats`.*, (`dogs`.`age` - ?) FROM `cats` INNER JOIN `dogs` ON `dogs`.`slave_id` = `cats`.`master_id`",
    sql
);

assert_eq!(vec![ParameterizedValue::from(4)], params);

pub fn column<T>(self, column: T) -> Self where
    T: Into<Column<'a>>, 
[src]

Adds a column to be selected.

let query = Select::from_table("users")
    .column("name")
    .column(("users", "id"))
    .column((("crm", "users"), "foo"));

let (sql, _) = Sqlite::build(query);

assert_eq!("SELECT `name`, `users`.`id`, `crm`.`users`.`foo` FROM `users`", sql);

pub fn columns<T, C>(self, columns: T) -> Self where
    T: IntoIterator<Item = C>,
    C: Into<Column<'a>>, 
[src]

A bulk method to select multiple values.

let query = Select::from_table("users").columns(vec!["foo", "bar"]);
let (sql, _) = Sqlite::build(query);

assert_eq!("SELECT `foo`, `bar` FROM `users`", sql);

pub fn so_that<T>(self, conditions: T) -> Self where
    T: Into<ConditionTree<'a>>, 
[src]

Adds WHERE conditions to the query, replacing the previous conditions. See Comparable for more examples.

let query = Select::from_table("users").so_that("foo".equals("bar"));
let (sql, params) = Sqlite::build(query);

assert_eq!("SELECT `users`.* FROM `users` WHERE `foo` = ?", sql);

assert_eq!(vec![
   ParameterizedValue::from("bar"),
], params);

pub fn and_where<T>(self, conditions: T) -> Self where
    T: Into<ConditionTree<'a>>, 
[src]

Adds an additional WHERE condition to the query combining the possible previous condition with AND. See Comparable for more examples.

let query = Select::from_table("users")
    .so_that("foo".equals("bar"))
    .and_where("lol".equals("wtf"));

let (sql, params) = Sqlite::build(query);

assert_eq!("SELECT `users`.* FROM `users` WHERE (`foo` = ? AND `lol` = ?)", sql);

assert_eq!(vec![
   ParameterizedValue::from("bar"),
   ParameterizedValue::from("wtf"),
], params);

pub fn or_where<T>(self, conditions: T) -> Self where
    T: Into<ConditionTree<'a>>, 
[src]

Adds an additional WHERE condition to the query combining the possible previous condition with OR. See Comparable for more examples.

let query = Select::from_table("users")
    .so_that("foo".equals("bar"))
    .or_where("lol".equals("wtf"));

let (sql, params) = Sqlite::build(query);

assert_eq!("SELECT `users`.* FROM `users` WHERE (`foo` = ? OR `lol` = ?)", sql);

assert_eq!(vec![
   ParameterizedValue::from("bar"),
   ParameterizedValue::from("wtf"),
], params);

pub fn inner_join<J>(self, join: J) -> Self where
    J: Into<JoinData<'a>>, 
[src]

Adds INNER JOIN clause to the query.

let join = "posts".alias("p").on(("p", "user_id").equals(Column::from(("users", "id"))));
let query = Select::from_table("users").inner_join(join);
let (sql, _) = Sqlite::build(query);

assert_eq!(
    "SELECT `users`.* FROM `users` INNER JOIN `posts` AS `p` ON `p`.`user_id` = `users`.`id`",
    sql
);

pub fn left_join<J>(self, join: J) -> Self where
    J: Into<JoinData<'a>>, 
[src]

Adds LEFT JOIN clause to the query.

let join = "posts".alias("p").on(("p", "visible").equals(true));
let query = Select::from_table("users").left_join(join);
let (sql, params) = Sqlite::build(query);

assert_eq!(
    "SELECT `users`.* FROM `users` LEFT JOIN `posts` AS `p` ON `p`.`visible` = ?",
    sql
);

assert_eq!(
    vec![
        ParameterizedValue::from(true),
    ],
    params
);

pub fn right_join<J>(self, join: J) -> Self where
    J: Into<JoinData<'a>>, 
[src]

Adds RIGHT JOIN clause to the query.

let join = "posts".alias("p").on(("p", "visible").equals(true));
let query = Select::from_table("users").right_join(join);
let (sql, params) = Sqlite::build(query);

assert_eq!(
    "SELECT `users`.* FROM `users` RIGHT JOIN `posts` AS `p` ON `p`.`visible` = ?",
    sql
);

assert_eq!(
    vec![
        ParameterizedValue::from(true),
    ],
    params
);

pub fn full_join<J>(self, join: J) -> Self where
    J: Into<JoinData<'a>>, 
[src]

Adds FULL JOIN clause to the query.

let join = "posts".alias("p").on(("p", "visible").equals(true));
let query = Select::from_table("users").full_join(join);
let (sql, params) = Sqlite::build(query);

assert_eq!(
    "SELECT `users`.* FROM `users` FULL JOIN `posts` AS `p` ON `p`.`visible` = ?",
    sql
);

assert_eq!(
    vec![
        ParameterizedValue::from(true),
    ],
    params
);

pub fn order_by<T>(self, value: T) -> Self where
    T: IntoOrderDefinition<'a>, 
[src]

Adds an ordering to the ORDER BY section.

let query = Select::from_table("users")
    .order_by("foo")
    .order_by("baz".ascend())
    .order_by("bar".descend());

let (sql, _) = Sqlite::build(query);

assert_eq!("SELECT `users`.* FROM `users` ORDER BY `foo`, `baz` ASC, `bar` DESC", sql);

pub fn group_by<T>(self, value: T) -> Self where
    T: IntoGroupByDefinition<'a>, 
[src]

Adds a grouping to the GROUP BY section.

This does not check if the grouping is actually valid in respect to aggregated columns.

let query = Select::from_table("users").column("foo").column("bar")
    .group_by("foo")
    .group_by("bar");

let (sql, _) = Sqlite::build(query);

assert_eq!("SELECT `foo`, `bar` FROM `users` GROUP BY `foo`, `bar`", sql);

pub fn having<T>(self, conditions: T) -> Self where
    T: Into<ConditionTree<'a>>, 
[src]

Adds group conditions to a query. Should be combined together with a group_by statement.

let query = Select::from_table("users").column("foo").column("bar")
    .group_by("foo")
    .having("foo".greater_than(100));

let (sql, params) = Sqlite::build(query);

assert_eq!("SELECT `foo`, `bar` FROM `users` GROUP BY `foo` HAVING `foo` > ?", sql);
assert_eq!(vec![ParameterizedValue::from(100)], params);

pub fn limit(self, limit: usize) -> Self[src]

Sets the LIMIT value.

let query = Select::from_table("users").limit(10);
let (sql, params) = Sqlite::build(query);

assert_eq!("SELECT `users`.* FROM `users` LIMIT ?", sql);
assert_eq!(vec![ParameterizedValue::from(10)], params);

pub fn offset(self, offset: usize) -> Self[src]

Sets the OFFSET value.

let query = Select::from_table("users").offset(10);
let (sql, params) = Sqlite::build(query);

assert_eq!("SELECT `users`.* FROM `users` LIMIT ? OFFSET ?", sql);
assert_eq!(vec![ParameterizedValue::from(-1), ParameterizedValue::from(10)], params);

Trait Implementations

impl<'a> Clone for Select<'a>[src]

impl<'a> Debug for Select<'a>[src]

impl<'a> Default for Select<'a>[src]

impl<'a> From<Select<'a>> for ConditionTree<'a>[src]

impl<'a> From<Select<'a>> for Expression<'a>[src]

impl<'a> From<Select<'a>> for DatabaseValue<'a>[src]

impl<'a> From<Select<'a>> for Query<'a>[src]

impl<'a> From<Select<'a>> for Table<'a>[src]

impl<'a> PartialEq<Select<'a>> for Select<'a>[src]

impl<'a> StructuralPartialEq for Select<'a>[src]

Auto Trait Implementations

impl<'a> RefUnwindSafe for Select<'a>

impl<'a> Send for Select<'a>

impl<'a> Sync for Select<'a>

impl<'a> Unpin for Select<'a>

impl<'a> UnwindSafe for Select<'a>

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> From<T> for T[src]

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T> Same<T> for T

type Output = T

Should always be Self

impl<T> ToOwned for T where
    T: Clone
[src]

type Owned = T

The resulting type after obtaining ownership.

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

impl<V, T> VZip<V> for T where
    V: MultiLane<T>,