github.com/matrixorigin/matrixone@v1.2.0/test/distributed/cases/dml/select/order_by_with_nulls.sql (about)

     1  -- @suit
     2  
     3  -- @case
     4  -- @desc:test filter key ORDER BY
     5  -- @label:bvt
     6  
     7  -- No INDEX explicitly
     8  -- different data type
     9  DROP TABLE IF EXISTS t1;
    10  CREATE TABLE t1 (
    11  	id INT AUTO_INCREMENT,
    12  	name VARCHAR(255),
    13  	category_id INT,
    14  	d TIMESTAMP,
    15  	PRIMARY KEY (id)
    16  );
    17  INSERT INTO t1 (id, name, category_id, d) VALUES
    18  (1, 'aaa', 1, '2010-06-10 19:14:37'),
    19  (2, 'bbb', 2, '2010-06-10 19:14:55'),
    20  (3, 'ccc', 1, '2010-06-10 19:16:02'),
    21  (4, 'ddd', 1, '2010-06-10 19:16:15'),
    22  (5, 'eee', 2, '2010-06-10 19:16:35');
    23  -- MO default ASC
    24  SELECT * FROM t1 ORDER BY d;
    25  SELECT * FROM (SELECT * FROM t1 ORDER BY d DESC) temp ORDER BY d DESC;
    26  SELECT * FROM t1 WHERE category_id = 1 ORDER BY id;
    27  SELECT * FROM t1 WHERE category_id = 1 ORDER BY d;
    28  SELECT * FROM t1 WHERE category_id = 1 ORDER BY 1;
    29  SELECT * FROM t1 WHERE category_id = 1 ORDER BY 1+1;
    30  SELECT * FROM t1 WHERE category_id = 1 ORDER BY SIN(1);
    31  -- ???
    32  SELECT * FROM t1 WHERE category_id = 1 ORDER BY TRUE;
    33  
    34  -- CHAR and VARCHAR
    35  DROP TABLE IF EXISTS t1;
    36  CREATE TABLE t1 (
    37  	name VARCHAR(200),
    38  	area CHAR(200),
    39  	PRIMARY KEY (name)
    40  );
    41  INSERT INTO t1() VALUES
    42  ('a','b'),
    43  ('tewr','lojj'),
    44  ('The index may also be used even if the ORDER BY d', ' all unused portions of the index and all ex'),
    45  ('ssed by the query, the index is used', 'ex is more efficient than a table scan if c'),
    46  ('more expensive than scanning the table and', 'e optimizer probably does not use the index. If SELECT'),
    47  ('imilar to the same queries without DESC', 'homogeneity, but need not have the same actual direction.');
    48  
    49  -- Use Table Scan
    50  SELECT name FROM t1 ORDER BY name;
    51  SELECT name FROM t1 ORDER BY name,area;
    52  SELECT name FROM t1 ORDER BY area,name;
    53  SELECT * FROM t1 WHERE name = 'a' ORDER BY area;
    54  SELECT * FROM t1 WHERE LENGTH(name) > 10 ORDER BY name ASC;
    55  SELECT * FROM t1 WHERE LENGTH(name) < 10 ORDER BY name DESC;
    56  SELECT * FROM t1 WHERE LENGTH(name) > 10 ORDER BY LENGTH(area);
    57  SELECT name FROM t1 ORDER BY name ASC, area DESC;
    58  SELECT name FROM t1 ORDER BY name DESC, area ASC;
    59  DELETE FROM t1;
    60  INSERT INTO t1(name) VALUES('abkl'),('bfdjskl'),('cdjkl'),('djiofj'),('efjkl;'),('fjkldsa'),('gljfdka');
    61  SELECT * FROM t1 ORDER BY name DESC, name ASC;
    62  
    63  -- DATE, DATETIME, TIMESTAMP
    64  DROP TABLE IF EXISTS t1;
    65  CREATE TABLE t1 (
    66  	d1 DATE,
    67  	d2 DATETIME,
    68  	d3 TIMESTAMP
    69  );
    70  INSERT INTO t1() VALUES ('2020-08-08','2020-08-07 00:01:02','2020-08-07 00:01:02.136487');
    71  INSERT INTO t1() VALUES ('2021-09-09','2020-09-09 10:11:02','2020-09-09 10:11:02.136558');
    72  INSERT INTO t1() VALUES ('2021-07-07','2020-07-07 17:17:12','2020-07-07 07:07:05.135582');
    73  INSERT INTO t1() VALUES ('2021-06-06','2020-06-06 21:21:22','2020-06-06 02:21:22.135418');
    74  SELECT * FROM t1 ORDER BY d1 DESC;
    75  SELECT * FROM t1 ORDER BY d1 DESC, d2 ASC, d3 DESC;
    76  SELECT * FROM t1 ORDER BY d2 ASC, d1 ASC, d3 DESC;
    77  SELECT * FROM t1 WHERE d1 BETWEEN '2021-06-06' AND '2021-08-08' ORDER BY d1;
    78  
    79  -- TINYINT, INT, SMALLINT, BIGINT
    80  DROP TABLE IF EXISTS t1;
    81  CREATE TABLE t1(
    82      tiny TINYINT NOT NULL,
    83      small SMALLINT NOT NULL,
    84      int_test INT NOT NULL,
    85      big BIGINT NOT NULL
    86  );
    87  INSERT INTO t1() VALUES(1, 2, 3, 4),(100, 101, 102, 103),(NULL, NULL, NULL, 204),(64,1,4564,46843);
    88  SELECT * FROM t1 ORDER BY small DESC;
    89  SELECT * FROM t1 WHERE tiny < 100 ORDER BY big ASC;
    90  SELECT * FROM t1 ORDER BY tiny ASC, small DESC, int_test ASC, big DESC;
    91  
    92  -- FLOAT, DOUBLE, DECIMAL
    93  DROP TABLE IF EXISTS t1;
    94  CREATE TABLE t1(
    95      float_32 FLOAT,
    96      float_64 DOUBLE,
    97      d DECIMAL
    98  );
    99  INSERT INTO t1() VALUES(0.01, 0.02, 0.03), (0.000001,0.000002,0),(-1,-1.1,-1.2),(0.000003,0.000001,3);
   100  SELECT * FROM t1 ORDER BY float_32 ASC, float_64 DESC;
   101  SELECT * FROM t1 ORDER BY float_64 DESC;
   102  SELECT * FROM t1 ORDER BY d ASC;
   103  
   104  -- JOIN
   105  DROP TABLE IF EXISTS t1;
   106  DROP TABLE IF EXISTS t2;
   107  DROP TABLE IF EXISTS t3;
   108  CREATE TABLE t1(
   109      id INT NOT NULL,
   110      name CHAR(20) NOT NULL,
   111      PRIMARY KEY (id)
   112  );
   113  CREATE TABLE t2(
   114      id VARCHAR(10) NOT NULL,
   115      nation VARCHAR(20) NOT NULL,
   116      PRIMARY KEY(id)
   117  );
   118  CREATE TABLE t3(
   119      nation VARCHAR(20) NOT NULL,
   120      city CHAR(20) NOT NULL,
   121      GDP FLOAT NOT NULL,
   122      PRIMARY KEY(nation)
   123  );
   124  INSERT INTO t1() VALUES(1,'ronaldo'), (2,'kante'), (3,'noyer'),(4,'modrici');
   125  INSERT INTO t2() VALUES(1,'Poutanga'), (2,'NA'), (4,'Fenland');
   126  INSERT INTO t3() VALUES('Poutanga','liseber',520135), ('NA','bolando',62102), ('Fenland','yisdilne', 612094);
   127  SELECT * FROM t1 JOIN t2 ON t1.id = t2.id WHERE t1.id BETWEEN 1 AND 4+1 ORDER BY name;
   128  SELECT * FROM t1 JOIN t2 ON t1.id = t2.id ORDER BY t1.id;
   129  SELECT * FROM t1 JOIN t2 ON t1.id = t2.id JOIN t3 ON t2.nation = t3.nation ORDER BY t2.nation ASC, t3.GDP DESC;
   130  SELECT * FROM t1 LEFT JOIN t2 ON t1.id = t2.id RIGHT JOIN t3 ON t2.nation = t3.nation ORDER BY t2.nation ASC, t3.GDP DESC;
   131  SELECT * FROM t1 INNER JOIN t2 ON t1.id = t2.id RIGHT JOIN t3 ON t2.nation = t3.nation ORDER BY t2.nation DESC, t3.GDP DESC;
   132  
   133  -- UNION and UNION ALL
   134  DROP TABLE IF EXISTS t1;
   135  DROP TABLE IF EXISTS t2;
   136  CREATE TABLE t1(
   137      id INT NOT NULL,
   138      name CHAR(20) NOT NULL,
   139      sex CHAR(4) NOT NULL,
   140      PRIMARY KEY (id)
   141  );
   142  CREATE TABLE t2(
   143      id VARCHAR(10) NOT NULL,
   144      name VARCHAR(20) NOT NULL,
   145      nation VARCHAR(20) NOT NULL,
   146      PRIMARY KEY(id)
   147  );
   148  INSERT INTO t1() VALUES(1,'ronaldo','F'), (2,'kante','M'), (3,'noyer','F'),(4,'modrici','M');
   149  INSERT INTO t2() VALUES(1,'ronaldo','American'), (2,'kante','Franch'), (3,'noyer','Germany'),(4,'modrici','UK');
   150  SELECT * FROM t1 UNION ALL SELECT * FROM t2 ORDER BY name;
   151  (SELECT * FROM t1 UNION ALL SELECT * FROM t2) ORDER BY name DESC, id ASC;
   152  (SELECT * FROM t1) UNION (SELECT * FROM t2 ORDER BY nation) ORDER BY id DESC;
   153  (SELECT * FROM t1 ORDER BY sex) UNION (SELECT * FROM t2);
   154  (SELECT * FROM t1 WHERE sex = 'M' ORDER BY sex DESC)
   155  UNION
   156  (SELECT * FROM t2 WHERE id >= 3 ORDER BY nation ASC) ORDER BY id ASC;
   157  
   158  (SELECT * FROM t1 WHERE id BETWEEN 1 AND 2 ORDER BY name)
   159  UNION ALL
   160  (SELECT * FROM t2 WHERE nation BETWEEN 'A' AND 'F' ORDER BY id DESC);
   161  
   162  -- UNION and UNION ALL, Multi table great than 2
   163  DROP TABLE IF EXISTS t1;
   164  DROP TABLE IF EXISTS t2;
   165  DROP TABLE IF EXISTS t3;
   166  CREATE TABLE t1(
   167      id INT NOT NULL,
   168      name CHAR(20) NOT NULL,
   169      PRIMARY KEY (id)
   170  );
   171  CREATE TABLE t2(
   172      id VARCHAR(10) NOT NULL,
   173      nation VARCHAR(20) NOT NULL,
   174      PRIMARY KEY(id)
   175  );
   176  CREATE TABLE t3(
   177      id VARCHAR(10) NOT NULL,
   178      area VARCHAR(20) NOT NULL,
   179      PRIMARY KEY(id)
   180  );
   181  INSERT INTO t1() VALUES(1,'ronaldo'), (2,'kante'), (3,'noyer'),(4,'modrici');
   182  INSERT INTO t2() VALUES(1,'UK'), (2,'USA'), (3,'RA'),(4,'CN');
   183  INSERT INTO t3() VALUES(1,'EU'), (2,'NA'), (3,'AU'),(4,'AS');
   184  (SELECT * FROM t1) UNION (SELECT * FROM t2 ORDER BY id DESC) UNION ALL (SELECT * FROM t3 ORDER BY area);
   185  ((SELECT * FROM t1 ORDER BY id DESC) UNION (SELECT * FROM t2) UNION ALL (SELECT * FROM t3 ORDER BY area)) ORDER BY id;
   186  (SELECT * FROM t1 ORDER BY name) UNION (SELECT * FROM t2 ORDER BY id) UNION ALL (SELECT * FROM t3 ORDER BY area);
   187  -- Multi table JOIN(INNER, LEFT, RIGHT)
   188  (SELECT * FROM t1 JOIN t2 ON t1.id = t2.id ORDER BY t2.id)
   189  UNION
   190  (SELECT * FROM t2 RIGHT JOIN t3 ON t2.id = t3.id ORDER BY t3.id DESC);
   191  -- Joins between different tables
   192  (SELECT * FROM t1 LEFT JOIN t3 ON t1.id = t3.id ORDER BY t1.id DESC, t3.area ASC)
   193  UNION
   194  (SELECT * FROM t2 RIGHT JOIN t3 ON t2.id = t3.id ORDER BY t2.nation ASC, t3.id DESC);
   195  
   196  -- ORDER BY with GROUP BY
   197  DROP TABLE IF EXISTS t1;
   198  DROP TABLE IF EXISTS t2;
   199  CREATE TABLE t1(
   200      id INT NOT NULL,
   201      d1 CHAR(50) NOT NULL,
   202      salary FLOAT NOT NULL,
   203      PRIMARY KEY (id)
   204  );
   205  CREATE TABLE t2(
   206      id INT NOT NULL,
   207      name CHAR(50) NOT NULL,
   208      sex CHAR(4) NOT NULL,
   209      PRIMARY KEY (id)
   210  );
   211  INSERT INTO t1() VALUES(1,'2020-01-01',23.6), (2,'2020-01-01',89.6), (3,'2020-01-02',45.6);
   212  INSERT INTO t1() VALUES(4,'2020-01-01',66.6), (5,'2020-01-03',17.6), (6,'2020-01-03',123.6);
   213  INSERT INTO t2() VALUES(1,'jaca','F'), (2,'mecan','M'),(3,'right','F'),(4,'rodia','M');
   214  INSERT INTO t2() VALUES(5,'hila','F'), (6,'pika','M');
   215  SELECT DATE(d1), MAX(salary) FROM t1 GROUP BY d1 ORDER BY MAX(salary) DESC;
   216  SELECT DATE(d1), MAX(salary) FROM t1 GROUP BY d1 ORDER BY MAX(salary) ASC;
   217  SELECT DATE(d1), MAX(salary) FROM t1 JOIN t2 ON t1.id = t2.id GROUP BY d1 ORDER BY MAX(salary) DESC;
   218  
   219  -- NULL LAST/FIRST
   220  -- Single table
   221  DROP TABLE IF EXISTS t1;
   222  CREATE TABLE t1(
   223      id INT,
   224      name CHAR(20),
   225      PRIMARY KEY(id)
   226  );
   227  INSERT INTO t1() VALUES(1, 'jacak'), (2, 'tommy'), (3, 'rorgdbs'), (4, NULL);
   228  SELECT * FROM t1 ORDER BY name ASC;
   229  SELECT * FROM t1 ORDER BY name DESC, id ASC;
   230  SELECT * FROM t1 ORDER BY name ASC NULLS LAST;
   231  SELECT * FROM t1 ORDER BY name ASC NULLS FIRST;
   232  SELECT * FROM t1 ORDER BY name ASC NULLS FIRST LAST;
   233  
   234  DROP TABLE IF EXISTS t1;
   235  CREATE TABLE t1(
   236      id INT,
   237      name CHAR(20),
   238      salary FLOAT,
   239      dept INT,
   240      PRIMARY KEY(id)
   241  );
   242  INSERT INTO t1() VALUES(1,'bdkia',133.1,11), (2, 'dodro',983.6,NULL), (3, 'fafeaz',301.5,10), (4, NULL,NULL,13);
   243  SELECT * FROM t1 WHERE id > 1 ORDER BY id DESC, salary NULLS FIRST;
   244  SELECT * FROM t1 WHERE id BETWEEN 1 AND 4 ORDER BY id DESC, dept NULLS LAST, salary DESC NULLS FIRST;
   245  SELECT id,name FROM t1 ORDER BY salary DESC NULLS FIRST, dept DESC NULLS LAST, name ASC NULLS FIRST;
   246  
   247  -- JOIN -> ORDER BY...NULLS LAST/FIRST
   248  DROP TABLE IF EXISTS t1;
   249  DROP TABLE IF EXISTS t2;
   250  CREATE TABLE t1(
   251      id INT,
   252      name CHAR(20),
   253      PRIMARY KEY(id)
   254  );
   255  CREATE TABLE t2(
   256      id INT,
   257      nation CHAR(20),
   258      PRIMARY KEY(id)
   259  );
   260  INSERT INTO t1() VALUES(1, 'jacak'), (2, 'tommy'), (3, 'roses'), (4, NULL);
   261  INSERT INTO t2() VALUES(1, 'US'), (2, 'UK'), (3, NULL), (4, NULL), (5, NULL);
   262  SELECT * FROM t1 JOIN t2 ON t1.id = t2.id ORDER BY name DESC NULLS FIRST;
   263  SELECT * FROM t1 LEFT JOIN t2 ON t1.id = t2.id ORDER BY name ASC NULLS LAST;
   264  SELECT * FROM t1 RIGHT JOIN t2 ON t1.id = t2.id ORDER BY name ASC, nation DESC NULLS LAST;
   265  SELECT * FROM t1 INNER JOIN t2 ON t1.id = t2.id ORDER BY name DESC, nation ASC NULLS FIRST;
   266  
   267  -- NO primary key
   268  DROP TABLE IF EXISTS t1;
   269  DROP TABLE IF EXISTS t2;
   270  CREATE TABLE t1(
   271      id INT,
   272      sex CHAR(20)
   273  );
   274  CREATE TABLE t2(
   275      id INT,
   276      home CHAR(20)
   277  );
   278  INSERT INTO t1() VALUES(1, 'F'), (2, 'M'), (NULL, 'M'), (4, NULL), (NULL, NULL);
   279  INSERT INTO t2() VALUES(1, 'EU'), (2, 'UK'), (3, NULL), (4, NULL), (5, NULL), (NULL, NULL);
   280  SELECT * FROM t1 LEFT JOIN t2 ON t1.id = t2.id ORDER BY sex ASC NULLS LAST;
   281  SELECT * FROM t1 RIGHT JOIN t2 ON t1.id = t2.id ORDER BY home ASC NULLS FIRST;
   282  SELECT * FROM t1 INNER JOIN t2 ON t1.id = t2.id ORDER BY home ASC, sex DESC NULLS FIRST;