The power of mysql group_concat

Syntax Differences

Here are the three main syntax differences between MySQL’s  and T-SQL’s  functions:

  • Default Separator: Probably the most obvious difference is the fact that  requires you to specify a separator. If you don’t provide two arguments (the second of which is the separator) you’ll get an error. With MySQL’s  function on the other hand, the separator is an optional argument. If you don’t provide it, it will use a comma by default.
  • Ordering the Results: While both MySQL’s and T-SQL’s functions allow you to add an clause, the syntax is slightly different. T-SQL requires you to use the clause when ordering the result set, whereas MySQL doesn’t have this requirement.
  • Distinct Results: MySQL allows you to use to return only unique values. T-SQL doesn’t provide this option.

Below are examples to demonstrate these differences.

Останавливаемые функции

Приостановка происходит в случае вызова функции, обозначенной специальным модификатором :

Такие функции называются функциями остановки (приостановки), поскольку их вызовы могут приостановить выполнение сопрограммы (библиотека может принять решение продолжать работу без приостановки, если результат вызова уже доступен). Функции остановки могут иметь параметры и возвращать значения точно так же, как и все обычные функции, но они могут быть вызваны только из сопрограмм или других функций остановки. В конечном итоге, при старте сопрограммы она должна содержать как минимум одну функцию остановки, и функция эта обычно анонимная (лямбда-функция остановки). Давайте взглянем, для примера, на упрощённую функцию (из библиотеки ):

Здесь является обычной функцией (не функцией остановки), но параметр имеет функциональный тип с модификатором : . Таким образом, когда мы передаём лямбда-функцию в , она является анонимной функцией остановки, и мы можем вызывать функцию остановки изнутри её:

Продолжая аналогию, может быть функцией остановки (также может вызываться из блока ), которая приостанавливает сопрограмму до тех пор, пока некоторые вычисления не будут выполнены, и затем возвращает их результат:

Больше информации о том, как действительно работают функции в , может быть найдено .

Отметим, что функции приостановки и не могут быть вызваны из обыкновенных функций, подобных :

Заметим, что функции остановки могут быть виртуальными, и при их переопределении модификатор также должен быть указан:

Aннотация @RestrictsSuspension

Расширяющие функции (и анонимные функции) также могут быть маркированы как , подобно и всем остальным (регулярным) функциям. Это позволяет создавать DSL и другие API, которые пользователь может расширять. В некоторых случаях автору библиотеки необходимо запретить пользователю добавлять новые пути приостановки сопрограммы.

Чтобы осуществить это, можно использовать аннотацию . Когда целевой класс или интерфейс аннотируется подобным образом, все расширения приостановки должны делегироваться либо из членов , либо из других его расширений. Поскольку расширения не могут делегировать друг друга до бесконечности (иначе программа никогда не завершится), гарантируется, что все приостановки пройдут посредством вызова члена , так что автор библиотеки может полностью их контролировать.

Это актуально в тех редких случаях, когда каждая приостановка обрабатывается специальным образом в библиотеке. Например, при реализации генераторов через функцию, описанную , мы должны быть уверены, что любой приостанавливаемый вызовов в сопрограмме завершается вызовом либо , либо , а не какой-либо другой функции. Именно по этой причине аннотирована с @RestrictsSuspension:

См. исходники на Github.

Default Separator

MySQL – GROUP_CONCAT()

We don’t need to specify the separator in MySQL. This is an optional argument. The default value is a comma.

SELECT GROUP_CONCAT(Genre) AS Result
FROM Genres;

Result:

+----------------------------------------------+
| Result                                       |
+----------------------------------------------+
| Rock,Jazz,Country,Pop,Blues,Hip Hop,Rap,Punk |
+----------------------------------------------+

T-SQL – STRING_AGG()

T-SQL requires us to specify the separator.

SELECT STRING_AGG(Genre, ',') AS Result
FROM Genres;

Result:

Result                                      
--------------------------------------------
Rock,Jazz,Country,Pop,Blues,Hip Hop,Rap,Punk

If we don’t specify a separator we get an error:

SELECT STRING_AGG(Genre) AS Result
FROM Genres;

Result:

Error: The STRING_AGG function requires 2 argument(s).

MySQL CONCAT Function Conversion to Other Databases

Concatenate strings:

Oracle:

Oracle supports CONCAT function, but it can accept only 2 arguments. For more than 2 arguments the conversion to || string concatenation operator or nested CONCAT calls is required:

   -- Concatenate 2 strings
   SELECT CONCAT('AB', 'CD');
 
   -- Concatenate more than 2 strings
   SELECT 'AB' || 'CD' || 'EF';
   -- or
   SELECT CONCAT(CONCAT('AB', 'CD'),'EF') FROM dual;

SQL Server:

