SELECT
, (*13)
Columns can be specified in the select($col, ...)
, col($col, $alias)
or
col(array $cols)
., (*14)
// SELECT * FROM `Users`
$qry = $users->select();
// SELECT `user_id`, `user_name` FROM `Users`
$qry = $users->select('user_id', 'user_name');
// SELECT `user_id`, `user_name` AS `n` FROM `Users`
$qry = $users->select()->col('user_id')->col('user_name', 'n');
// same as above
$qry = $users->select()->col(['user_id', 'user_name' => 'n']);
Raw string can be provided using colRaw($string, array $parameters)
, (*15)
// SELECT COUNT(user_id) AS cnt FROM `Users`
$qry = $users->select()->colRaw('COUNT(user_id) AS cnt');
// SELECT CONCAT(user_name, 'x') AS con FROM `Users`
$qry = $users->select()->colRaw('CONCAT(user_name, ?) AS con', ['x']);
Common functions like cnt($col, $alias)
, min($col, $alias)
,
max($col, $alias)
, avg($col, $alias)
, sum($col, $alias)
can also be
used directly., (*16)
// SELECT MAX(`user_id`) AS `maxId` FROM `Users`
$qry = $users->select()->max('user_id', 'maxId');
Generic column template by using colTpl($template, $cols, $alias)
,, (*17)
// SELECT SUM(DISTINCT `score`) AS `s` FROM `Users`
$qry = $users->select()->colTpl('SUM(DISTINCT %s)', 'score', 's');
// SELECT CONCAT(`fname`, ' ', `lname`) AS `fullName` FROM `Users`
$qry = $users->select()->colTpl("CONCAT(%s, ' ', %s)", ['fname', 'lname'], 'fullName');
Subquery can also be use in col()
,, (*18)
// SELECT (SELECT MAX(`user_id`) FROM `oldUsers`) AS `maxId` FROM `Users`
$qry = $users->select()->col(
$users->select()->max('user_id')->table('oldUsers'),
'maxId'
);
DISTINCT
can be specified with distinct(...)
,, (*19)
// SELECT DISTINCT `user_alias` FROM `Users`
$qry = $users->select()->distinct('user_alias');
// SELECT DISTINCT `user_alias` AS `a` FROM `Users`
$qry = $users->select()->distinct()->col('user_alias', 'a');
from($table, $alias)
or table($table, $alias)
can be used with
$builder
object or query object such as $builder->select()
., (*20)
Using table()
to replace any existing tables,, (*21)
// $sales is a clone of builder $users with table replaced
$sales = $users->table('Sales');
// or replace table in the select query object
$select = $users->select()->table('Sales', 's');
// SELECT * FROM `Users` AS `u`, `Accounts` AS `a`
$qry = $users->select()->table(['Users' => 'u', 'Accounts' => 'a']);
Using from()
to append to any existing tables,, (*22)
// SELECT * FROM `Users`, `Sales` AS `s`
$select = $users->select()->from('Sales', 's');
// builder has two tables now
$usersAndSales = $users->from('Sales', 's');
Subqueries can be used in from()
or table()
,, (*23)
// SELECT * FROM (SELECT `user_id` FROM `oldUsers`) AS `u`
$qry = $users->select()->table(
$users->select('user_id')->table('oldUsers'),
'u'
);
Group result with group($col, ...)
,, (*24)
// SELECT `grp_id`, COUNT(*) AS `cnt` FROM `Users` GROUP BY `grp_id`
$qry = $users->select()->col('grp_id')->cnt('*', 'cnt')->group('grp_id');
Multiple group()
and groupRaw($str, array $params)
,, (*25)
// SELECT `grp_id`, `age`, COUNT(*) AS `cnt` FROM `Users` GROUP BY `grp_id`, age ASC
$qry = $users->select('grp_id', 'age')->cnt('*', 'cnt')
->group('grp_id')->groupRaw('age ASC');
Template can also be used with groupTpl($template, $cols)
,, (*26)
// GROUP BY `year` WITH ROLLUP
$users->select()->groupTpl('%s WITH ROLLUP', 'year')
Join using join($table, $col)
,, (*27)
// SELECT * FROM `Users` INNER JOIN `Accounts`
$qry = $users->select()->join('Accounts');
// SELECT * FROM `Users` INNER JOIN `Accounts` ON `Users`.`id` = `Accounts`.`id`
$qry = $users->select()->join('Accounts', 'id');
Specify alias for the joined table,, (*28)
// SELECT * FROM `Users` INNER JOIN `Accounts` AS `a` ON `Users`.`id` = `a`.`id`
$qry = $users->select()->join(['Accounts', 'a'], 'id');
Join table with different column name,, (*29)
// SELECT * FROM `Users` INNER JOIN `Accounts` AS `a` ON `Users`.`id` = `a`.`user_id`
$qry = $users->select()->join(['Accounts'], 'a'], ['id', 'user_id']);
// same as above
$qry = $users->select()->join(['Accounts'], 'a'], ['Users.id', 'a.user_id']);
Join with operator specified,, (*30)
// SELECT * FROM `Users` INNER JOIN `Accounts` AS `a` ON `Users`.`id` <> `a`.`user_id`
$qry = $users->select()->join(['Accounts', 'a'], ['id', '<>', 'user_id']);
Multiple joins,, (*31)
// SELECT * FROM `Users`
// INNER JOIN `Sales` AS `s` ON `Users`.`uid` = `s`.`uid`
// INNER JOIN `Orders` AS `o` ON `Users`.`uid` = `o`.`oid`
$qry = $users->select()
->join(['Sales', 's'], ['uid', '=', 'uid'])
->join(['Orders', 'o'], ['uid', 'o.oid']);
Subqueries in join,, (*32)
// SELECT * FROM `Users` INNER JOIN (SELECT `uid` FROM `oldUsers`) AS `x` ON `Users`.`uid` = `x`.`uid`
$qry = $users->select()->join(
[$builder->select('uid')->from('oldUsers'), 'x'],
'uid'
);
Other joins leftJoin()
, rightJoin()
, outerJoin()
, leftOuterJoin()
,
rightOuterJoin()
, crossJoin()
are supported. If want to use your own
join, joinRaw()
is handy., (*33)
// SELECT * FROM `Users` OUTER JOIN `Accounts` AS `a` ON `Users`.`id` = `a`.`id`
$qry = $users->select()->outerJoin(['Accounts', 'a'], 'id');
// SELECT * FROM `Users` NATURAL JOIN Accounts AS a ON Users.id = a.id
$qry = $users->select()->joinRaw('NATURAL JOIN', 'Accounts AS a ON Users.id = a.id');
LIMIT
and OFFSET
are supported,, (*34)
// SELECT * FROM `Users` LIMIT 30 OFFSET 10
$qry = $users->select()->limit(30, 10);
// SELECT * FROM `Users` LIMIT 20 OFFSET 15
$qry = $users->select()->limit(20)->offset(15);
Or use page($pageNum, $pageLength)
where $pageNum
starts from 1
,, (*35)
// SELECT * FROM `Users` LIMIT 30 OFFSET 60
$qry = $users->select()->page(3, 30);
Order by ASC or DESC, (*36)
// SELECT * FROM `Users` ORDER BY `age` ASC, `score` DESC
$qry = $users->select()->order('age')->orderDesc('score');
Or raw mode, (*37)
// SELECT * FROM `Users` ORDER BY age ASC, score DESC
$qry = $users->select()->orderRaw('age ASC, score DESC');
Simple where clauses,, (*38)
// SELECT * FROM `Users` WHERE age > 18
$qry = $users->select()->where('age > 18');
// SELECT * FROM `Users` WHERE `age` = 18
$qry = $users->select()->where('age', 18);
// SELECT * FROM `Users` WHERE `age` < 18
$qry = $users->select()->where('age', '<', 18);
Multiple wheres,, (*39)
// SELECT * FROM `Users` WHERE `age` > 18 AND `gender` = 'male'
$qry = $users->select()->where(['age' => ['>', 18], 'gender' => 'male']);
// same as above
$qry = $users->select()->where('age', '>', 18)->andWhere('gender','male');
Complex where,, (*40)
// SELECT * FROM `Users` WHERE (`id` = 1 OR (`id` < 20 OR `id` > 100)) OR `name` = 'Tester'
$qry = $users->select()->where(
$users->expr()->where('id', 1)->orWhere(
$users->expr()->where('id', '<', 20)->orWhere('id', '>', 100)
)
)->orWhere('name', 'Tester');
Raw mode,, (*41)
// SELECT * FROM `Users` WHERE age = 18 OR score > 90
$qry = $users->select()->whereRaw('age = 18')->orWhereRaw('score > 90');
with NOT
,, (*42)
// SELECT * FROM `Users` WHERE NOT `age` = 18 OR NOT `score` > 90
$qry = $users->select()->whereNot('age', 18)->orWhereNot('score', '>', 90);
Where IN
and BETWEEN
, (*43)
// SELECT * FROM `Users` WHERE `age` IN (10,12,15,18,20)
$qry = $users->select()->where('age', 'IN', [10,12,15,18,20]);
// SELECT * FROM `Users` WHERE `age` NOT BETWEEN 10 AND 20
$qry = $users->select()->where('age', 'NOT BETWEEN', [10,20]);
IS NULL
,, (*44)
// SELECT * FROM `Users` WHERE `age` IS NULL
$qry = $users->select()->where('age', 'IS', NULL);
EXISTS
,, (*45)
// SELECT * FROM `Sales` WHERE EXISTS (SELECT `user_id` FROM `Users`)
$sql = $sales->select()->where('', 'EXISTS', $users->select('user_id'))->getSql();
Similar to WHERE
clause,, (*46)
// SELECT * FROM `Users` HAVING `age` = 10 OR `level` > 20
$qry = $users->select()->having('age', 10)->orHaving('level', '>', 20);
union()
or unionAll()
can be used with builder or query object,, (*47)
// SELECT * FROM `Users`
// UNION
// SELECT * FROM `oldUsers1`
// UNION ALL
// SELECT `user_id` FROM `oldUsers2`
$sql = $users->select()
->union()
->select()->table('oldUsers1')
->unionAll()
->select('user_id')->table('oldUsers2')
->getSql()
// (SELECT * FROM `Users`) UNION (SELECT * FROM `oldUesrs`) ORDER BY `user_id` ASC LIMIT 10
$sql = $builder->union(
$builder->select()->table('Users'),
$builder->select()->table('oldUsers')
)->order('user_id')->limit(10)->getSql();