Warrior - 1 month ago 9

SQL Question

Please explain what is meant by tuples in sql?Thanks..

Answer Source

Most of the answers here are on the right track. However, a **row is not a tuple**. **Tuples**`*`

are *unordered* sets of known values with names. Thus, the following tuples are the same thing (I'm using an imaginary tuple syntax since a relational tuple is largely a theoretical construct):

```
(x=1, y=2, z=3)
(z=3, y=2, x=1)
(y=2, z=3, x=1)
```

...assuming of course that x, y, and z are all integers. Also note that there is no such thing as a "duplicate" tuple. Thus, not only are the above equal, they're the *same thing*. Lastly, tuples can only contain known values (thus, no nulls).

A **row**`**`

is an ordered set of known or unknown values with names (although they may be omitted). Therefore, the following comparisons return false in SQL:

```
(1, 2, 3) = (3, 2, 1)
(3, 1, 2) = (2, 1, 3)
```

Note that there are ways to "fake it" though. For example, consider this `INSERT`

statement:

```
INSERT INTO point VALUES (1, 2, 3)
```

Assuming that x is first, y is second, and z is third, this query may be rewritten like this:

```
INSERT INTO point (x, y, z) VALUES (1, 2, 3)
```

Or this:

```
INSERT INTO point (y, z, x) VALUES (2, 3, 1)
```

...but all we're really doing is changing the ordering rather than removing it.

And also note that there may be unknown values as well. Thus, you may have rows with unknown values:

```
(1, 2, NULL) = (1, 2, NULL)
```

...but note that this comparison will always yield `UNKNOWN`

. After all, how can you know whether two unknown values are equal?

And lastly, rows may be duplicated. In other words, `(1, 2)`

and `(1, 2)`

may compare to be equal, but that doesn't necessarily mean that they're the same thing.

If this is a subject that interests you, I'd highly recommend reading SQL and Relational Theory: How to Write Accurate SQL Code by CJ Date.

`*`

Note that I'm talking about tuples as they exist in the relational model, which is a bit different from mathematics in general.

`**`

And just in case you're wondering, just about everything in SQL is a row or table. Therefore, `(1, 2)`

is a row, while `VALUES (1, 2)`

is a table (with one row).

**UPDATE**: I've expanded a little bit on this answer in a blog post here.