SQL Server does not support CONCAT function, so the conversion to + string concatenation operator is required:

   -- Concatenate 2 strings
   SELECT 'AB' + 'CD';
 
   -- Concatenate more than 2 strings
   SELECT 'AB' + 'CD' + 'EF';

PostgreSQL:

PostgreSQL supports CONCAT function with the same syntax, so no any conversion is required:

   -- Concatenate 2 strings
   SELECT CONCAT('AB', 'CD');
 
   -- Concatenate more than 2 strings
   SELECT CONCAT('AB', 'CD', 'EF');

Причины ошибок в файле Concat.js

Проблемы Concat.js могут быть отнесены к поврежденным или отсутствующим файлам, содержащим ошибки записям реестра, связанным с Concat.js, или к вирусам / вредоносному ПО.

Более конкретно, данные ошибки concat.js могут быть вызваны следующими причинами:

  • Поврежденные ключи реестра Windows, связанные с concat.js / Adobe Photoshop Elements and Adobe Premiere Elements.
  • Вирус или вредоносное ПО, которые повредили файл concat.js или связанные с Adobe Photoshop Elements and Adobe Premiere Elements программные файлы.
  • Другая программа злонамеренно или по ошибке удалила файлы, связанные с concat.js.
  • Другая программа находится в конфликте с Adobe Photoshop Elements and Adobe Premiere Elements и его общими файлами ссылок.
  • Поврежденная загрузка или неполная установка программного обеспечения Adobe Photoshop Elements and Adobe Premiere Elements.

Introduction to MySQL GROUP_CONCAT() function

The MySQL function is an aggregate function that concatenates strings from a group into a single string with various options.

The following shows the syntax of the function:

1
2
3
4
5

GROUP_CONCAT(

DISTINCTexpression

ORDER BYexpression

SEPARATORsep
);

The following example demonstrates how the function works.

1
2
3
4
5
6
7
8
9
10
11
12

CREATETABLEt(

vCHAR

);
 

INSERTINTOt(v)VALUES(‘A’),(‘B’),(‘C’),(‘B’);
 

SELECT

GROUP_CONCAT(DISTINCTv

ORDER BYvASC

SEPARATOR’;’)
FROM

t;

The  clause allows you to eliminate duplicate values in the group before concatenating them.

The  clause allows you to sort the values in ascending or descending order before concatenating. By default, it sorts the values in ascending order. If you want to sort the values in the descending order, you need to specify explicitly the option.

The specifies a literal value inserted between values in the group. If you do not specify a separator, the function uses a comma (,) as the default separator.

The function ignores values. It returns if there was no matching row found or all arguments are values.

The function returns a binary or non-binary string, which depends on the arguments. by default, the maximum length of the return string is 1024. In case you need more than this, you can extend the maximum length by setting the system variable at or level.

Memorize results

On every step of DOM building, we can memorize nodes and other data. Memorized
items are being put into dictionary. dictionary is initially
empty, but it is shared between different calls. You may want to reset
this dictionary manually like .

$C(document.body)
    .div()
        .mem('helloDiv')
        .text('hello')
    .end()
    .each()
        .span()
            .mem(function(item, index, arr) {
                return 'each' + index;
            }, function(item, index, arr) {
                return index + ' ' + item + ' ' + this.tagName.toLowerCase();
            })
        .end()
    .end()
.end();

In this example will be:

Another example (with resetting):

$C.mem = {aa 123, bb 234};

$C(document.body)
    .div()
        .mem('aa')
        .text('hello')
    .end()
.end();

And will be:

CONCAT_WS() function

MySQL CONCAT_WS() function is used to join two or more strings with a separator. The separator specified in the first argument is added between two strings. The separator itself can be a string. If the separator is NULL the result is NULL.

Syntax:

CONCAT_WS (separator, string1, string2,…)

Arguments

Name Description
separator Specifies a separator added between the strings while joining.
string1 First string to be joined.
string2 Second string to be joined. Up to N number of strings can be specified in this way.

Syntax Diagram:

MySQL Version: 5.6

Video Presentation

Your browser does not support HTML5 video.

Pictorial Presentation

Example of MySQL CONCAT_WS() function

The following MySQL statement adds the first argument and second argument with a separator «, «.

Code:

Sample Output:

mysql> SELECT CONCAT_WS(',','1st string','2nd string');
+------------------------------------------+
| CONCAT_WS(',','1st string','2nd string') |
+------------------------------------------+
| 1st string,2nd string                    | 
+------------------------------------------+
1 row in set (0.00 sec)

Example of MySQL CONCAT-WS() function with where clause

The following MySQL statement adds arguments (i.e. aut_id, aut_name, country and home_city) with a separator «,», if country of the author is not USA.

Code:

Sample table: author

Sample Output:

mysql> SELECT CONCAT_WS(',',aut_id,aut_name,country,home_city) 
    -> FROM author 
    -> WHERE country'USA';
+--------------------------------------------------+
| CONCAT_WS(',',aut_id,aut_name,country,home_city) |
+--------------------------------------------------+
| AUT001,William Norton,UK,Cambridge               | 
| AUT002,William Maugham,Canada,Toronto            | 
| AUT003,William Anthony,UK,Leeds                  | 
| AUT004,S.B.Swaminathan,India,Bangalore           | 
| AUT005,Thomas Morgan,Germany,Arnsberg            | 
| AUT007,Piers Gibson,UK,London                    | 
| AUT009,Marquis de Ellis,Brazil,Rio De Janerio    | 
| AUT011,John Betjeman Hunter,Australia,Sydney     | 
| AUT012,Evan Hayek,Canada,Vancouver               | 
| AUT013,E. Howard,Australia,Adelaide              | 
| AUT014,C. J. Wilde,UK,London                     | 
+--------------------------------------------------+
11 rows in set (0.00 sec)

PHP script

JSP script

Difference between MySQL GROUP_CONCAT() and CONCAT_WS()

GROUP_CONCAT() function returns a string with concatenated non-NULL value from a group.
CONCAT_WS() function is used to add two or more strings with separator

See the following example:

mysql> SELECT userid, fname, lname  FROM user_details;
+----------+--------+---------+
| userid   | fname  | lname   |
+----------+--------+---------+
| scott123 | Scott  | Rayy    |
| ferp6734 | Palash | Ghosh   |
| diana094 | Diana  | Lorentz |
| abcd123  | John   | ray     |
+----------+--------+---------+
4 rows in set (0.00 sec)
mysql> SELECT GROUP_CONCAT(CONCAT_WS(' ', fname,lname)) FROM user_details ORDER BY userid ASC;
+------------------------------------------------+
| GROUP_CONCAT(CONCAT_WS(' ', fname,lname))      |
+------------------------------------------------+
| Scott Rayy,Palash Ghosh,Diana Lorentz,John ray |
+------------------------------------------------+
1 row in set (0.03 sec)

Here CONCAT_WS() insert a space as a separator between fname and lname while GROUP_CONCAT() returns the result in a single string.

All String Functions

SQL References

SQL Keywords
ADD
ADD CONSTRAINT
ALTER
ALTER COLUMN
ALTER TABLE
ALL
AND
ANY
AS
ASC
BACKUP DATABASE
BETWEEN
CASE
CHECK
COLUMN
CONSTRAINT
CREATE
CREATE DATABASE
CREATE INDEX
CREATE OR REPLACE VIEW
CREATE TABLE
CREATE PROCEDURE
CREATE UNIQUE INDEX
CREATE VIEW
DATABASE
DEFAULT
DELETE
DESC
DISTINCT
DROP
DROP COLUMN
DROP CONSTRAINT
DROP DATABASE
DROP DEFAULT
DROP INDEX
DROP TABLE
DROP VIEW
EXEC
EXISTS
FOREIGN KEY
FROM
FULL OUTER JOIN
GROUP BY
HAVING
IN
INDEX
INNER JOIN
INSERT INTO
INSERT INTO SELECT
IS NULL
IS NOT NULL
JOIN
LEFT JOIN
LIKE
LIMIT
NOT
NOT NULL
OR
ORDER BY
OUTER JOIN
PRIMARY KEY
PROCEDURE
RIGHT JOIN
ROWNUM
SELECT
SELECT DISTINCT
SELECT INTO
SELECT TOP
SET
TABLE
TOP
TRUNCATE TABLE
UNION
UNION ALL
UNIQUE
UPDATE
VALUES
VIEW
WHERE

MySQL Functions
String Functions
ASCII
CHAR_LENGTH
CHARACTER_LENGTH
CONCAT
CONCAT_WS
FIELD
FIND_IN_SET
FORMAT
INSERT
INSTR
LCASE
LEFT
LENGTH
LOCATE
LOWER
LPAD
LTRIM
MID
POSITION
REPEAT
REPLACE
REVERSE
RIGHT
RPAD
RTRIM
SPACE
STRCMP
SUBSTR
SUBSTRING
SUBSTRING_INDEX
TRIM
UCASE
UPPER

Numeric Functions
ABS
ACOS
ASIN
ATAN
ATAN2
AVG
CEIL
CEILING
COS
COT
COUNT
DEGREES
DIV
EXP
FLOOR
GREATEST
LEAST
LN
LOG
LOG10
LOG2
MAX
MIN
MOD
PI
POW
POWER
RADIANS
RAND
ROUND
SIGN
SIN
SQRT
SUM
TAN
TRUNCATE

Date Functions
ADDDATE
ADDTIME
CURDATE
CURRENT_DATE
CURRENT_TIME
CURRENT_TIMESTAMP
CURTIME
DATE
DATEDIFF
DATE_ADD
DATE_FORMAT
DATE_SUB
DAY
DAYNAME
DAYOFMONTH
DAYOFWEEK
DAYOFYEAR
EXTRACT
FROM_DAYS
HOUR
LAST_DAY
LOCALTIME
LOCALTIMESTAMP
MAKEDATE
MAKETIME
MICROSECOND
MINUTE
MONTH
MONTHNAME
NOW
PERIOD_ADD
PERIOD_DIFF
QUARTER
SECOND
SEC_TO_TIME
STR_TO_DATE
SUBDATE
SUBTIME
SYSDATE
TIME
TIME_FORMAT
TIME_TO_SEC
TIMEDIFF
TIMESTAMP
TO_DAYS
WEEK
WEEKDAY
WEEKOFYEAR
YEAR
YEARWEEK

Advanced Functions
BIN
BINARY
CASE
CAST
COALESCE
CONNECTION_ID
CONV
CONVERT
CURRENT_USER
DATABASE
IF
IFNULL
ISNULL
LAST_INSERT_ID
NULLIF
SESSION_USER
SYSTEM_USER
USER
VERSION

SQL Server Functions
String Functions
ASCII
CHAR
CHARINDEX
CONCAT
Concat with +
CONCAT_WS
DATALENGTH
DIFFERENCE
FORMAT
LEFT
LEN
LOWER
LTRIM
NCHAR
PATINDEX
QUOTENAME
REPLACE
REPLICATE
REVERSE
RIGHT
RTRIM
SOUNDEX
SPACE
STR
STUFF
SUBSTRING
TRANSLATE
TRIM
UNICODE
UPPER

Numeric Functions
ABS
ACOS
ASIN
ATAN
ATN2
AVG
CEILING
COUNT
COS
COT
DEGREES
EXP
FLOOR
LOG
LOG10
MAX
MIN
PI
POWER
RADIANS
RAND
ROUND
SIGN
SIN
SQRT
SQUARE
SUM
TAN

Date Functions
CURRENT_TIMESTAMP
DATEADD
DATEDIFF
DATEFROMPARTS
DATENAME
DATEPART
DAY
GETDATE
GETUTCDATE
ISDATE
MONTH
SYSDATETIME
YEAR

Advanced Functions
CAST
COALESCE
CONVERT
CURRENT_USER
IIF
ISNULL
ISNUMERIC
NULLIF
SESSION_USER
SESSIONPROPERTY
SYSTEM_USER
USER_NAME

MS Access Functions
String Functions
Asc
Chr
Concat with &
CurDir
Format
InStr
InstrRev
LCase
Left
Len
LTrim
Mid
Replace
Right
RTrim
Space
Split
Str
StrComp
StrConv
StrReverse
Trim
UCase

Numeric Functions
Abs
Atn
Avg
Cos
Count
Exp
Fix
Format
Int
Max
Min
Randomize
Rnd
Round
Sgn
Sqr
Sum
Val

Date Functions
Date
DateAdd
DateDiff
DatePart
DateSerial
DateValue
Day
Format
Hour
Minute
Month
MonthName
Now
Second
Time
TimeSerial
TimeValue
Weekday
WeekdayName
Year

Other Functions
CurrentUser
Environ
IsDate
IsNull
IsNumeric

SQL OperatorsSQL Data TypesSQL Quick Ref

Distinct Results

MySQL – GROUP_CONCAT()

MySQL’s supports the clause, which allows you to eliminate duplicate values from the result set.

USE Solutions;
SELECT GROUP_CONCAT(DISTINCT TaskName) 
FROM Tasks;

Result:

+--------------------------------------------------------+
| GROUP_CONCAT(DISTINCT TaskName)                        |
+--------------------------------------------------------+
| Do garden,Feed cats,Paint roof,Relax,Take dog for walk |
+--------------------------------------------------------+

T-SQL – STRING_AGG()

T-SQL’s function doesn’t support the clause.

USE Solutions;
SELECT STRING_AGG(DISTINCT TaskName, ',') 
FROM Tasks;

Result:

Error: Incorrect syntax near ','.

As expected, an error occurs if we try to use the clause with .

Introduction to MySQL aggregate functions

An aggregate function performs a calculation on multiple values and returns a single value.

For example, you can use the aggregate function that takes multiple numbers and returns the average value of the numbers.

The following illustrates the syntax of an aggregate function:

1 function_name(DISTINCT|ALLexpression)

In this syntax:

  • First, specify the name of the aggregate function e.g., . See the list of aggregate functions in the following section.
  • Second, use if you want to calculate based on distinct values or in case you want to calculate all values including duplicates. The default is .
  • Third, specify an expression that can be a column or expression which involves column and arithmetic operators.

The aggregate functions are often used with the clause to calculate an aggregate value for each group e.g., the average value by the group or the sum of values in each group.

The following picture illustrates the aggregate function is used in conjunction with a clause:

MySQL supports the following aggregate functions:

Aggregate function Description
AVG() Return the average of non-NULL values.
BIT_AND() Return bitwise AND.
BIT_OR() Return bitwise OR.
BIT_XOR() Return bitwise XOR.
COUNT() Return the number of rows in a group, including rows with NULL values.
GROUP_CONCAT() Return a concatenated string.
JSON_ARRAYAGG() Return result set as a single JSON array.
JSON_OBJECTAGG() Return result set as a single JSON object.
MAX() Return the highest value (maximum) in a set of non-NULL values.
MIN() Return the lowest value (minimum) in a set of non-NULL values.
STDEV() Return the population standard deviation.
STDDEV_POP() Return the population standard deviation.
STDDEV_SAMP() Return the sample standard deviation.
SUM() Return the summation of all non-NULL values a set.
VAR_POP() Return the population standard variance.
VARP_SAM() Return the sample variance.
VARIANCE() Return the population standard variance.

MySQL GROUP_CONCAT() function examples

Let’s take a look at the table in the sample database.

To get all countries where customers locate as a comma-separated string, you use the function as follows:

1
2
3
4

SELECT

GROUP_CONCAT(country)
FROM

customers;

However, some customers located in the same country. To remove the duplicate country’s names, you add the clause as the following query:

1
2
3
4

SELECT

GROUP_CONCAT(DISTINCTcountry)
FROM

customers;

It is more readable if the country’s names are in ascending order. To sort the country’s name before concatenating, you use the clause as follows:

1
2
3
4
5

SELECT

GROUP_CONCAT(DISTINCTcountry

ORDER BYcountry)
FROM

customers;

To change the default separator of the returned string from a comma (,) to a semi-colon (;), you use the clause as the following query:

1
2
3
4
5
6

SELECT

GROUP_CONCAT(DISTINCTcountry

ORDER BYcountry

SEPARATOR’;’)
FROM

customers;

Great! now you know how the function works. Let’s put it in a practical example.

Each customer has one or more sale representatives. In other words, each sales employee is in charge of one or more customers. To find out who in charge of which customers, you use the inner join clause as follows:

1
2
3
4
5
6
7
8
9
10
11
12

SELECT

employeeNumber,

firstname,

lastname,

customername
FROM

employees

INNER JOIN

customersONcustomers.salesRepEmployeeNumber=employees.employeeNumber

ORDER BY

firstname,

lastname;

Now, we can group the result set by the employee number and concatenate all employees that are being in charge of the employee by using the function as follows:

1
2
3
4
5
6
7
8
9
10
11
12

SELECT

employeeNumber,

firstName,

lastName,

GROUP_CONCAT(DISTINCTcustomername

ORDER BYcustomerName)
FROM

employees

INNER JOIN

customersONcustomers.salesRepEmployeeNumber=employeeNumber

GROUPBYemployeeNumber

ORDER BYfirstName,lastname;

The result set is much easier to read.

Using MySQL with function example

Sometimes, the function can be combined with the CONCAT_WS function to make a result of query more useful.

For example, to make a list of semicolon-separated values of customers:

  • First, you concatenate the last name and first name of each customer’s contact using the function. The result is the contact’s full name.
  • Then, you use the function to make the list.

The following query makes a list of semicolon-separated values of customers.

1
2
3
4
5
6

SELECT

GROUP_CONCAT(

CONCAT_WS(‘, ‘,contactLastName,contactFirstName)

SEPARATOR’;’)
FROM

customers;

Note that function concatenates string values in different rows while the or function concatenates two or more string values in different columns.

MySQL CONCAT using JOINS and wildcard character

The following MySQL statement will show the combination of first name and last name and job title for those employees who contains the word Smith to their first and last name combination.

Code:

Sample table: employees

Sample table: jobs

Sample Output:

mysql> SELECT CONCAT( first_name,  ' ', last_name ) AS  "name", job_title
    -> FROM employees e, jobs j
    -> WHERE e.job_id = j.job_id
    -> AND CONCAT( first_name,  ' ', last_name ) LIKE  '%Smith%';
+---------------+----------------------+
| name          | job_title            |
+---------------+----------------------+
| Lindsey Smith | Sales Representative |
| William Smith | Sales Representative |
+---------------+----------------------+
2 rows in set (0.00 sec)

MySQL CONCAT: Example

Let us have an example PHP program uses query syntax with MySQL CONCAT(). For that, we have taken users table structured as,

After creating such table into our database, we need to access from PHP code shown below.

<?php $conn = mysqli_connect("localhost", "root", "test", "blog_samples") or die("Connection Error: " . mysqli_error($conn));

$userName = "joeltom";
$firstName = "Joel";
$lastName = "Thomas";
$rand = rand(1, 1000);

mysqli_query($conn, "INSERT INTO users (userName,password,firstName,lastName) VALUES (
	'" . $userName . "', 
	CONCAT('" . $userName . "','" . $rand . "'),
	'" . $firstName . "',
	'" . $lastName . "')");
$current_id = mysqli_insert_id($conn);
echo "Row Inserted:";
$result = mysqli_query($conn, "SELECT * FROM users where userId='" . $current_id . "'");
while ($row = mysqli_fetch_array($result)) {
    print "
";
    print_r($row);
    print "

«;
}

mysqli_query($conn, «UPDATE users SET userName=CONCAT(userName,firstName,lastName) where userId='» . $current_id . «‘»);
echo «Row Updated:«;
$result = mysqli_query($conn, «SELECT * FROM users where userId='» . $current_id . «‘»);
while ($row = mysqli_fetch_array($result)) {
print «

";
    print_r($row);
    print "

«;
}

$result = mysqli_query($conn, «SELECT CONCAT(firstName,lastName) as fullName FROM users where userId='» . $current_id . «‘»);
while ($row = mysqli_fetch_array($result)) {
print «

";
    print_r($row);
    print "

«;
}

$result = mysqli_query($conn, «SELECT CONCAT_WS(‘ ‘,firstName,lastName) as fullName FROM users where userId='» . $current_id . «‘»);
while ($row = mysqli_fetch_array($result)) {
print «

";
    print_r($row);
    print "

«;
}
?>

After executing this program, the query statement having CONCAT() function reflect expected to change with MySQL users table. And, we can see the effect of each query, by retrieving table content to be displayed to the browser using PHP print statement.

Экспериментальный статус сопрограмм сменился на стабильный

Из-за былого экспериментального статуса сопрограмм все связанные API были собраны в стандартной библиотеке как пакет . Дизайн стабилизирован и его экспериментальный статус снят, окончательный API перенесен в пакет , а экспериментальный пакет хранится в целях обеспечения обратной совместимости.

Важное замечание: мы рекомендовали авторам библиотек, начавшим использовать эксперементальные сопрограммы следовать той же конвенции: добавить к названию суффикс «экспериментальный» (например, ), указывающий, какой там используется сопрограммно совместимый API. Таким образом ваша библиотека сохранит бинарную совместимость

Сейчас, когда вышел финальный API-интерфейс, выполните следующие действия:

  • скопируйте все API в (без experimental суффикса);
  • сохраните экспериментальный вариант пакета для обратной совместимости.

Это позволит минимизировать проблемы миграции для пользователей.

Поддержка экспериментальной версии сопрограмм будет прекращена в Kotlin 1.4

MySQL CONCAT Function Details

CONVERT function concatenates 2 or more strings:

  SELECT CONCAT('AB', 'CD', 'EF');
  -- Result: ABCDEF

If Any Value is NULL, the Result is NULL

Take this into account when you concatenate string literals with column values that may contain NULL:

  SELECT CONCAT('AB', NULL, 'EF');
  -- Result: NULL

You can use IFNULL function to replace NULL values before concatenation:

  SELECT name, CONCAT('Price is ', IFNULL(price, 'N/A')) FROM prices;

Also CONCAT_WS function treats NULL as » (empty string), and allows using » as a separator:

  SELECT CONCAT_WS('', 'AB', NULL, 'CD');
  -- Result: ABCD

|| Operator to Concatenate Strings

Setting sql_mode to PIPES_AS_CONCAT or ANSI enables || to concatenate strings:

  -- By default, || is synonym to OR logical operator
  SELECT 'A' || 'B';
  -- Result: 0
 
  SET sql_mode = PIPES_AS_CONCAT;
 
  -- Now we can use || to concatenate strings
  SELECT 'A' || 'B' || 'C';
  -- Result: ABC
 
  -- If any value is NULL, the result is NULL
  SELECT 'A' || NULL || 'C';
  -- Result: NULL

MySQL CONCAT_WS function: Concatenate strings with a separator

MySQL provides a special form of the function: function. The function concatenates two or more string values with a predefined separator.

The following illustrates the syntax of the function:

1 CONCAT_WS(seperator,string1,string2,…);

The first argument is the separator for other arguments: string1, string2, …

The function adds the separator between string arguments and returns a single string with the separator inserted between string arguments.

The following statement concatenates two string values: John and Doe, and separates these two strings by a comma:

1 SELECTCONCAT_WS(‘,’,’John’,’Doe’);

The function returns if and only if the first argument, which is the separator, is . See the following example:

1 SELECTCONCAT_WS(NULL,’Jonathan’,’Smith’);

Unlike the function, the function skips values after the separator argument. In other words, it ignores NULL values.

1 SELECTCONCAT_WS(‘,’,’Jonathan’,’Smith’,NULL);

The following statement constructs complete addresses using the function:

1
2
3
4
5
6
7
8
9
10

SELECT

CONCAT_WS(CHAR(13),

CONCAT_WS(‘ ‘,contactLastname,contactFirstname),

addressLine1,

addressLine2,

CONCAT_WS(‘ ‘,postalCode,city),

country,

CONCAT_WS(CHAR(13),»))ASCustomer_Address
FROM

customers;

Here is the output result:

1
2
3
4
5
6
7
8
9
10
11
12
13

Customer_Address

—————————————————
SchmittCarine

54,rueRoyale

44000Nantes

France

 
KingJean

8489StrongSt.

83030LasVegas

USA
 

In this tutorial, you have learned how to use MySQL and functions to concatenate one or more string value into a single string.

Стандартные API

Сопрограммы представлены в трёх их главных ингредиентах:

  • языковая поддержка (функции остановки, как описывалось выше),
  • низкоуровневый базовый API в стандартной библиотеке Kotlin,
  • API высокого уровня, которые могут быть использованы непосредственно в пользовательском коде.

Низкий уровень API: kotlin.coroutines

Низкоуровневый API относительно мал и должен использоваться ТОЛЬКО для создания библиотек высокого уровня. Он содержит два главных пакета:

  • — главные типы и примитивы, такие как:
  • — встроенные функции еще более низкого уровня, такие как

Более детальная информация о использовании этих API может быть найдена здесь.

API генераторов в kotlin.coroutines

Это функции исключительно «уровня приложения» в :

Они перенесены в рамки , поскольку они относятся к последовательностям. По сути, эти функции (и мы можем ограничиться здесь рассмотрением только ) реализуют генераторы, т. е. предоставляют лёгкую возможность построить ленивые последовательности:

Это сгенерирует ленивую, потенциально бесконечную последовательность Фибоначчи, используя сопрограмму, которая дает последовательные числа Фибоначчи, вызывая функцию yield (). При итерировании такой последовательности на каждом шаге итератор выполняет следующую часть сопрограммы, которая генерирует следующее число. Таким образом, мы можем взять любой конечный список чисел из этой последовательности, например , дающий в результате . И сопрограммы достаточно дёшевы, чтобы сделать это практичным.

Чтобы продемонстрировать реальную ленивость такой последовательности, давайте напечатаем некоторые отладочные результаты изнутри вызова sequence():

Запустите приведенный выше код, чтобы убедиться, что если мы будем печатать первые три элемента, цифры чередуются со -ами по ветвям цикла. Это означает, что вычисления действительно ленивые. Для печати мы выполняем только до первого и печатаем по ходу дела. Затем, для печати , нам необходимо переходить к следующему , и здесь печатать . То же самое и для . И следующий никогда не будет напечатан (точно так же как и ), поскольку мы никогда не запрашиваем дополнительных элементов последовательности.

Чтобы сразу породить всю коллекцию (или последовательность) значений, доступна функция :

Функция во всём подобна sequence(), но только возвращает ленивый итератор.

Вы могли бы добавить собственную логику выполнения функции , написав приостанавливаемое расширение класса (что порождается аннотацией , как описывалось ):

Другие API высокого уровня: kotlinx.coroutines

Только базовые API, связанные с сопрограммами, доступны непосредственно из стандартной библиотеки Kotlin. Они преимущественно состоят из основных примитивов и интерфейсов, которые, вероятно, будут использоваться во всех библиотеках на основе сопрограмм.

Большинство API уровня приложений, основанные на сопрограммах, реализованы в отдельной библиотеке . Эта библиотека содержит в себе:

  • Платформенно-зависимое асинхронное программирование с помощью :
    • этот модуль включает Go-подобные каналы, которые поддерживают и другие удачные примитивы
    • исчерпывающее руководство по этой библиотеке доступно здесь.
  • API, основанные на из JDK 8:
  • Неблокирующий ввод-вывод (NIO), основанный на API из JDK 7 и выше:
  • Поддержка Swing () и JavaFx ()
  • Поддержка RxJava:

Эти библиотеки являются удобными API, которые делают основные задачи простыми. Также они содержат законченные примеры того, как создавать библиотеки, построенные на сопрограммах.

MySQL aggregate function examples

We will use the and tables from the sample database for demonstration:

MySQL aggregate function – function examples

The function calculates the average value of a set of values. It ignores NULL in the calculation.

1 AVG(expression)

For example, you can use the function to calculate the average buy price of all products in the table by using the following query:

1
2
3
4

SELECT

AVG(buyPrice)average_buy_price

FROM

products;

The following example uses the function to calculate the average buy price for each product line:

1
2
3
4
5
6
7

SELECT

productLine,

AVG(buyPrice)
FROM

products

GROUPBYproductLine

ORDER BYproductLine;

MySQL aggregate function –  function examples

The function returns the number of the value in a set.

For example, you can use the function to get the number of products in the table as shown in the following query:

1
2
3
4

SELECT

    COUNT(*)AStotal

FROM

products;

The following statement uses the function with the clause to get the number of products for each product line:

1
2
3
4
5
6
7

SELECT

productLine,

COUNT(*)
FROM

products

GROUPBYproductLine

ORDER BYproductLine;

MySQL aggregate function –  function examples

The function returns the sum of values in a set. The function ignores . If no matching row found, the function returns NULL.

To get the total order value of each product, you can use the function in conjunction with the clause as follows:

1
2
3
4
5
6
7

SELECT

productCode,

SUM(priceEach*quantityOrdered)total
FROM

orderDetails

GROUPBYproductCode

ORDER BYtotalDESC;

To see the result in more detail, you can join the table to the table as shown in the following query:

1
2
3
4
5
6
7
8
9
10

SELECT

productCode,

productName,

SUM(priceEach*quantityOrdered)total
FROM

orderDetails

INNER JOIN

productsUSING(productCode)

GROUPBYproductCode

ORDER BYtotal;

MySQL aggregate function –  function examples

The function returns the maximum value in a set.

1 MAX(expression)

For example, you can use the function to get the highest buy price from the table as shown in the following query:

1
2
3
4

SELECT

MAX(buyPrice)highest_price

FROM

products;

The following statement uses the function with the clause to get the highest price per product line:

1
2
3
4
5
6

SELECT

productLine,MAX(buyPrice)
FROM

products

GROUPBYproductLine

ORDER BYMAX(buyPrice)DESC;

MySQL aggregate function –  function examples

The function returns the minimum value in a set of values.

1 MIN(expression)

For example, the following query uses the function to find the lowest price from the table:

1
2
3
4

SELECT

MIN(buyPrice)lowest_price

FROM

products;

The following example uses the function with the clause to get the lowest price per product line:

1
2
3
4
5
6
7

SELECT

productLine,

MIN(buyPrice)
FROM

products

GROUPBYproductLine

ORDER BYMIN(buyPrice);

MySQL aggregate function –  function example

The concatenates a set of strings and returns the concatenated string. See the following and tables:

The following statement uses the function to return the sales staffs and list of customers that each sales staff is in charge of:

1
2
3
4
5
6
7
8
9
10
11
12

SELECT

firstName,

lastName,

GROUP_CONCAT(

DISTINCTcustomername

ORDER BYcustomerName)customers
FROM

employees

INNER JOINcustomers

ONcustomers.salesRepEmployeeNumber=employeeNumber

GROUPBYemployeeNumber

ORDER BYfirstName,lastname;

In this tutorial, you have learned how to use the most commonly used MySQL aggregate functions.

  • Was this tutorial helpful?

Блокирование против приостановки

Главным отличительным признаком сопрограмм является то, что они являются вычислениями, которые могут быть приостановлены без блокирования потока (вытеснения средствами операционной системы)

Блокирование потоков часто является весьма дорогостоящим, особенно при интенсивных нагрузках: только относительно небольшое число потоков из общего числа является активно выполняющимися, поэтому блокировка одного из них ведет к затягиванию какой-нибудь важной части итоговой работы

С другой стороны, приостановка сопрограммы обходится практически бесплатно. Не требуется переключения контекста (потоков) или иного вовлечения механизмов операционной системы. И сверх этого, приостановка может гибко контролироваться пользовательской библиотекой во многих аспектах: в качестве авторов библиотеки мы можем решать, что происходит при приостановке, и оптимизировать, журналировать или перехватывать в соответствии со своими потребностями.

Еще одно отличие заключается в том, что сопрограммы не могут быть приостановлены на произвольной инструкции, а только в так называемых точках остановки (приостановки), которые вызываются в специально маркируемых функциях.

MySQL CONCAT function

The MySQL function takes one or more string arguments and concatenates them into a single string. The function requires a minimum of one parameter otherwise it raises an error.

The following illustrates the syntax of the function.

1 CONCAT(string1,string2,…);

The function converts all arguments to the string type before concatenating. If any argument is , the function returns a value.

The following statement concatenates two quoted strings: and .

1 SELECTCONCAT(‘MySQL’,’CONCAT’);

If you add a value, the function returns a value as follows:

1 SELECTCONCAT(‘MySQL’,NULL,’CONCAT’);

See the following table in the sample database.

To get the full names of contacts, you use the function to concatenate first name, space, last name as the following statement:

1
2
3
4

SELECT

concat(contactFirstName,’ ‘,contactLastName)Fullname
FROM

customers;

Ссылка на основную публикацию