Sie sind auf Seite 1von 105

Databases

Contents
1

Database

1.1

Terminology and overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1.2

Applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1.3

General-purpose and special-purpose DBMSs . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1.4

History . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1.4.1

1960s, navigational DBMS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1.4.2

1970s, relational DBMS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1.4.3

Integrated approach . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1.4.4

Late 1970s, SQL DBMS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1.4.5

1980s, on the desktop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1.4.6

1980s, object-oriented . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1.4.7

2000s, NoSQL and NewSQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1.5

Research . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1.6

Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1.7

Design and modeling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1.7.1

Models . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1.7.2

External, conceptual, and internal views . . . . . . . . . . . . . . . . . . . . . . . . . . .

10

1.8

Languages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

11

1.9

Performance, security, and availability . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

11

1.9.1

Storage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

12

1.9.2

Security . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

12

1.9.3

Transactions and concurrency . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

13

1.9.4

Migration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

13

1.9.5

Building, maintaining, and tuning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

13

1.9.6

Backup and restore . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

14

1.9.7

Other . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

14

1.10 See also . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

14

1.11 References . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

15

1.12 Further reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

16

1.13 External links . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

16

Relational database management system

20

2.1

21

Market share . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
i

ii

CONTENTS
2.2

History . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

21

2.3

Historical usage of the term . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

21

2.4

See also . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

22

2.5

References . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

22

MySQL

23

3.1

Interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

23

3.1.1

Graphical . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

23

3.1.2

Command line . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

25

3.1.3

Programming . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

25

Features . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

25

3.2.1

Limitations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

26

3.2.2

Deployment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

27

3.2.3

Backup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

27

3.2.4

High availability . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

28

3.2.5

Cloud deployment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

28

Community . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

28

3.3.1

Related projects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

29

History . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

29

3.4.1

Legal and acquisition impacts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

29

3.4.2

Milestones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

30

3.4.3

Versions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

31

3.5

See also . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

31

3.6

Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

31

3.7

References . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

31

3.8

External links . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

35

3.2

3.3
3.4

SQLite

36

4.1

Design

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

36

4.2

History

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

36

4.3

Features . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

37

4.4

Development and distribution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

37

4.5

Adoption

37

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

4.5.1

Programming languages

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

37

4.5.2

Middleware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

38

4.5.3

Web browsers

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

39

4.5.4

Web application frameworks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

39

4.5.5

Various . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

39

4.5.6

Operating systems

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

39

4.6

Ports

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

40

4.7

See also . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

40

4.8

Citations

40

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

CONTENTS
4.9

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

41

4.10 External links . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

41

PostgreSQL

42

5.1

Name . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

42

5.2

History

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

42

5.3

Multiversion concurrency control (MVCC) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

43

5.4

Storage and replication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

43

5.4.1

Replication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

43

5.4.2

Indexes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

44

5.4.3

Schemas

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

44

5.4.4

Data types

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

45

5.4.5

User-dened objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

46

5.4.6

Inheritance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

46

5.4.7

Other storage features

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

46

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

46

5.5

iii

References

Control and connectivity


5.5.1

Foreign data wrappers

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

46

5.5.2

Interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

47

5.5.3

Procedural languages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

47

5.5.4

Triggers

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

48

5.5.5

Asynchronous notications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

48

5.5.6

Rules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

48

5.5.7

Other querying features

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

48

5.6

Security . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

49

5.7

Upcoming features . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

49

5.8

Add-ons . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

50

5.9

Benchmarks and performance

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

50

5.10 Platforms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

51

5.11 Database administration

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

51

5.12 Prominent users . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

52

5.13 Proprietary derivatives and support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

53

5.14 Release history . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

53

5.15 See also . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

53

5.16 References

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

54

5.17 Further reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

57

5.18 External links . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

57

SQL

58

6.1

History

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

58

6.2

Syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

58

6.2.1

Language elements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

58

6.2.2

Operators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

59

iv

CONTENTS
6.2.3

Queries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

59

6.2.4

Data manipulation

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

61

6.2.5

Transaction controls

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

62

6.2.6

Data denition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

62

6.2.7

Data types

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

63

6.2.8

Data control

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

64

6.3

Procedural extensions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

64

6.4

Criticism

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

64

6.5

Standardization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

65

6.6

Alternatives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

67

6.7

See also . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

67

6.8

Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

68

6.9

References

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

69

6.10 External links . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

70

NoSQL

71

7.1

History

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

71

7.2

Types of NoSQL databases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

71

7.3

Performance

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

72

7.4

Handling relational data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

72

7.4.1

Multiple queries

72

7.4.2

Caching/replication/non-normalized data

7.4.3

Nesting data

. . . . . . . . . . . . . . . . . . . . . . . . . .

72

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

72

Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

72

7.5.1

Document store . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

72

7.5.2

Graph . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

73

7.5.3

Key-value stores

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

73

7.5.4

Object database

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

75

7.5.5

Tabular . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

75

7.5.6

Tuple store . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

75

7.5.7

Triple/quad store (RDF) database

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

76

7.5.8

Hosted . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

76

7.5.9

Multivalue databases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

76

7.5.10 Multimodel database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

76

7.5.11 Correlation database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

76

7.5.12 Cell database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

76

7.6

See also . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

77

7.7

References

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

77

7.8

Further reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

78

7.9

External links . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

78

7.5

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

NewSQL

79

CONTENTS

8.1

History

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

79

8.2

Systems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

79

8.2.1

New architectures

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

79

8.2.2

SQL Engines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

80

8.2.3

Transparent sharding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

80

8.3

See also . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

80

8.4

References

80

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

XML database

81

9.1

Rationale for XML in databases

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

81

9.2

XML Enabled databases

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

81

Example of XML Type Query in IBM DB2 SQL . . . . . . . . . . . . . . . . . . . . . .

82

Native XML databases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

82

9.3.1

Language features

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

83

9.3.2

Supported APIs

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

83

9.2.1
9.3

9.4

References

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

83

9.5

External links . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

83

10 Data denition language

84

10.1 History . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

84

10.2 SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

84

10.2.1 CREATE statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

84

10.2.2 DROP statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

85

10.2.3 ALTER statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

85

10.2.4 rename statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

85

10.2.5 Referential integrity statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

85

10.3 Other languages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

86

10.4 See also . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

86

10.5 References

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

86

10.6 External links . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

86

11 Data manipulation language

87

11.1 See also . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

88

11.2 References

88

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

12 Query language

89

12.1 Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

89

12.2 Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

89

12.3 See also . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

90

12.4 References

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

90

12.5 Text and image sources, contributors, and licenses . . . . . . . . . . . . . . . . . . . . . . . . . .

91

12.5.1 Text . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

91

12.5.2 Images . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

96

vi

CONTENTS
12.5.3 Content license . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

98

Chapter 1

Database
A database is an organized collection of data.[1] The data is typically organized to model aspects of reality in a way
that supports processes requiring information. For example, modelling the availability of rooms in hotels in a way
that supports nding a hotel with vacancies.
Database management systems (DBMS) are computer software applications that interact with the user, other
applications, and the database itself to capture and analyze data. A general-purpose DBMS is designed to allow
the denition, creation, querying, update, and administration of databases. Well-known DBMSs include MySQL,
PostgreSQL, Microsoft SQL Server, Oracle, Sybase and IBM DB2. A database is not generally portable across
dierent DBMSs, but dierent DBMS can interoperate by using standards such as SQL and ODBC or JDBC to allow
a single application to work with more than one DBMS. Database management systems are often classied according
to the database model that they support; the most popular database systems since the 1980s have all supported the
relational model as represented by the SQL language. Sometimes a DBMS is loosely referred to as a 'database'.

1.1 Terminology and overview


Formally, a database refers to a set of related data and the way it is organized. Access to this data is usually provided
by a database management system (DBMS) consisting of an integrated set of computer software that allows users
to interact with one or more databases and provides access to all of the data contained in the database (although
restrictions may exist that limit access to particular data). The DBMS provides various functions that allow entry,
storage and retrieval of large quantities of information as well as provides ways to manage how that information is
organized.
Because of the close relationship between them, the term database is often used casually to refer to both a database
and the DBMS used to manipulate it.
Outside the world of professional information technology, the term database is often used to refer to any collection
of related data (such as a spreadsheet or a card index). This article is concerned only with databases where the size
and usage requirements necessitate use of a database management system.[2]
Existing DBMSs provide various functions that allow management of a database and its data which can be classied
into four main functional groups:
Data denition Creation, modication and removal of denitions that dene the organization of the data.
Update Insertion, modication, and deletion of the actual data.[3]
Retrieval Providing information in a form directly usable or for further processing by other applications.
The retrieved data may be made available in a form basically the same as it is stored in the database or in a
new form obtained by altering or combining existing data from the database.[4]
Administration Registering and monitoring users, enforcing data security, monitoring performance, maintaining data integrity, dealing with concurrency control, and recovering information that has been corrupted
by some event such as an unexpected system failure.[5]
1

CHAPTER 1. DATABASE

Both a database and its DBMS conform to the principles of a particular database model.[6] Database system refers
collectively to the database model, database management system, and database.[7]
Physically, database servers are dedicated computers that hold the actual databases and run only the DBMS and related
software. Database servers are usually multiprocessor computers, with generous memory and RAID disk arrays used
for stable storage. RAID is used for recovery of data if any of the disks fail. Hardware database accelerators,
connected to one or more servers via a high-speed channel, are also used in large volume transaction processing
environments. DBMSs are found at the heart of most database applications. DBMSs may be built around a custom
multitasking kernel with built-in networking support, but modern DBMSs typically rely on a standard operating system
to provide these functions. Since DBMSs comprise a signicant economical market, computer and storage vendors
often take into account DBMS requirements in their own development plans.
Databases and DBMSs can be categorized according to the database model(s) that they support (such as relational or
XML), the type(s) of computer they run on (from a server cluster to a mobile phone), the query language(s) used to
access the database (such as SQL or XQuery), and their internal engineering, which aects performance, scalability,
resilience, and security

1.2 Applications
Databases are used to support internal operations of organizations and to underpin online interactions with customers
and suppliers (see Enterprise software).
Databases are used to hold administrative information and more specialized data, such as engineering data or economic models. Examples of database applications include computerized library systems, ight reservation systems
and computerized parts inventory systems.
Application areas of DBMS
1. Banking: For customer information, accounts, and loans, and banking transactions.
2. Airlines: For reservations and schedule information. Airlines were among the rst to use databases in a geographically distributed manner - terminals situated around the world accessed the central database system through phone
lines and other data networks.
3. Universities: For student information, course registrations, and grades.
4. Credit card transactions: For purchases on credit cards and generation of monthly statements.
5. Telecommunication: For keeping records of calls made, generating monthly bills, maintaining balances on prepaid
calling cards, and storing information about the communication networks.
6. Finance: For storing information about holdings, sales, and purchases of nancial instruments such as stocks and
bonds.
7. Sales: For customer, product, and purchase information.
8. Manufacturing: For management of supply chain and for tracking production of items in factories, inventories of
items in warehouses / stores, and orders for items.
9. Human resources: For information about employees, salaries, payroll taxes and benets, and for generation of
paychecks.

1.3 General-purpose and special-purpose DBMSs


A DBMS has evolved into a complex software system and its development typically requires thousands of personyears of development eort.[8] Some general-purpose DBMSs such as Adabas, Oracle and DB2 have been undergoing
upgrades since the 1970s. General-purpose DBMSs aim to meet the needs of as many applications as possible, which
adds to the complexity. However, the fact that their development cost can be spread over a large number of users
means that they are often the most cost-eective approach. However, a general-purpose DBMS is not always the
optimal solution: in some cases a general-purpose DBMS may introduce unnecessary overhead. Therefore, there are
many examples of systems that use special-purpose databases. A common example is an email system that performs
many of the functions of a general-purpose DBMS such as the insertion and deletion of messages composed of
various items of data or associating messages with a particular email address; but these functions are limited to what

1.4. HISTORY

is required to handle email and don't provide the user with the all of the functionality that would be available using a
general-purpose DBMS.
Many other databases have application software that accesses the database on behalf of end-users, without exposing
the DBMS interface directly. Application programmers may use a wire protocol directly, or more likely through an
application programming interface. Database designers and database administrators interact with the DBMS through
dedicated interfaces to build and maintain the applications databases, and thus need some more knowledge and
understanding about how DBMSs operate and the DBMSs external interfaces and tuning parameters.

1.4 History
Following the technology progress in the areas of processors, computer memory, computer storage and computer
networks, the sizes, capabilities, and performance of databases and their respective DBMSs have grown in orders of
magnitude. The development of database technology can be divided into three eras based on data model or structure:
navigational,[9] SQL/relational, and post-relational.
The two main early navigational data models were the hierarchical model, epitomized by IBMs IMS system, and the
CODASYL model (network model), implemented in a number of products such as IDMS.
The relational model, rst proposed in 1970 by Edgar F. Codd, departed from this tradition by insisting that applications should search for data by content, rather than by following links. The relational model employs sets of
ledger-style tables, each used for a dierent type of entity. Only in the mid-1980s did computing hardware become
powerful enough to allow the wide deployment of relational systems (DBMSs plus applications). By the early 1990s,
however, relational systems dominated in all large-scale data processing applications, and as of 2015 they remain
dominant : Oracle, mySQL and SQL server are the top DBMS.[10] The dominant database language, standardised
SQL for the relational model, has inuenced database languages for other data models.
Object databases were developed in the 1980s to overcome the inconvenience of object-relational impedance mismatch, which led to the coining of the term post-relational and also the development of hybrid object-relational
databases.
The next generation of post-relational databases in the late 2000s became known as NoSQL databases, introducing
fast key-value stores and document-oriented databases. A competing next generation known as NewSQL databases
attempted new implementations that retained the relational/SQL model while aiming to match the high performance
of NoSQL compared to commercially available relational DBMSs.

1.4.1

1960s, navigational DBMS

Further information: Navigational database


The introduction of the term database coincided with the availability of direct-access storage (disks and drums) from
the mid-1960s onwards. The term represented a contrast with the tape-based systems of the past, allowing shared
interactive use rather than daily batch processing. The Oxford English dictionary cites[11] a 1962 report by the System
Development Corporation of California as the rst to use the term data-base in a specic technical sense.
As computers grew in speed and capability, a number of general-purpose database systems emerged; by the mid-1960s
a number of such systems had come into commercial use. Interest in a standard began to grow, and Charles Bachman,
author of one such product, the Integrated Data Store (IDS), founded the Database Task Group within CODASYL,
the group responsible for the creation and standardization of COBOL. In 1971 the Database Task Group delivered
their standard, which generally became known as the CODASYL approach, and soon a number of commercial
products based on this approach entered the market.
The CODASYL approach relied on the manual navigation of a linked data set which was formed into a large
network. Applications could nd records by one of three methods:
1. Use of a primary key (known as a CALC key, typically implemented by hashing)
2. Navigating relationships (called sets) from one record to another
3. Scanning all the records in a sequential order

CHAPTER 1. DATABASE

Later systems added B-Trees to provide alternate access paths. Many CODASYL databases also added a very straightforward query language. However, in the nal tally, CODASYL was very complex and required signicant training
and eort to produce useful applications.
IBM also had their own DBMS in 1968, known as Information Management System (IMS). IMS was a development
of software written for the Apollo program on the System/360. IMS was generally similar in concept to CODASYL,
but used a strict hierarchy for its model of data navigation instead of CODASYLs network model. Both concepts
later became known as navigational databases due to the way data was accessed, and Bachmans 1973 Turing Award
presentation was The Programmer as Navigator. IMS is classied as a hierarchical database. IDMS and Cincom
Systems' TOTAL database are classied as network databases. IMS remains in use as of 2014.[12]

1.4.2

1970s, relational DBMS

Edgar Codd worked at IBM in San Jose, California, in one of their oshoot oces that was primarily involved in
the development of hard disk systems. He was unhappy with the navigational model of the CODASYL approach,
notably the lack of a search facility. In 1970, he wrote a number of papers that outlined a new approach to database
construction that eventually culminated in the groundbreaking A Relational Model of Data for Large Shared Data
Banks.[13]
In this paper, he described a new system for storing and working with large databases. Instead of records being stored
in some sort of linked list of free-form records as in CODASYL, Codds idea was to use a "table" of xed-length
records, with each table used for a dierent type of entity. A linked-list system would be very inecient when storing
sparse databases where some of the data for any one record could be left empty. The relational model solved this
by splitting the data into a series of normalized tables (or relations), with optional elements being moved out of the
main table to where they would take up room only if needed. Data may be freely inserted, deleted and edited in these
tables, with the DBMS doing whatever maintenance needed to present a table view to the application/user.
The relational model also allowed the content of the database to evolve without constant rewriting of links and pointers.
The relational part comes from entities referencing other entities in what is known as one-to-many relationship, like a
traditional hierarchical model, and many-to-many relationship, like a navigational (network) model. Thus, a relational
model can express both hierarchical and navigational models, as well as its native tabular model, allowing for pure or
combined modeling in terms of these three models, as the application requires.
For instance, a common use of a database system is to track information about users, their name, login information,
various addresses and phone numbers. In the navigational approach all of these data would be placed in a single
record, and unused items would simply not be placed in the database. In the relational approach, the data would be
normalized into a user table, an address table and a phone number table (for instance). Records would be created in
these optional tables only if the address or phone numbers were actually provided.
Linking the information back together is the key to this system. In the relational model, some bit of information
was used as a "key", uniquely dening a particular record. When information was being collected about a user,
information stored in the optional tables would be found by searching for this key. For instance, if the login name of
a user is unique, addresses and phone numbers for that user would be recorded with the login name as its key. This
simple re-linking of related data back into a single collection is something that traditional computer languages are
not designed for.
Just as the navigational approach would require programs to loop in order to collect records, the relational approach
would require loops to collect information about any one record. Codds solution to the necessary looping was a setoriented language, a suggestion that would later spawn the ubiquitous SQL. Using a branch of mathematics known
as tuple calculus, he demonstrated that such a system could support all the operations of normal databases (inserting,
updating etc.) as well as providing a simple system for nding and returning sets of data in a single operation.
Codds paper was picked up by two people at Berkeley, Eugene Wong and Michael Stonebraker. They started a
project known as INGRES using funding that had already been allocated for a geographical database project and
student programmers to produce code. Beginning in 1973, INGRES delivered its rst test products which were
generally ready for widespread use in 1979. INGRES was similar to System R in a number of ways, including the
use of a language for data access, known as QUEL. Over time, INGRES moved to the emerging SQL standard.
IBM itself did one test implementation of the relational model, PRTV, and a production one, Business System 12,
both now discontinued. Honeywell wrote MRDS for Multics, and now there are two new implementations: Alphora
Dataphor and Rel. Most other DBMS implementations usually called relational are actually SQL DBMSs.
In 1970, the University of Michigan began development of the MICRO Information Management System[14] based on

1.4. HISTORY

D.L. Childs Set-Theoretic Data model.[15][16][17] Micro was used to manage very large data sets by the US Department
of Labor, the U.S. Environmental Protection Agency, and researchers from the University of Alberta, the University of
Michigan, and Wayne State University. It ran on IBM mainframe computers using the Michigan Terminal System.[18]
The system remained in production until 1998.

1.4.3

Integrated approach

Main article: Database machine


In the 1970s and 1980s attempts were made to build database systems with integrated hardware and software. The
underlying philosophy was that such integration would provide higher performance at lower cost. Examples were
IBM System/38, the early oering of Teradata, and the Britton Lee, Inc. database machine.
Another approach to hardware support for database management was ICL's CAFS accelerator, a hardware disk controller with programmable search capabilities. In the long term, these eorts were generally unsuccessful because
specialized database machines could not keep pace with the rapid development and progress of general-purpose
computers. Thus most database systems nowadays are software systems running on general-purpose hardware, using
general-purpose computer data storage. However this idea is still pursued for certain applications by some companies
like Netezza and Oracle (Exadata).

1.4.4

Late 1970s, SQL DBMS

IBM started working on a prototype system loosely based on Codds concepts as System R in the early 1970s. The
rst version was ready in 1974/5, and work then started on multi-table systems in which the data could be split so that
all of the data for a record (some of which is optional) did not have to be stored in a single large chunk. Subsequent
multi-user versions were tested by customers in 1978 and 1979, by which time a standardized query language SQL
had been added. Codds ideas were establishing themselves as both workable and superior to CODASYL, pushing
IBM to develop a true production version of System R, known as SQL/DS, and, later, Database 2 (DB2).
Larry Ellison's Oracle started from a dierent chain, based on IBMs papers on System R, and beat IBM to market
when the rst version was released in 1978.
Stonebraker went on to apply the lessons from INGRES to develop a new database, Postgres, which is now known
as PostgreSQL. PostgreSQL is often used for global mission critical applications (the .org and .info domain name
registries use it as their primary data store, as do many large companies and nancial institutions).
In Sweden, Codds paper was also read and Mimer SQL was developed from the mid-1970s at Uppsala University. In
1984, this project was consolidated into an independent enterprise. In the early 1980s, Mimer introduced transaction
handling for high robustness in applications, an idea that was subsequently implemented on most other DBMSs.
Another data model, the entityrelationship model, emerged in 1976 and gained popularity for database design as
it emphasized a more familiar description than the earlier relational model. Later on, entityrelationship constructs
were retrotted as a data modeling construct for the relational model, and the dierence between the two have become
irrelevant.

1.4.5

1980s, on the desktop

The 1980s ushered in the age of desktop computing. The new computers empowered their users with spreadsheets
like Lotus 1-2-3 and database software like dBASE. The dBASE product was lightweight and easy for any computer
user to understand out of the box. C. Wayne Ratli the creator of dBASE stated: dBASE was dierent from
programs like BASIC, C, FORTRAN, and COBOL in that a lot of the dirty work had already been done. The data
manipulation is done by dBASE instead of by the user, so the user can concentrate on what he is doing, rather than
having to mess with the dirty details of opening, reading, and closing les, and managing space allocation.[19] dBASE
was one of the top selling software titles in the 1980s and early 1990s.

1.4.6

CHAPTER 1. DATABASE

1980s, object-oriented

The 1980s, along with a rise in object-oriented programming, saw a growth in how data in various databases were
handled. Programmers and designers began to treat the data in their databases as objects. That is to say that if a
persons data were in a database, that persons attributes, such as their address, phone number, and age, were now
considered to belong to that person instead of being extraneous data. This allows for relations between data to be relations to objects and their attributes and not to individual elds.[20] The term "object-relational impedance mismatch"
described the inconvenience of translating between programmed objects and database tables. Object databases and
object-relational databases attempt to solve this problem by providing an object-oriented language (sometimes as
extensions to SQL) that programmers can use as alternative to purely relational SQL. On the programming side,
libraries known as object-relational mappings (ORMs) attempt to solve the same problem.

1.4.7

2000s, NoSQL and NewSQL

Main articles: NoSQL and NewSQL


The next generation of post-relational databases in the 2000s became known as NoSQL databases, including fast
key-value stores and document-oriented databases.
XML databases are a type of structured document-oriented database that allows querying based on XML document attributes. XML databases are mostly used in enterprise database management, where XML is being used
as the machine-to-machine data interoperability standard. XML database management systems include commercial
software MarkLogic and Oracle Berkeley DB XML, and a free use software Clusterpoint Distributed XML/JSON
Database. All are enterprise software database platforms and support industry standard ACID-compliant transaction
processing with strong database consistency characteristics and high level of database security.[21][22][23]
NoSQL databases are often very fast, do not require xed table schemas, avoid join operations by storing denormalized
data, and are designed to scale horizontally. The most popular NoSQL systems include MongoDB, Couchbase, Riak,
Memcached, Redis, CouchDB, Hazelcast, Apache Cassandra and HBase,[24] which are all open-source software
products.
In recent years there was a high demand for massively distributed databases with high partition tolerance but according
to the CAP theorem it is impossible for a distributed system to simultaneously provide consistency, availability and
partition tolerance guarantees. A distributed system can satisfy any two of these guarantees at the same time, but
not all three. For that reason many NoSQL databases are using what is called eventual consistency to provide both
availability and partition tolerance guarantees with a reduced level of data consistency.
NewSQL is a class of modern relational databases that aims to provide the same scalable performance of NoSQL
systems for online transaction processing (read-write) workloads while still using SQL and maintaining the ACID
guarantees of a traditional database system. Such databases include ScaleBase, Clustrix, EnterpriseDB, MemSQL,
NuoDB[25] and VoltDB.

1.5 Research
Database technology has been an active research topic since the 1960s, both in academia and in the research and
development groups of companies (for example IBM Research). Research activity includes theory and development
of prototypes. Notable research topics have included models, the atomic transaction concept and related concurrency
control techniques, query languages and query optimization methods, RAID, and more.
The database research area has several dedicated academic journals (for example, ACM Transactions on Database
Systems-TODS, Data and Knowledge Engineering-DKE) and annual conferences (e.g., ACM SIGMOD, ACM PODS,
VLDB, IEEE ICDE).

1.6 Examples
One way to classify databases involves the type of their contents, for example: bibliographic, document-text, statistical, or multimedia objects. Another way is by their application area, for example: accounting, music compositions,

1.6. EXAMPLES

movies, banking, manufacturing, or insurance. A third way is by some technical aspect, such as the database structure
or interface type. This section lists a few of the adjectives used to characterize dierent kinds of databases.
An in-memory database is a database that primarily resides in main memory, but is typically backed-up by nonvolatile computer data storage. Main memory databases are faster than disk databases, and so are often used
where response time is critical, such as in telecommunications network equipment.[26] SAP HANA platform is
a very hot topic for in-memory database. By May 2012, HANA was able to run on servers with 100TB main
memory powered by IBM. The co founder of the company claimed that the system was big enough to run the
8 largest SAP customers.
An active database includes an event-driven architecture which can respond to conditions both inside and
outside the database. Possible uses include security monitoring, alerting, statistics gathering and authorization.
Many databases provide active database features in the form of database triggers.
A cloud database relies on cloud technology. Both the database and most of its DBMS reside remotely, in
the cloud, while its applications are both developed by programmers and later maintained and utilized by
(applications) end-users through a web browser and Open APIs.
Data warehouses archive data from operational databases and often from external sources such as market research rms. The warehouse becomes the central source of data for use by managers and other end-users who
may not have access to operational data. For example, sales data might be aggregated to weekly totals and converted from internal product codes to use UPCs so that they can be compared with ACNielsen data. Some basic
and essential components of data warehousing include extracting, analyzing, and mining data, transforming,
loading and managing data so as to make them available for further use.
A deductive database combines logic programming with a relational database, for example by using the Datalog
language.
A distributed database is one in which both the data and the DBMS span multiple computers.
A document-oriented database is designed for storing, retrieving, and managing document-oriented, or semi
structured data, information. Document-oriented databases are one of the main categories of NoSQL databases.
An embedded database system is a DBMS which is tightly integrated with an application software that requires
access to stored data in such a way that the DBMS is hidden from the applications end-users and requires little
or no ongoing maintenance.[27]
End-user databases consist of data developed by individual end-users. Examples of these are collections of
documents, spreadsheets, presentations, multimedia, and other les. Several products exist to support such
databases. Some of them are much simpler than full-edged DBMSs, with more elementary DBMS functionality.
A federated database system comprises several distinct databases, each with its own DBMS. It is handled as a
single database by a federated database management system (FDBMS), which transparently integrates multiple
autonomous DBMSs, possibly of dierent types (in which case it would also be a heterogeneous database
system), and provides them with an integrated conceptual view.
Sometimes the term multi-database is used as a synonym to federated database, though it may refer to a less
integrated (e.g., without an FDBMS and a managed integrated schema) group of databases that cooperate in a
single application. In this case typically middleware is used for distribution, which typically includes an atomic
commit protocol (ACP), e.g., the two-phase commit protocol, to allow distributed (global) transactions across
the participating databases.
A graph database is a kind of NoSQL database that uses graph structures with nodes, edges, and properties to
represent and store information. General graph databases that can store any graph are distinct from specialized
graph databases such as triplestores and network databases.

CHAPTER 1. DATABASE
An array DBMS is a kind of NoSQL DBMS that allows to model, store, and retrieve (usually large) multidimensional arrays such as satellite images and climate simulation output.
In a hypertext or hypermedia database, any word or a piece of text representing an object, e.g., another piece
of text, an article, a picture, or a lm, can be hyperlinked to that object. Hypertext databases are particularly
useful for organizing large amounts of disparate information. For example, they are useful for organizing
online encyclopedias, where users can conveniently jump around the text. The World Wide Web is thus a large
distributed hypertext database.
A knowledge base (abbreviated KB, kb or [28][29] ) is a special kind of database for knowledge management,
providing the means for the computerized collection, organization, and retrieval of knowledge. Also a collection
of data representing problems with their solutions and related experiences.
A mobile database can be carried on or synchronized from a mobile computing device.
Operational databases store detailed data about the operations of an organization. They typically process relatively high volumes of updates using transactions. Examples include customer databases that record contact,
credit, and demographic information about a business customers, personnel databases that hold information
such as salary, benets, skills data about employees, enterprise resource planning systems that record details
about product components, parts inventory, and nancial databases that keep track of the organizations money,
accounting and nancial dealings.
A parallel database seeks to improve performance through parallelization for tasks such as loading data, building
indexes and evaluating queries.
The major parallel DBMS architectures which are induced by the underlying hardware architecture are:
Shared memory architecture, where multiple processors share the main memory space,
as well as other data storage.
Shared disk architecture, where each processing unit (typically consisting of multiple
processors) has its own main memory, but all units share the other storage.
Shared nothing architecture, where each processing unit has its own main memory
and other storage.
Probabilistic databases employ fuzzy logic to draw inferences from imprecise data.
Real-time databases process transactions fast enough for the result to come back and be acted on right away.
A spatial database can store the data with multidimensional features. The queries on such data include location
based queries, like Where is the closest hotel in my area?".
A temporal database has built-in time aspects, for example a temporal data model and a temporal version of
SQL. More specically the temporal aspects usually include valid-time and transaction-time.
A terminology-oriented database builds upon an object-oriented database, often customized for a specic eld.
An unstructured data database is intended to store in a manageable and protected way diverse objects that do
not t naturally and conveniently in common databases. It may include email messages, documents, journals,
multimedia objects, etc. The name may be misleading since some objects can be highly structured. However,
the entire possible object collection does not t into a predened structured framework. Most established
DBMSs now support unstructured data in various ways, and new dedicated DBMSs are emerging.

1.7. DESIGN AND MODELING

1.7 Design and modeling


Main article: Database design
The rst task of a database designer is to produce a conceptual data model that reects the structure of the information
to be held in the database. A common approach to this is to develop an entity-relationship model, often with the aid of
drawing tools. Another popular approach is the Unied Modeling Language. A successful data model will accurately
reect the possible state of the external world being modeled: for example, if people can have more than one phone
number, it will allow this information to be captured. Designing a good conceptual data model requires a good
understanding of the application domain; it typically involves asking deep questions about the things of interest to an
organisation, like can a customer also be a supplier?", or if a product is sold with two dierent forms of packaging,
are those the same product or dierent products?", or if a plane ies from New York to Dubai via Frankfurt, is that
one ight or two (or maybe even three)?". The answers to these questions establish denitions of the terminology
used for entities (customers, products, ights, ight segments) and their relationships and attributes.
Producing the conceptual data model sometimes involves input from business processes, or the analysis of workow
in the organization. This can help to establish what information is needed in the database, and what can be left out.
For example, it can help when deciding whether the database needs to hold historic data as well as current data.
Having produced a conceptual data model that users are happy with, the next stage is to translate this into a schema
that implements the relevant data structures within the database. This process is often called logical database design,
and the output is a logical data model expressed in the form of a schema. Whereas the conceptual data model is (in
theory at least) independent of the choice of database technology, the logical data model will be expressed in terms
of a particular database model supported by the chosen DBMS. (The terms data model and database model are often
used interchangeably, but in this article we use data model for the design of a specic database, and database model
for the modelling notation used to express that design.)
The most popular database model for general-purpose databases is the relational model, or more precisely, the relational model as represented by the SQL language. The process of creating a logical database design using this model
uses a methodical approach known as normalization. The goal of normalization is to ensure that each elementary
fact is only recorded in one place, so that insertions, updates, and deletions automatically maintain consistency.
The nal stage of database design is to make the decisions that aect performance, scalability, recovery, security, and
the like. This is often called physical database design. A key goal during this stage is data independence, meaning that
the decisions made for performance optimization purposes should be invisible to end-users and applications. Physical
design is driven mainly by performance requirements, and requires a good knowledge of the expected workload and
access patterns, and a deep understanding of the features oered by the chosen DBMS.
Another aspect of physical database design is security. It involves both dening access control to database objects as
well as dening security levels and methods for the data itself.

1.7.1

Models

Main article: Database model


A database model is a type of data model that determines the logical structure of a database and fundamentally
determines in which manner data can be stored, organized, and manipulated. The most popular example of a database
model is the relational model (or the SQL approximation of relational), which uses a table-based format.
Common logical data models for databases include:
Hierarchical database model
Network model
Relational model
Entityrelationship model
Enhanced entityrelationship model
Object model

10

CHAPTER 1. DATABASE
Document model
Entityattributevalue model
Star schema

An object-relational database combines the two related structures.


Physical data models include:
Inverted index
Flat le
Other models include:
Associative model
Multidimensional model
Array model
Multivalue model
Semantic model
XML database

1.7.2

External, conceptual, and internal views

A database management system provides three views of the database data:


The external level denes how each group of end-users sees the organization of data in the database. A single
database can have any number of views at the external level.
The conceptual level unies the various external views into a compatible global view.[31] It provides the synthesis of all the external views. It is out of the scope of the various database end-users, and is rather of interest
to database application developers and database administrators.
The internal level (or physical level) is the internal organization of data inside a DBMS (see Implementation
section below). It is concerned with cost, performance, scalability and other operational matters. It deals with
storage layout of the data, using storage structures such as indexes to enhance performance. Occasionally it
stores data of individual views (materialized views), computed from generic data, if performance justication
exists for such redundancy. It balances all the external views performance requirements, possibly conicting,
in an attempt to optimize overall performance across all activities.
While there is typically only one conceptual (or logical) and physical (or internal) view of the data, there can be any
number of dierent external views. This allows users to see database information in a more business-related way
rather than from a technical, processing viewpoint. For example, a nancial department of a company needs the
payment details of all employees as part of the companys expenses, but does not need details about employees that
are the interest of the human resources department. Thus dierent departments need dierent views of the companys
database.
The three-level database architecture relates to the concept of data independence which was one of the major initial
driving forces of the relational model. The idea is that changes made at a certain level do not aect the view at a
higher level. For example, changes in the internal level do not aect application programs written using conceptual
level interfaces, which reduces the impact of making physical changes to improve performance.
The conceptual view provides a level of indirection between internal and external. On one hand it provides a common
view of the database, independent of dierent external view structures, and on the other hand it abstracts away details
of how the data is stored or managed (internal level). In principle every level, and even every external view, can be
presented by a dierent data model. In practice usually a given DBMS uses the same data model for both the external

1.8. LANGUAGES

11

and the conceptual levels (e.g., relational model). The internal level, which is hidden inside the DBMS and depends
on its implementation (see Implementation section below), requires a dierent level of detail and uses its own types
of data structure types.
Separating the external, conceptual and internal levels was a major feature of the relational database model implementations that dominate 21st century databases.[31]

1.8 Languages
Database languages are special-purpose languages, which do one or more of the following:
Data denition language denes data types and the relationships among them
Data manipulation language performs tasks such as inserting, updating, or deleting data occurrences
Query language allows searching for information and computing derived information
Database languages are specic to a particular data model. Notable examples include:
SQL combines the roles of data denition, data manipulation, and query in a single language. It was one of
the rst commercial languages for the relational model, although it departs in some respects from the relational
model as described by Codd (for example, the rows and columns of a table can be ordered). SQL became a
standard of the American National Standards Institute (ANSI) in 1986, and of the International Organization
for Standardization (ISO) in 1987. The standards have been regularly enhanced since and is supported (with
varying degrees of conformance) by all mainstream commercial relational DBMSs.[32][33]
OQL is an object model language standard (from the Object Data Management Group). It has inuenced the
design of some of the newer query languages like JDOQL and EJB QL.
XQuery is a standard XML query language implemented by XML database systems such as MarkLogic and
eXist, by relational databases with XML capability such as Oracle and DB2, and also by in-memory XML
processors such as Saxon.
SQL/XML combines XQuery with SQL.[34]
A database language may also incorporate features like:
DBMS-specic Conguration and storage engine management
Computations to modify query results, like counting, summing, averaging, sorting, grouping, and cross-referencing
Constraint enforcement (e.g. in an automotive database, only allowing one engine type per car)
Application programming interface version of the query language, for programmer convenience

1.9 Performance, security, and availability


Because of the critical importance of database technology to the smooth running of an enterprise, database systems include complex mechanisms to deliver the required performance, security, and availability, and allow database
administrators to control the use of these features.

12

1.9.1

CHAPTER 1. DATABASE

Storage

Main articles: Computer data storage and Database engine


Database storage is the container of the physical materialization of a database. It comprises the internal (physical)
level in the database architecture. It also contains all the information needed (e.g., metadata, data about the data,
and internal data structures) to reconstruct the conceptual level and external level from the internal level when needed.
Putting data into permanent storage is generally the responsibility of the database engine a.k.a. storage engine.
Though typically accessed by a DBMS through the underlying operating system (and often utilizing the operating
systems le systems as intermediates for storage layout), storage properties and conguration setting are extremely
important for the ecient operation of the DBMS, and thus are closely maintained by database administrators. A
DBMS, while in operation, always has its database residing in several types of storage (e.g., memory and external
storage). The database data and the additional needed information, possibly in very large amounts, are coded into
bits. Data typically reside in the storage in structures that look completely dierent from the way the data look in
the conceptual and external levels, but in ways that attempt to optimize (the best possible) these levels reconstruction
when needed by users and programs, as well as for computing additional types of needed information from the data
(e.g., when querying the database).
Some DBMSs support specifying which character encoding was used to store data, so multiple encodings can be used
in the same database.
Various low-level database storage structures are used by the storage engine to serialize the data model so it can be
written to the medium of choice. Techniques such as indexing may be used to improve performance. Conventional
storage is row-oriented, but there are also column-oriented and correlation databases.
Materialized views
Main article: Materialized view
Often storage redundancy is employed to increase performance. A common example is storing materialized views,
which consist of frequently needed external views or query results. Storing such views saves the expensive computing
of them each time they are needed. The downsides of materialized views are the overhead incurred when updating
them to keep them synchronized with their original updated database data, and the cost of storage redundancy.
Replication
Main article: Database replication
Occasionally a database employs storage redundancy by database objects replication (with one or more copies) to
increase data availability (both to improve performance of simultaneous multiple end-user accesses to a same database
object, and to provide resiliency in a case of partial failure of a distributed database). Updates of a replicated object
need to be synchronized across the object copies. In many cases the entire database is replicated.

1.9.2

Security

Main article: Database security


Database security deals with all various aspects of protecting the database content, its owners, and its users. It ranges
from protection from intentional unauthorized database uses to unintentional database accesses by unauthorized entities (e.g., a person or a computer program).
Database access control deals with controlling who (a person or a certain computer program) is allowed to access
what information in the database. The information may comprise specic database objects (e.g., record types, specic records, data structures), certain computations over certain objects (e.g., query types, or specic queries), or
utilizing specic access paths to the former (e.g., using specic indexes or other data structures to access information). Database access controls are set by special authorized (by the database owner) personnel that uses dedicated

1.9. PERFORMANCE, SECURITY, AND AVAILABILITY

13

protected security DBMS interfaces.


This may be managed directly on an individual basis, or by the assignment of individuals and privileges to groups,
or (in the most elaborate models) through the assignment of individuals and groups to roles which are then granted
entitlements. Data security prevents unauthorized users from viewing or updating the database. Using passwords,
users are allowed access to the entire database or subsets of it called subschemas. For example, an employee
database can contain all the data about an individual employee, but one group of users may be authorized to view
only payroll data, while others are allowed access to only work history and medical data. If the DBMS provides a way
to interactively enter and update the database, as well as interrogate it, this capability allows for managing personal
databases.
Data security in general deals with protecting specic chunks of data, both physically (i.e., from corruption, or destruction, or removal; e.g., see physical security), or the interpretation of them, or parts of them to meaningful
information (e.g., by looking at the strings of bits that they comprise, concluding specic valid credit-card numbers;
e.g., see data encryption).
Change and access logging records who accessed which attributes, what was changed, and when it was changed.
Logging services allow for a forensic database audit later by keeping a record of access occurrences and changes.
Sometimes application-level code is used to record changes rather than leaving this to the database. Monitoring can
be set up to attempt to detect security breaches.

1.9.3

Transactions and concurrency

Further information: Concurrency control


Database transactions can be used to introduce some level of fault tolerance and data integrity after recovery from
a crash. A database transaction is a unit of work, typically encapsulating a number of operations over a database
(e.g., reading a database object, writing, acquiring lock, etc.), an abstraction supported in database and also other
systems. Each transaction has well dened boundaries in terms of which program/code executions are included in
that transaction (determined by the transactions programmer via special transaction commands).
The acronym ACID describes some ideal properties of a database transaction: Atomicity, Consistency, Isolation, and
Durability.

1.9.4

Migration
See also section Database migration in article Data migration

A database built with one DBMS is not portable to another DBMS (i.e., the other DBMS cannot run it). However,
in some situations it is desirable to move, migrate a database from one DBMS to another. The reasons are primarily
economical (dierent DBMSs may have dierent total costs of ownership or TCOs), functional, and operational
(dierent DBMSs may have dierent capabilities). The migration involves the databases transformation from one
DBMS type to another. The transformation should maintain (if possible) the database related application (i.e., all
related application programs) intact. Thus, the databases conceptual and external architectural levels should be
maintained in the transformation. It may be desired that also some aspects of the architecture internal level are
maintained. A complex or large database migration may be a complicated and costly (one-time) project by itself,
which should be factored into the decision to migrate. This in spite of the fact that tools may exist to help migration
between specic DBMSs. Typically a DBMS vendor provides tools to help importing databases from other popular
DBMSs.

1.9.5

Building, maintaining, and tuning

Main article: Database tuning


After designing a database for an application, the next stage is building the database. Typically an appropriate generalpurpose DBMS can be selected to be utilized for this purpose. A DBMS provides the needed user interfaces to be
utilized by database administrators to dene the needed applications data structures within the DBMSs respective

14

CHAPTER 1. DATABASE

data model. Other user interfaces are used to select needed DBMS parameters (like security related, storage allocation
parameters, etc.).
When the database is ready (all its data structures and other needed components are dened) it is typically populated with initial applications data (database initialization, which is typically a distinct project; in many cases using
specialized DBMS interfaces that support bulk insertion) before making it operational. In some cases the database
becomes operational while empty of application data, and data is accumulated during its operation.
After the database is created, initialised and populated it needs to be maintained. Various database parameters may
need changing and the database may need to be tuned (tuning) for better performance; applications data structures
may be changed or added, new related application programs may be written to add to the applications functionality,
etc.

1.9.6

Backup and restore

Main article: Backup


Sometimes it is desired to bring a database back to a previous state (for many reasons, e.g., cases when the database
is found corrupted due to a software error, or if it has been updated with erroneous data). To achieve this a backup
operation is done occasionally or continuously, where each desired database state (i.e., the values of its data and
their embedding in databases data structures) is kept within dedicated backup les (many techniques exist to do this
eectively). When this state is needed, i.e., when it is decided by a database administrator to bring the database back
to this state (e.g., by specifying this state by a desired point in time when the database was in this state), these les
are utilized to restore that state.

1.9.7

Other

Other DBMS features might include:


Database logs
Graphics component for producing graphs and charts, especially in a data warehouse system
Query optimizer Performs query optimization on every query to choose for it the most ecient query plan
(a partial order (tree) of operations) to be executed to compute the query result. May be specic to a particular
storage engine.
Tools or hooks for database design, application programming, application program maintenance, database
performance analysis and monitoring, database conguration monitoring, DBMS hardware conguration (a
DBMS and related database may span computers, networks, and storage units) and related database mapping
(especially for a distributed DBMS), storage allocation and database layout monitoring, storage migration, etc.

1.10 See also


Main categories: Databases and Database management systems

Comparison of database tools


Comparison of object database management systems
Comparison of object-relational database management systems
Comparison of relational database management systems
Data hierarchy
Database theory

1.11. REFERENCES

15

Database testing
Database-centric architecture
Question-focused dataset

1.11 References
[1] http://www.merriam-webster.com/dictionary/database
[2] Jerey Ullman 1997: First course in database systems, PrenticeHall Inc., Simon & Schuster, Page 1, ISBN 0-13-861337-0.
[3] http://www.merriam-webster.com/dictionary/update
[4] http://www.merriam-webster.com/dictionary/retrieval
[5] http://www.merriam-webster.com/dictionary/administration
[6] Tsitchizris, D. C. and F. H. Lochovsky (1982). Data Models. Englewood-Clis, PrenticeHall.
[7] Beynon-Davies P. (2004). Database Systems 3rd Edition. Palgrave, Basingstoke, UK. ISBN 1-4039-1601-2
[8] Raul F. Chong, Michael Dang, Dwaine R. Snow, Xiaomei Wang (3 July 2008). Introduction to DB2. Retrieved 17
March 2013.. This article quotes a development time of 5 years involving 750 people for DB2 release 9 alone
[9] C. W. Bachmann (November 1973), The Programmer as Navigator (PDF), CACM (Turing Award Lecture 1973)
[10] Top DB index
[11] database, n. OED Online. Oxford University Press. June 2013. Retrieved July 12, 2013.
[12] IBM Corporation. IBM Information Management System (IMS) 13 Transaction and Database Servers delivers high performance and low total cost of ownership. Retrieved Feb 20, 2014.
[13] Codd, E.F. (1970).A Relational Model of Data for Large Shared Data Banks. In: Communications of the ACM 13 (6):
377387.
[14] William Hershey and Carol Easthope, A set theoretic data structure and retrieval language, Spring Joint Computer Conference, May 1972 in ACM SIGIR Forum, Volume 7, Issue 4 (December 1972), pp. 4555, DOI=10.1145/1095495.1095500
[15] Ken North, Sets, Data Models and Data Independence, Dr. Dobbs, 10 March 2010
[16] Description of a set-theoretic data structure, D. L. Childs, 1968, Technical Report 3 of the CONCOMP (Research in
Conversational Use of Computers) Project, University of Michigan, Ann Arbor, Michigan, USA
[17] Feasibility of a Set-Theoretic Data Structure : A General Structure Based on a Reconstituted Denition of Relation, D. L.
Childs, 1968, Technical Report 6 of the CONCOMP (Research in Conversational Use of Computers) Project, University
of Michigan, Ann Arbor, Michigan, USA
[18] MICRO Information Management System (Version 5.0) Reference Manual, M.A. Kahn, D.L. Rumelhart, and B.L. Bronson,
October 1977, Institute of Labor and Industrial Relations (ILIR), University of Michigan and Wayne State University
[19] Interview with Wayne Ratli. The FoxPro History. Retrieved on 2013-07-12.
[20] Development of an object-oriented DBMS; Portland, Oregon, United States; Pages: 472 482; 1986; ISBN 0-89791-204-7
[21] Oracle Berkeley DB XML (PDF). Retrieved 10 March 2015.
[22] ACID Transactions, MarkLogic. Retrieved 10 March 2015.
[23] Clusterpoint Database at a Glance. Retrieved 10 March 2015.
[24] DB-Engines Ranking. January 2013. Retrieved 22 January 2013.
[25] Proctor, Seth (2013). Exploring the Architecture of the NuoDB Database, Part 1. Retrieved 2013-07-12.
[26] TeleCommunication Systems Signs up as a Reseller of TimesTen; Mobile Operators and Carriers Gain Real-Time Platform for Location-Based Services. Business Wire. 2002-06-24.

16

CHAPTER 1. DATABASE

[27] Graves, Steve. COTS Databases For Embedded Systems, Embedded Computing Design magazine, January 2007. Retrieved on August 13, 2008.
[28] Argumentation in Articial Intelligence by Iyad Rahwan, Guillermo R. Simari
[29] OWL DL Semantics. Retrieved 10 December 2010.
[30] itl.nist.gov (1993) Integration Denition for Information Modeling (IDEFIX). 21 December 1993.
[31] Date 1990, pp. 3132
[32] Chapple, Mike. SQL Fundamentals. Databases. About.com. Retrieved 2009-01-28.
[33] Structured Query Language (SQL)". International Business Machines. October 27, 2006. Retrieved 2007-06-10.
[34] Wagner, Michael (2010), 1. Auage, SQL/XML:2006 Evaluierung der Standardkonformitt ausgewhlter Datenbanksysteme, Diplomica Verlag, ISBN 3-8366-9609-6

1.12 Further reading


Ling Liu and Tamer M. zsu (Eds.) (2009). "Encyclopedia of Database Systems, 4100 p. 60 illus. ISBN
978-0-387-49616-0.
Beynon-Davies, P. (2004). Database Systems. 3rd Edition. Palgrave, Houndmills, Basingstoke.
Connolly, Thomas and Carolyn Begg. Database Systems. New York: Harlow, 2002.
Date, C. J. (2003). An Introduction to Database Systems, Fifth Edition. Addison Wesley. ISBN 0-201-51381-1.
Gray, J. and Reuter, A. Transaction Processing: Concepts and Techniques, 1st edition, Morgan Kaufmann
Publishers, 1992.
Kroenke, David M. and David J. Auer. Database Concepts. 3rd ed. New York: Prentice, 2007.
Raghu Ramakrishnan and Johannes Gehrke, Database Management Systems
Abraham Silberschatz, Henry F. Korth, S. Sudarshan, Database System Concepts
Discussion on database systems,
Lightstone, S.; Teorey, T.; Nadeau, T. (2007). Physical Database Design: the database professionals guide to
exploiting indexes, views, storage, and more. Morgan Kaufmann Press. ISBN 0-12-369389-6.
Teorey, T.; Lightstone, S. and Nadeau, T. Database Modeling & Design: Logical Design, 4th edition, Morgan
Kaufmann Press, 2005. ISBN 0-12-685352-5

1.13 External links


Database at DMOZ
DB File extension informations about les with DB extension

1.13. EXTERNAL LINKS

Basic structure of navigational CODASYL database model

17

18

CHAPTER 1. DATABASE

"key"
last
login first
mark Samuel Clemens
Kimbro
Lion
lion
kitty
Amber Straub
login phone
mark 555.555.5555
"related table"
In the relational model, records are linked using virtual keys not stored in the database but dened as needed between the data
contained in the records.

1.13. EXTERNAL LINKS

19

Collage of ve types of database models

External Schema
-User ViewTraditional view of data[30]

Internal Schema
-Computer View-

Chapter 2

Relational database management system

The general structure of a relational database.

A relational database management system (RDBMS) is a database management system (DBMS) that is based on
the relational model as invented by E. F. Codd, of IBMs San Jose Research Laboratory. Many popular databases
currently in use are based on the relational database model.
RDBMSs are a common choice for the storage of information in new databases used for nancial records, manufacturing and logistical information, personnel data, and other applications since the 1980s. Relational databases
have often replaced legacy hierarchical databases and network databases because they are easier to understand and
use. However, relational databases have been challenged by object databases, which were introduced in an attempt
to address the object-relational impedance mismatch in relational databases, and XML databases.
20

2.1. MARKET SHARE

21

2.1 Market share


According to research company Gartner, the ve leading commercial relational database vendors by revenue in 2011
were Oracle (48.8%), IBM (20.2%), Microsoft (17.0%), SAP including Sybase (4.6%), and Teradata (3.7%).[1]
The three leading open source implementations are MySQL, PostgreSQL, and SQLite. MariaDB is a prominent fork
of MySQL prompted by Oracles acquisition of MySQL AB.
According to Gartner, in 2008, the percentage of database sites using any given technology were (a given site may
deploy multiple technologies):[2]
Oracle Database - 70%
Microsoft SQL Server - 68%
MySQL (Oracle Corporation) - 50%
IBM DB2 - 39%
IBM Informix - 18%
SAP Sybase Adaptive Server Enterprise - 15%
SAP Sybase IQ - 14%
Teradata - 11%
According to DB-Engines, the most popular systems are Oracle, MySQL, Microsoft SQL Server, PostgreSQL and
IBM DB2.[3]

2.2 History
In 1974, IBM began developing System R, a research project to develop a prototype RDBMS.[4] Its rst commercial
product was SQL/DS, released in 1981.[5] However, the rst commercially available RDBMS was Oracle, released in
1979 by Relational Software, now Oracle Corporation.[6] Other examples of an RDBMS include DB2, SAP Sybase
ASE, and Informix.

2.3 Historical usage of the term


The term relational database was invented by E. F. Codd at IBM in 1970. Codd introduced the term in his seminal
paper A Relational Model of Data for Large Shared Data Banks.[7] In this paper and later papers, he dened what
he meant by relational. One well-known denition of what constitutes a relational database system is composed
of Codds 12 rules. However, many of the early implementations of the relational model did not conform to all of
Codds rules, so the term gradually came to describe a broader class of database systems, which at a minimum:
Present the data to the user as relations (a presentation in tabular form, i.e. as a collection of tables with each
table consisting of a set of rows and columns);
Provide relational operators to manipulate the data in tabular form.
The rst systems that were relatively faithful implementations of the relational model were from the University of
Michigan; Micro DBMS (1969), the Massachusetts Institute of Technology;[8] (1971), and from IBM UK Scientic
Centre at Peterlee; IS1 (197072) and its followon PRTV (197379). The rst system sold as an RDBMS was Multics
Relational Data Store, rst sold in 1978. Others have been Berkeley Ingres QUEL and IBM BS12.
The most popular denition of an RDBMS is a product that presents a view of data as a collection of rows and columns,
even if it is not based strictly upon relational theory. By this denition, RDBMS products typically implement some
but not all of Codds 12 rules.

22

CHAPTER 2. RELATIONAL DATABASE MANAGEMENT SYSTEM

A second school of thought argues that if a database does not implement all of Codds rules (or the current understanding on the relational model, as expressed by Christopher J Date, Hugh Darwen and others), it is not relational.
This view, shared by many theorists and other strict adherents to Codds principles, would disqualify most DBMSs as
not relational. For clarication, they often refer to some RDBMSs as truly-relational database management systems
(TRDBMS), naming others pseudo-relational database management systems (PRDBMS). It can also be said as the
raw database management system.
As of 2009, most commercial relational DBMSes employ SQL as their query language.

[9]

Alternative query languages have been proposed and implemented, notably the pre-1996 implementation of Berkeley
Ingres QUEL.

2.4 See also


SQL
Wikibook SQL
Online analytical processing (OLAP) and ROLAP (Relational Online Analytical Processing)
Data warehouse
Star schema
Snowake schema

2.5 References
[1] Oracle the clear leader in $24 billion RDBMS market. 2012-04-12. Retrieved 2013-03-01.
[2] Market Share. Retrieved 2013-03-01.
[3] DB-Engines Ranking of Relational DBMS. Retrieved 2013-05-06.
[4] Funding a Revolution: Government Support for Computing Research. National Academies Press. 8 Jan 1999. ISBN
0309062780. System R did not convince IBM management to abandon its existing product
[5] S. Sumathi, S. Esakkirajan (13 Feb 2008). Fundamentals of Relational Database Management Systems. Springer. ISBN
3540483977. The product was called SQL/DS (Structured Query Language/Data Store) and ran under the DOS/VSE
operating system environment
[6] Oracle Timeline (PDF). Prot Magazine (Oracle) 12 (2): 26. May 2007. Retrieved 2013-05-16.
[7] A Relational Model of Data for Large Shared Data Banks
[8] SIGFIDET '74 Proceedings of the 1974 ACM SIGFIDET (now SIGMOD) workshop on Data description, access and
control
[9] Ramakrishnan, Raghu; Donjerkovic, Donko; Ranganathan, Arvind; Beyer, Kevin S.; Krishnaprasad, Muralidhar (1998).
SRQL: Sorted Relational Query Language (PDF). e Proceedings of SSDBM.

Chapter 3

MySQL
MySQL (/maskjul/ My S-Q-L,[6] ocially, but also called /masikwl/ My Sequel) is (as of July 2013) the
worlds second most[lower-alpha 1] widely used relational database management system (RDBMS)[9] and most widely
used open-source RDBMS.[10] It is named after co-founder Michael Widenius's daughter, My.[11] The SQL acronym
stands for Structured Query Language.
The MySQL development project has made its source code available under the terms of the GNU General Public
License, as well as under a variety of proprietary agreements. MySQL was owned and sponsored by a single for-prot
rm, the Swedish company MySQL AB, now owned by Oracle Corporation.[12]
MySQL is a popular choice of database for use in web applications, and is a central component of the widely used
LAMP open source web application software stack (and other 'AMP' stacks). LAMP is an acronym for "Linux,
Apache, MySQL, Perl/PHP/Python. Free-software-open source projects that require a full-featured database management system often use MySQL.
For proprietary use, several paid editions are available, and oer additional functionality. Applications which use
MySQL databases include: TYPO3, MODx, Joomla, WordPress, phpBB, MyBB, Drupal and other software. MySQL
is also used in many high-prole, large-scale websites, including Google[13][14] (though not for searches), Facebook,[15][16][17]
Twitter,[18] Flickr,[19] and YouTube.[20]

3.1 Interfaces
MySQL is a relational database management system (RDBMS), and ships with no GUI tools to administer MySQL
databases or manage data contained within the databases. Users may use the included command line tools,[21][22] or
use MySQL front-ends, desktop software and web applications that create and manage MySQL databases, build
database structures, back up data, inspect status, and work with data records.[23][24][25][26] The ocial set of MySQL
front-end tools, MySQL Workbench is actively developed by Oracle, and is freely available for use.[27]

3.1.1

Graphical

The ocial MySQL Workbench is a free integrated environment developed by MySQL AB, that enables users to
graphically administer MySQL databases and visually design database structures. MySQL Workbench replaces the
previous package of software, MySQL GUI Tools. Similar to other third-party packages, but still considered the authoritative MySQL front end, MySQL Workbench lets users manage database design & modeling, SQL development
(replacing MySQL Query Browser) and Database administration (replacing MySQL Administrator).
MySQL Workbench is available in two editions, the regular free and open source Community Edition which may be
downloaded from the MySQL website, and the proprietary Standard Edition which extends and improves the feature
set of the Community Edition.
Third-party proprietary and free graphical administration applications (or front ends) are available that integrate
with MySQL and enable users to work with database structure and data visually. Some well-known front ends, in
alphabetical order, are:
23

24

CHAPTER 3. MYSQL

MySQL Workbench running on OS X

Adminer a free MySQL front end written in one PHP script, capable of managing multiple databases, with
many CSS skins available
Chive a free, open source, web-based database management tool designed as an alternative to phpMyAdmin
Database Workbench a software application for development and administration of multiple relational databases
including MySQL, with interoperationality between dierent database systems
DBEdit a free front end for MySQL and other databases
HeidiSQL a full featured free front end that runs on Windows, and can connect to local or remote MySQL
servers to manage databases, tables, column structure, and individual data records. Also supports specialised
GUI features for date/time elds and enumerated multiple-value elds[28]
LibreOce Base LibreOce Base allows the creation and management of databases, preparation of forms
and reports that provide end users easy access to data. Like Microsoft Access, it can be used as a frontend for various database systems, including Access databases (JET), ODBC data sources, and MySQL or
PostgreSQL[29]
Navicat a series of proprietary graphical database management applications, developed for Windows, Macintosh and Linux
OpenOce.org freely available OpenOce.org Base can manage MySQL databases if the entire suite is
installed
phpMyAdmin a free Web-based front-end, widely installed[30] by web hosting services since it is developed
in PHP and included in the LAMP stack, and MAMP, XAMPP and WAMP software bundle installers
SQLBuddy a free Web-based front end, developed in PHP
SQLyog proprietary, but there is also a free 'community' edition available

3.2. FEATURES

25

Toad for MySQL a free development and administration front end for MySQL from Dell Software
Webmin a free Web-based management utility and a MySQL front end, developed in Perl with some parts
written in Java
Other available proprietary MySQL front ends include dbForge Studio for MySQL, DBStudio, Epictetus, Microsoft
Access, Oracle SQL Developer, SchemaBank, SQLPro SQL Client, Toad Data Modeler and DaDaBIK.

3.1.2

Command line

MySQL ships with many command line tools, from which the main interface is 'mysql' client.[21][22] Third parties
have also developed tools to manage MySQL servers.
MySQL Utilities a set of utilities designed to perform common maintenance and administrative tasks. Originally included as part of the MySQL Workbench, the utilities are now a stand-alone download available from
Oracle.
Percona Toolkit a cross-platform toolkit for MySQL, developed in Perl.[31] Percona Toolkit can be used
to prove replication is working correctly, x corrupted data, automate repetitive tasks, and speed up servers.
Percona Toolkit is included with several Linux distributions such as CentOS and Debian, and packages are
available for Fedora and Ubuntu as well. Percona Toolkit was originally developed as Maatkit, but as of late
2011, Maatkit is no longer developed.

3.1.3

Programming

MySQL works on many system platforms, including AIX, BSDi, FreeBSD, HP-UX, eComStation, i5/OS, IRIX,
Linux, OS X, Microsoft Windows, NetBSD, Novell NetWare, OpenBSD, OpenSolaris, OS/2 Warp, QNX, Oracle
Solaris, Symbian, SunOS, SCO OpenServer, SCO UnixWare, Sanos and Tru64. A port of MySQL to OpenVMS
also exists.[32]
MySQL is written in C and C++. Its SQL parser is written in yacc, but it uses a home-brewed lexical analyzer.[33]
Many programming languages with language-specic APIs include libraries for accessing MySQL databases. These
include MySQL Connector/Net for integration with Microsofts Visual Studio (languages such as C# and VB are most
commonly used) and the JDBC driver for Java. In addition, an ODBC interface called MyODBC allows additional
programming languages that support the ODBC interface to communicate with a MySQL database, such as ASP or
ColdFusion. The HTSQL URL-based query method also ships with a MySQL adapter, allowing direct interaction
between a MySQL database and any web client via structured URLs.

3.2 Features
MySQL is oered under two dierent editions: the open source MySQL Community Server and the proprietary
Enterprise Server.[34] MySQL Enterprise Server is dierentiated by a series of proprietary extensions which install
as server plugins, but otherwise shares the version numbering system and is built from the same code base.
Major features as available in MySQL 5.6:
A broad subset of ANSI SQL 99, as well as extensions
Cross-platform support
Stored procedures, using a procedural language that closely adheres to SQL/PSM[35]
Triggers
Cursors
Updatable views

26

CHAPTER 3. MYSQL
Online DDL when using the InnoDB Storage Engine.
Information schema
Performance Schema
A set of SQL Mode options to control runtime behavior, including a strict mode to better adhere to SQL
standards.
X/Open XA distributed transaction processing (DTP) support; two phase commit as part of this, using the
default InnoDB storage engine
Transactions with savepoints when using the default InnoDB Storage Engine. The NDB Cluster Storage Engine
also supports transactions.
ACID compliance when using InnoDB and NDB Cluster Storage Engines[36]
SSL support
Query caching
Sub-SELECTs (i.e. nested SELECTs)
Built-in Replication support (i.e. Master-Master Replication & Master-Slave Replication) with one master per
slave, many slaves per master.[37] Multi-master replication is provided in MySQL Cluster,[38] and multi-master
support can be added to unclustered congurations using Galera Cluster.[39]
Full-text indexing and searching[lower-alpha 2]
Embedded database library
Unicode support[lower-alpha 3]
Partitioned tables with pruning of partitions in optimizer
Shared-nothing clustering through MySQL Cluster
Multiple storage engines, allowing one to choose the one that is most eective for each table in the application.[lower-alpha 4]
Native storage engines InnoDB, MyISAM, Merge, Memory (heap), Federated, Archive, CSV, Blackhole, NDB
Cluster.
Commit grouping, gathering multiple transactions from multiple connections together to increase the number
of commits per second.

The developers release minor updates of the MySQL Server approximately every two months. The sources can be
obtained from MySQLs website or from MySQLs Bazaar repository, both under the GPL license.

3.2.1

Limitations

Like other SQL databases, MySQL does not currently comply with the full SQL standard for some of the implemented
functionality, including foreign key references when using some storage engines other than the default of InnoDB,[40]
and check constraints.[41]
Up until MySQL 5.7, triggers are limited to one per action / timing, meaning that at most one trigger can be dened
to be executed after an INSERT operation, and one before INSERT on the same table.[42] No triggers can be dened
on views.[42]
MySQL, like most other transactional relational databases, is strongly limited by hard disk performance. This is
especially true in terms of write latency.[43] Given the recent appearance as of 2012 of very aordable consumer
grade SATA interface solid-state drives that oer zero mechanical latency, a vefold speedup over even an eight drive
RAID array can be had for a smaller investment.[44][45]
MySQL databases inbuilt functions like UNIX_TIMESTAMP() will return 0 after 03:14:07 UTC on 19 January
2038.[46]

3.2. FEATURES

27

Web cache

Linux kernel

Squid
Polipo
Trac server

AppArmor
SELinux
Smack
TOMOYO

CPU
&
RAM

Process Scheduler

Web server
Apache
Cherokee
Lighttpd
Nginx

CGI scripting
Perl
PHP
Python

Environment: CCC

Hardware

Netlter

Crackers
Botnets for DDoS-attacks
cracking attempts
...

Attacks
stave o

Network scheduler
NIC
device
driver

Competitors

&
Requests

Linux network stack

compete for customers

serve

Networking
hardware

kmod-fs-ext4
kmod-fs-btrfs
Lustre
...

Database
MariaDB
MySQL
Drizzle

Internet
Responses

Customers

low latency

Storage
SATA
SAS
RAID
iSCSI
NAS

want attendance

Botnets
DDoS-Attacks

LAMP software bundle, displayed here together with Squid.

3.2.2

Deployment

MySQL can be built and installed manually from source code, but this can be tedious so it is more commonly installed
from a binary package unless special customizations are required. On most Linux distributions the package management system can download and install MySQL with minimal eort, though further conguration is often required to
adjust security and optimization settings.
Though MySQL began as a low-end alternative to more powerful proprietary databases, it has gradually evolved to
support higher-scale needs as well. It is still most commonly used in small to medium scale single-server deployments,
either as a component in a LAMP-based web application or as a standalone database server. Much of MySQLs appeal
originates in its relative simplicity and ease of use, which is enabled by an ecosystem of open source tools such as
phpMyAdmin. In the medium range, MySQL can be scaled by deploying it on more powerful hardware, such as a
multi-processor server with gigabytes of memory.
There are however limits to how far performance can scale on a single server ('scaling up'), so on larger scales, multiserver MySQL ('scaling out') deployments are required to provide improved performance and reliability. A typical
high-end conguration can include a powerful master database which handles data write operations and is replicated
to multiple slaves that handle all read operations.[47] The master server synchronizes continually with its slaves so in
the event of failure a slave can be promoted to become the new master, minimizing downtime. Further improvements in performance can be achieved by caching the results from database queries in memory using memcached,
or breaking down a database into smaller chunks called shards which can be spread across a number of distributed
server clusters.[48]

3.2.3

Backup

Filesystem snapshot or volume manager snapshot backups are performed by using an external tool provided
by the operating system (such as LVM) or storage device, with additional support from MySQL for ensuring
consistency of such snapshots.
mysqldump a logical backup tool included with both community and enterprise editions of MySQL. Supports
backup from all storage engines.
MySQL Enterprise Backup a hot backup utility included as part of the MySQL Enterprise subscription from
Oracle. Oers native InnoDB hot backup, as well as backup for other storage engines.
XtraBackup open source MySQL hot backup software. Some notable features include hot, non-locking

28

CHAPTER 3. MYSQL
backups for InnoDB storage, incremental backups, streaming, parallel-compressed backups, throttling based
on the number of I/O operations per second, etc.[49]

3.2.4

High availability

Ensuring high availability requires a certain amount of redundancy in the system. For database systems, the redundancy traditionally takes the form of having a primary server acting as a master, and using replication to keep
secondaries available to take over in case the primary fails. This means that the server that the application connects
to is in reality a collection of servers, not a single server. In a similar manner, if the application is using a sharded
database, it is in reality working with a collection of servers, not a single server. In this case, a collection of servers
is usually referred to as a farm.[50]
One of the projects aiming to provide high availability for MySQL is MySQL Fabric, an integrated system for managing a collection of MySQL servers, and a framework on top of which high availability and database sharding is built.
MySQL Fabric is open-source and is intended to be extensible, easy to use, and to support procedure execution even
in the presence of failure, providing an execution model usually called resilient execution. MySQL client libraries are
extended so they are hiding the complexities of handling failover in the event of a server failure, as well as correctly
dispatching transactions to the shards. As of September 2013, there is currently support for Fabric-aware versions of
Connector/J, Connector/PHP, Connector/Python, as well as some rudimentary support for Hibernate and Doctrine.
As of May 2014, MySQL Fabric is in the general availability stage of development.[51]

3.2.5

Cloud deployment

Main article: Cloud database


MySQL can also be run on cloud computing platforms such as Amazon EC2. Listed below are some common
deployment models for MySQL on the cloud:
Virtual Machine Image cloud users can upload a machine image of their own with MySQL installed, or use
a ready-made machine image with an optimized installation of MySQL on it, such as the one provided by
Amazon EC2.[52]
MySQL as a Service some cloud platforms oer MySQL as a service. In this conguration, application
owners do not have to install and maintain the MySQL database on their own. Instead, the database service
provider takes responsibility for installing and maintaining the database, and application owners pay according to their usage.[53] Notable cloud-based MySQL services are the Amazon Relational Database Service;
Rackspace; HP Converged Cloud; Heroku and Jelastic.
Managed MySQL cloud hosting the database is not oered as a service, but the cloud provider hosts the
database and manages it on the application owners behalf. As of 2011, of the major cloud providers, only
Terremark and Rackspace oer managed hosting for MySQL databases.[54][55]

3.3 Community
The MySQL server software itself and the client libraries use dual-licensing distribution. They are oered under GPL
version 2,[56] beginning from 28 June 2000[57] (which in 2009 has been extended with a FLOSS License Exception)[58]
or to use a proprietary license.[59]
Support can be obtained from the ocial manual.[60] Free support additionally is available in dierent IRC channels
and forums. Oracle oers paid support via its MySQL Enterprise products. They dier in the scope of services and
in price. Additionally, a number of third party organisations exist to provide support and services, including SkySQL
Ab and Percona.
MySQL has received positive reviews, and reviewers noticed it performs extremely well in the average case. and
that the developer interfaces are there, and the documentation (not to mention feedback in the real world via Web
sites and the like) is very, very good.[61] It has also been tested to be a fast, stable and true multi-user, multi-threaded
sql database server.[62]

3.4. HISTORY

3.3.1

29

Related projects

Drizzle a fork targeted at the web-infrastructure and cloud computing markets. The developers of the product
describe it as a smaller, slimmer and (hopefully) faster version of MySQL. As a result, many common
MySQL features will be stripped out, including stored procedures, query cache, prepared statements, views,
and triggers. This is a partial rewrite of the server that does not maintain compatibility with MySQL. However,
Drizzle made no new releases since May 2012.[63]
MariaDB a community-developed fork of the MySQL database source code.[64] The intent also being to
maintain high delity with MySQL, ensuring a drop-in replacement capability with library binary equivalency
and exact matching with MySQL APIs and commands. It includes the XtraDB storage engine as a replacement
for InnoDB.
Percona Server a fork of MySQL that includes the XtraDB storage engine. Its policy is to deviate as little
as possible from MySQL and remain fully compatible, while providing new features, better performance, and
additional instrumentation for analysis of performance and usage.[65][66]
WebScaleSQL A branch of MySQL 5.6 maintained by Facebook, LinkedIn, Google and Twitter.[67]

3.4 History
MySQL was created by a Swedish company, MySQL AB, founded by David Axmark, Allan Larsson and Michael
Monty Widenius. The rst version of MySQL appeared on 23 May 1995. It was initially created for personal
usage from mSQL based on the low-level language ISAM, which the creators considered too slow and inexible.
They created a new SQL interface, while keeping the same API as mSQL. By keeping the API consistent with the
mSQL system, many developers were able to use MySQL instead of the (proprietarily licensed) mSQL antecedent.

3.4.1

Legal and acquisition impacts

On 15 June 2001, NuSphere sued MySQL AB, TcX DataKonsult AB and its original authors Michael (Monty)
Widenius and David Axmark in U.S District Court in Boston for breach of contract, tortious interference with third
party contracts and relationships and unfair competition.[68][69]
In 2002, MySQL AB sued Progress NuSphere for copyright and trademark infringement in United States district
court. NuSphere had allegedly violated MySQLs copyright by linking MySQLs GPL'ed code with NuSphere Gemini
table without being in compliance with the license.[70] After a preliminary hearing before Judge Patti Saris on 27
February 2002, the parties entered settlement talks and eventually settled.[71] After the hearing, FSF commented that
Judge Saris made clear that she sees the GNU GPL to be an enforceable and binding license.[72]
In October 2005, Oracle Corporation acquired Innobase OY, the Finnish company that developed the third-party
InnoDB storage engine that allows MySQL to provide such functionality as transactions and foreign keys. After
the acquisition, an Oracle press release mentioned that the contracts that make the companys software available to
MySQL AB would be due for renewal (and presumably renegotiation) some time in 2006.[73] During the MySQL
Users Conference in April 2006, MySQL issued a press release that conrmed that MySQL and Innobase OY agreed
to a multi-year extension of their licensing agreement.[74]
In February 2006, Oracle Corporation acquired Sleepycat Software,[75] makers of the Berkeley DB, a database engine
providing the basis for another MySQL storage engine. This had little eect, as Berkeley DB was not widely used, and
was dropped (due to lack of use) in MySQL 5.1.12, a pre-GA release of MySQL 5.1 released in October 2006.[76]
In January 2008, Sun Microsystems bought MySQL for $1 billion.[77]
In April 2009, Oracle Corporation entered into an agreement to purchase Sun Microsystems,[78] then owners of
MySQL copyright and trademark. Suns board of directors unanimously approved the deal, it was also approved by
Suns shareholders, and by the U.S. government on 20 August 2009.[79] On 14 December 2009, Oracle pledged to
continue to enhance MySQL[80] as it had done for the previous four years.
A movement against Oracles acquisition of MySQL, to Save MySQL[81] from Oracle was started by one of the
MySQL founders, Monty Widenius. The petition of 50,000+ developers and users called upon the European Commission to block approval of the acquisition. At the same time, several Free Software opinion leaders (including
Eben Moglen, Pamela Jones of Groklaw, Jan Wildeboer and Carlo Piana, who also acted as co-counsel in the merger

30

CHAPTER 3. MYSQL

regulation procedure) advocated for the unconditional approval of the merger. As part of the negotiations with
the European Commission, Oracle committed that MySQL server will continue until at least 2015 to use the duallicensing strategy long used by MySQL AB, with proprietary and GPL versions available. The antitrust of the EU
had been pressuring it to divest MySQL as a condition for approval of the merger. But, as revealed by WikiLeaks,
the US Department of Justice and Antitrust, at the request of Oracle, pressured the EU to unconditionally approve
the merger.[82] The European Commission eventually unconditionally approved Oracles acquisition of MySQL on
21 January 2010.[83]
In January 2009, prior to Oracles acquisition of MySQL, Monty Widenius started a GPL-only fork, MariaDB.
MariaDB is based on the same code base as MySQL server 5.1 and strives to maintain compatibility with Oracleprovided versions.[84]

3.4.2

Milestones

Notable milestones in MySQL development include:


Original development of MySQL by Michael Widenius and David Axmark beginning in 1994[85]
First internal release on 23 May 1995
Version 3.19: End of 1996, from www.tcx.se
Version 3.20: January 1997
Windows version was released on 8 January 1998 for Windows 95 and NT
Version 3.21: production release 1998, from www.mysql.com
Version 3.22: alpha, beta from 1998
Version 3.23: beta from June 2000, production release 22 January 2001[86]
Version 4.0: beta from August 2002, production release March 2003 (unions)
Version 4.01: beta from August 2003, Jyoti adopts MySQL for database tracking
Version 4.1: beta from June 2004, production release October 2004 (R-trees and B-trees, subqueries, prepared
statements)
Version 5.0: beta from March 2005, production release October 2005 (cursors, stored procedures, triggers,
views, XA transactions)
The developer of the Federated Storage Engine states that The Federated Storage Engine is a proof-ofconcept storage engine,[87] but the main distributions of MySQL version 5.0 included it and turned it
on by default. Documentation of some of the short-comings appears in MySQL Federated Tables: The
Missing Manual.[88]
Sun Microsystems acquired MySQL AB in 2008.[89]
Version 5.1: production release 27 November 2008 (event scheduler, partitioning, plugin API, row-based
replication, server log tables)
Version 5.1 contained 20 known crashing and wrong result bugs in addition to the 35 present in version
5.0 (almost all xed as of release 5.1.51).[90]
MySQL 5.1 and 6.0-alpha showed poor performance when used for data warehousing partly due to its
inability to utilize multiple CPU cores for processing a single query.[91]
Oracle acquired Sun Microsystems on 27 January 2010.[92]
The day Oracle announced the purchase of Sun, Michael Monty Widenius forked MySQL, launching MariaDB, and took a swath of MySQL developers with him.[93]

3.5. SEE ALSO

31

MySQL Server 5.5 was generally available (as of December 2010). Enhancements and features include:
The default storage engine is InnoDB, which supports transactions and referential integrity constraints.
Improved InnoDB I/O subsystem[94]
Improved SMP support[95]
Semisynchronous replication.
SIGNAL and RESIGNAL statement in compliance with the SQL standard.
Support for supplementary Unicode character sets utf16, utf32, and utf8mb4.
New options for user-dened partitioning.
MySQL Server 6.0.11-alpha was announced[96] on 22 May 2009 as the last release of the 6.0 line. Future
MySQL Server development uses a New Release Model. Features developed for 6.0 are being incorporated
into future releases.
MySQL 5.6 general availability was announced in February 2013. New features included performance improvements to the query optimizer, higher transactional throughput in InnoDB, new NoSQL-style memcached
APIs, improvements to partitioning for querying and managing very large tables, TIMESTAMP column type
that correctly stores milliseconds, improvements to replication, and better performance monitoring by expanding the data available through the PERFORMANCE_SCHEMA.[97] The InnoDB storage engine also included
support for full text search and improved group commit performance.
MySQL 5.7 Development Milestone 3 was released December 2013.[98]

3.4.3

Versions

The following chart provides an overview of various MySQL versions and their current development statuses:[99][100][101][102][103][104][105][1

3.5 See also


Comparison of database tools
Comparison of MySQL database engines
Comparison of relational database management systems

3.6 Notes
[1] Following SQLite, which is deployed with every Android and iPhone device along with the Chrome and Firefox browsers.[7]
In the second quarter of 2013 alone, 213 million smartphones shipped, of which 200 million were Android and iOS.[8]
[2] Initially, it was a MyISAM-only feature; supported by InnoDB since the release of MySQL 5.6.
[3] Prior to MySQL 5.5.3, UTF-8 and UCS-2 encoded strings are limited to the BMP; MySQL 5.5.3 and later use utf8mb4
for full unicode support.
[4] In MySQL 5.0, storage engines must be compiled in; since MySQL 5.1, storage engines can be dynamically loaded at run
time.

3.7 References
[1] Changes in MySQL 5.6.24. MySQL 5.6 Reference Manual. Oracle. 6 April 2015. Retrieved 6 April 2015.
[2] Changes in Release 5.7.5 (Development)". MySQL 5.7 Reference Manual. Oracle Corporation. 25 September 2014.
Retrieved 29 September 2014.
[3] MySQL: Project Summary. Ohloh. Black Duck Software. Retrieved 17 September 2012.

32

CHAPTER 3. MYSQL

[4] Supported Platforms: MySQL Database. Oracle. Retrieved 24 March 2014.


[5] Downloads. MySQL. Retrieved 2014-08-03.
[6] What is MySQL?". MySQL 5.1 Reference Manual. Oracle. Retrieved 17 September 2012. The ocial way to pronounce
MySQL is My Ess Que Ell (not my sequel)
[7] Well-Known Users of SQLite. The SQLite Consortium. Retrieved 8 October 2013. Apple uses SQLite for many
functions within Mac OS X, including Apple Mail, Safari, and in Aperture. Apple uses SQLite in the iPhone and in the
iPod touch and in iTunes software. .... SQLite is the primary meta-data storage format for the Firefox Web Browser and
the Thunderbird Email Reader from Mozilla. .... It is known that Google uses SQLite in their Desktop for Mac, in Google
Gears, in the Android cell-phone operating system, and in the Google Chrome Web Browser.
[8] Koetsier, John (1 August 2013). Android reaches massive 80% market share, Windows Phone hits global high, iPhone
languishes. MobileBeat. VentureBeat. Retrieved 8 October 2013. Global smartphone shipments grew 47 percent to
hit 230 million devices in the second quarter of 2013, according to a new report from research rm Strategy Analytics.
Android captured record market share of 80 percent, while iOS hit a new low of 14 percent.
[9] DB-Engines Ranking. Retrieved 12 Feb 2015.
[10] MySQL | The Worlds Most Popular Open-Source Database.
[11] History of MySQL. MySQL 5.1 Reference Manual. MySQL AB. Retrieved 26 August 2011.
[12] Sun Microsystems Announces Completion of MySQL Acquisition; Paves Way for Secure, Open Source Platform to Power
the Network Economy (Press release). Sun Microsystems. 26 February 2008. Archived from the original on 28 February
2008. Retrieved 17 September 2012.
[13] Urlocker, M. Zack (13 December 2005). Google Runs MySQL. The Open Force. M. Zack Urlocker. Retrieved 3 August
2010. AdWords was built using the MySQL database
[14] Claburn, Thomas (24 April 2007). Google Releases Improved MySQL Code. InformationWeek (InformationWeek).
Retrieved 30 November 2008.
[15] Callaghan, Mark (13 April 2010). MySQL at Facebook. YouTube (Google). Retrieved 3 August 2010. x,000 servers, ...
Master-slave replication, InnoDB
[16] Sobel, Jason (21 December 2007). Keeping Up. The Facebook Blog. Facebook. Retrieved 30 October 2008.
[17] Malik, Om (25 April 2008). Facebooks Insatiable Hunger for Hardware. GigaOM. GigaOmniMedia. Retrieved 30
October 2008.
[18] Cole, Jeremy (14 April 2011). Big and Small Data at @Twitter. YouTube (Google). Retrieved 20 October 2011.
[19] MySQL Customer: Flickr. MySQL Customers. Oracle. Retrieved 17 September 2012.
[20] MySQL Customer: YouTube. MySQL Customers. Oracle. Retrieved 17 September 2012.
[21] mysql The MySQL Command-Line Tool, MySQL Reference Manual
[22] mysqladmin the MySQL command-line tool, MySQL Reference Manual
[23] MySQL Client Programs, MySQL Reference Manual
[24] MySQL Tools Family, SQLMaestro Group
[25] MySQL GUI Tools, WebYog
[26] HeidiSQL, HeidiSQL MySQL GUI
[27] MySQL Workbench, MySQL Downloads
[28] HeidiSQL Grid editing features.
[29] LibreOce Base. Retrieved 5 January 2012.
[30] Download Statistics: phpMyAdmin.
[31] Home. Percona Toolkit for MySQL. Percona. Retrieved 26 March 2014.
[32] MySQL for OpenVMS. vmsmysql.org. 2011-03-30. Retrieved 2014-01-16.

3.7. REFERENCES

33

[33] MySQL Internals Manual. Dev.mysql.com. 4 March 2009. Retrieved 8 June 2009.
[34] Which Should I Use: MySQL Enterprise or MySQL Community Server?". MySQL AB. Retrieved 8 April 2009.
[35] Guy Harrison; Steven Feuerstein (2008). MySQL Stored Procedure Programming. O'Reilly Media. p. 49. ISBN 978-0596-10089-6.
[36] MySQL :: InnoDB 1.1 for MySQL 5.5 Users Guide :: C InnoDB Glossary :: ACID. Retrieved 5 January 2011.
[37] Replication. MySQL.
[38] MySQL Cluster Replication: Multi-Master and Circular Replication. MySQL.
[39] MySQL University: MySQL Galera Multi-Master Replication. Oracle Corporation. 2010-02-09.
[40] dev.mysql.com. dev.mysql.com. Retrieved 11 April 2015.
[41] bugs.mysql.com. bugs.mysql.com. 14 April 2004. Retrieved 11 April 2015.
[42] dev.mysql.com. dev.mysql.com. Retrieved 11 April 2015.
[43] MySQL Innodb ZFS Best Practices.. Blogs.oracle.com. 2009-05-26. Retrieved 2015-04-11.
[44] 11 September 2012 (2012-09-11). Intel SSD 910 vs HDD RAID in tpcc-mysql benchmark.. Mysqlperformanceblog.com. Retrieved 2015-04-11.
[45] Matsunobu, Yoshinori. (15 April 2010). SSD Deployment Strategies for MySQL.. Sun Microsystems. Retrieved 201504-11.
[46] aj_blk: Year 2038 Bug. Ajoeblk.blogspot.in. 2012-08-31. Retrieved 2015-04-11.
[47] The future of replication in MySQL. Facebook. Retrieved 9 December 2009.
[48] Database Sharding. Code Futures. Retrieved 9 December 2009.
[49] XtraBackup. Percona. Retrieved 19 January 2013.
[50] Mats Kindahl (2013-09-21). A Brief Introduction to MySQL Fabric. mysqlmusings.blogspot.com. Retrieved 2013-1212.
[51] Mats Kindahl (2014-05-27). MySQL Fabric: Musings on Release 1.4.3. mysqlmusings.blogspot.com. Retrieved 201406-18.
[52] Running MySQL on Amazon EC2 with EBS (Elastic Block Store)". Amazon Web Services. Retrieved 5 February 2013.
[53] Finley, Klint. 7 Cloud-Based Database Services. ReadWriteWeb. Retrieved 9 November 2011.
[54] MySQL Server Support at Rackspace. Rackspace.com. Retrieved 10 November 2011.
[55] Managed Hosting Terremark. Terremark.com.
[56] Oracle :: MySQL Open Source License. Mysql.com. Retrieved 8 June 2009.
[57] MySQL GOES GPL. Archived from the original on 12 August 2001.
[58] Oracle :: FLOSS License Exception. Mysql.com. Retrieved 8 June 2009.
[59] Oracle :: MySQL Commercial License. Mysql.com. Retrieved 8 June 2009.
[60] MySQL Support Manual, MySQL Developers
[61] Review of MySQL Server 5.0, Techworld.com, November 2005
[62] MySQL Server Review, LinuxMint.com
[63] Series 7.1 : Drizzle. Launchpad.net. Retrieved 2014-08-03.
[64] What is the goal of MariaDB? - MariaDB Knowledge Base. Mariadb.com. Retrieved 2014-08-03.
[65] Morgan Tocker (2009-08-13). XtraDB: The Top 10 enhancements. mysqlperformanceblog.com. Retrieved 2013-12-16.
[66] Vadim Tkachenko (2010-12-21). MySQL 5.5.8 and Percona Server on Fast Flash card (Virident tachIOn)". mysqlperformanceblog.com. Retrieved 2013-12-16.

34

CHAPTER 3. MYSQL

[67] We're Gonna Need A Bigger Database. WebScaleSQL. Retrieved 2014-08-03.


[68] Basil, Tom (4 September 2001). Eyewitness account: Monty Widenius, International Fugitive"". MySQL Life (Mailing
list). Retrieved 16 September 2012.
[69] FAQ on MySQL vs. NuSphere Dispute. MySQL AB. 13 July 2001. Archived from the original on 17 July 2001.
Retrieved 16 September 2012.
[70] Adavit of Eben Moglen on Progress Software vs. MySQL AB Preliminary Injunction Hearing. Archived from the
original on 2005-02-07.
[71] Progress Software Corporation v. MySQL AB, 195 F. Supp. 2d 328 (D. Mass. 2002).
[72] Judge Saris defers GNU GPL Questions for Trial in MySQL vs. Progress Software (Press release). Free Software
Foundation. 1 March 2002. Retrieved 16 September 2012.
[73] Oracle Announces the Acquisition of Open Source Software Company, Innobase (Press release). Oracle. 7 October
2005. Archived from the original on 20 July 2011. Retrieved 16 September 2012.
[74] MySQL to Promote New Open Source DB Engines from its Partners and Dev Community (Press release). MySQL AB.
26 April 2006. Archived from the original on 23 June 2011. Retrieved 16 September 2012.
[75] Babcock, Charles (14 February 2006). Oracle Buys Sleepycat, Is JBoss Next?". InformationWeek. CPM Media. Retrieved
16 September 2012.
[76] Changes in MySQL 5.1.12. MySQL 5.1 Reference Manual. MySQL AB. 24 October 2006. Retrieved 16 September
2012.
[77] Sun Microsystems Announces Agreement to Acquire MySQL, Developer of the Worlds Most Popular Open Source
Database (Press release). MySQL AB. 16 January 2008. Archived from the original on 18 July 2011. Retrieved 16
September 2012.
[78] Oracle to Buy Sun (Press release). Sun Microsystems. 20 April 2009. Archived from the original on 22 April 2009.
Retrieved 16 September 2012.
[79] Thomasch, Paul; Finkle, Jim (20 August 2009). Oracle wins U.S. approval to buy Sun Microsystems. Reuters. Retrieved
16 September 2012.
[80] Whitney, Lance (14 December 2009). Oracle pledges to play well with MySQL. CNET. CBS Interactive. Retrieved 16
September 2012.
[81] Michael, Widenius (12 December 2009). Help saving MySQL. Monty Says. Google. Retrieved 16 September 2012.
[82] Kanaracus, Chris (30 August 2011). Wikileaks Cable Oers New Insights Into Oracle-Sun Deal. PC World. IDG.
Retrieved 16 September 2012.
[83] Mergers: Commission clears Oracles proposed acquisition of Sun Microsystems (Press release). European Union. 21
January 2010. Retrieved 16 September 2012.
[84] MariaDB versus MySQL Compatibility. AskMonty Knowledgebase. Monty Program. 30 July 2010. Retrieved 16
September 2012.
[85] Five Questions With Michael Widenius Founder And Original Developer of MySQL. www.opensourcereleasefeed.
com. Archived from the original on 2009-03-13. Retrieved 13 October 2012.
[86] MySQL 3.23 Declared Stable. Archived from the original on 15 August 2001.
[87] Capttofu: FederatedX Pluggable Storage Engine Released!". Capttofu.livejournal.com. Retrieved 3 April 2009.
[88] Oreillynet.com. Oreillynet.com. 9 October 2008. Retrieved 1 February 2012.
[89] Sun Picks Up MySQL For $1 Billion; Open Source Is A Legitimate Business Model. Retrieved 13 October 2012.
[90] Archives Oops, we did it again (MySQL 5.1 released as GA with crashing bugs)". Planet MySQL. 29 November 2008.
Retrieved 5 February 2013.
[91] TPC-H Run on MySQL 5.1 and 6.0 | MySQL Performance Blog. MySQL Performance Blog. Retrieved 8 June 2009.
[92] Oracle.com. Oracle.com. 7 September 2010. Retrieved 1 February 2012.
[93] ComputerWorld.com. ComputerWorld.com. 28 March 2013. Retrieved 30 January 2015.

3.8. EXTERNAL LINKS

[94] dev.mysql.com. dev.mysql.com. Retrieved 1 February 2012.


[95] dev.mysql.com. dev.mysql.com. Retrieved 1 February 2012.
[96] MySQL Lists: packagers: MySQL 6.0.11 Alpha has been released!". Lists.mysql.com. Retrieved 1 February 2012.
[97] Whats New in MySQL 5.6. MySQL Developer Zone. Retrieved 21 April 2011.
[98] The MySQL 5.7.3 Milestone Release was available. MySQL Server Team. Retrieved 13 March 2014.
[99] B.3. Changes in Release 3.23.x (Lifecycle Support Ended)". Oracle. Retrieved 24 August 2010.
[100] B.2. Changes in Release 4.0.x (Lifecycle Support Ended)". Oracle. Retrieved 24 August 2010.
[101] B.1. Changes in Release 4.1.x (Lifecycle Support Ended)". Oracle. Retrieved 24 August 2010.
[102] C.1. Changes in Release 5.0.x (Lifecycle Support Ended)". Oracle. Retrieved 24 August 2010.
[103] MySQL 5.1 Release Notes. Oracle. Retrieved 29 January 2014.
[104] MySQL 5.5 Release Notes. Oracle. Retrieved 29 January 2014.
[105] MySQL 5.6 Release Notes. Oracle. Retrieved 29 January 2014.
[106] MySQL 5.7 Release Notes. Oracle. Retrieved 13 March 2014.

3.8 External links


Ocial website
MySQL site at Oracle.com
Interview with David Axmark, MySQL co-founder Video
MySQL at DMOZ

35

Chapter 4

SQLite
SQLite (/skjullat/[3] or /sikwl.lat/[4] ) is a relational database management system contained in a C programming library. In contrast to many other database management systems, SQLite is not a clientserver database engine.
Rather, it is embedded into the end program.
SQLite is ACID-compliant and implements most of the SQL standard, using a dynamically and weakly typed SQL
syntax that does not guarantee the domain integrity.[5]
SQLite is a popular choice as embedded database software for local/client storage in application software such as web
browsers. It is arguably the most widely deployed database engine, as it is used today by several widespread browsers,
operating systems, and embedded systems, among others.[6] SQLite has bindings to many programming languages.
The source code for SQLite is in the public domain.[2][7]

4.1 Design
Unlike clientserver database management systems, the SQLite engine has no standalone processes with which the
application program communicates. Instead, the SQLite library is linked in and thus becomes an integral part of the
application program. (In this, SQLite follows the precedent of Informix SE of c. 1984[8] ) The library can also be
called dynamically. The application program uses SQLites functionality through simple function calls, which reduce
latency in database access: function calls within a single process are more ecient than inter-process communication.
SQLite stores the entire database (denitions, tables, indices, and the data itself) as a single cross-platform le on
a host machine. It implements this simple design by locking the entire database le during writing. SQLite read
operations can be multitasked, though writes can only be performed sequentially.
SQLite uses PostgreSQL as a reference platform. What would PostgreSQL do is used to make sense of the SQL
standard.[9][10][11] One major deviation is that, with the exception of primary keys, SQLite does not enforce type
checking; the type of a value is dynamic and not strictly constrained by the schema (although the schema will trigger
a conversion when storing, if such a conversion is potentially reversible).

4.2 History
D. Richard Hipp designed SQLite in the spring of 2000 while working for General Dynamics on contract with the
United States Navy.[12] Hipp was designing software used aboard guided missile destroyers, which were originally
based on HP-UX with an IBM Informix database back-end. The design goals of SQLite were to allow the program to
be operated without installing a database management system or requiring a database administrator. Hipp based the
syntax and semantics on PostgreSQL 6.5 documentation. In August 2000, version 1.0 of SQLite was released, with
storage based on gdbm (GNU Database Manager). SQLite 2.0 replaced gdbm with a custom B-tree implementation,
adding transaction capability. SQLite 3.0, partially funded by America Online, added internationalization, manifest
typing, and other major improvements.
In 2011 Hipp announced his plans to add an UnQL interface to SQLite databases and to develop UnQLite, an embeddable document-oriented database.[13]
36

4.3. FEATURES

37

4.3 Features
SQLite implements most of the SQL-92 standard for SQL but it lacks some features. For example it partially provides
triggers, and it can't write to views (however it provides INSTEAD OF triggers that provide this functionality). While
it provides complex queries, it still has limited ALTER TABLE function, as it can't modify or delete columns.[14]
SQLite uses an unusual type system for an SQL-compatible DBMS; instead of assigning a type to a column as in most
SQL database systems, types are assigned to individual values; in language terms it is dynamically typed. Moreover,
it is weakly typed in some of the same ways that Perl is: one can insert a string into an integer column (although
SQLite will try to convert the string to an integer rst, if the columns preferred type is integer). This adds exibility
to columns, especially when bound to a dynamically typed scripting language. However, the technique is not portable
to other SQL products. A common criticism is that SQLites type system lacks the data integrity mechanism provided
by statically typed columns in other products. The SQLite web site describes a strict anity mode, but this feature
has not yet been added.[15] However, it can be implemented with constraints like CHECK(typeof(x)='integer').[12]
Several computer processes or threads may access the same database concurrently. Several read accesses can be
satised in parallel. A write access can only be satised if no other accesses are currently being serviced. Otherwise,
the write access fails with an error code (or can automatically be retried until a congurable timeout expires). This
concurrent access situation would change when dealing with temporary tables. This restriction is relaxed in version
3.7 when write-ahead logging (WAL) is turned on enabling concurrent reads and writes.[16]
As of version 3.8.2 it is possible to create tables without rowid.[17]
SQLite full Unicode function is optional.[18]

4.4 Development and distribution


SQLite development stores revisions of its source code in Fossil, a distributed version control system that is itself
built upon an SQLite database.[19]
A standalone command-line program is provided in SQLites distribution that can be used to create a database, dene
tables within it, insert and change rows, run queries and manage an SQLite database le. This program is a single
executable le on the host machine. It also serves as an example for writing applications that use the SQLite library.
SQLite has automated regression testing prior to each release.[20] Over 2 million tests are run as part of a releases
verication. Starting with the August 10, 2009 release of SQLite 3.6.17, SQLite releases have 100% branch test
coverage, one of the components of code coverage. The tests and test harnesses are proprietary.

4.5 Adoption
4.5.1

Programming languages

SQLite has bindings for a large number of programming languages, including:


BASIC
Delphi
C
C#
C++
Clipper//Harbour
Common Lisp
Curl
D

38

CHAPTER 4. SQLITE
Delphi
Free Pascal
Go
Haskell
Haxe
Java (on JVM and DVM)
JavaScript[21]
Julia
Livecode
Lua
newLisp
Objective-C (on OS X and iOS)
OCaml
Perl[22]
PHP
Pike
PureBasic
Python[23]
R
REALbasic
REBOL
Ruby[24]
Scheme
Smalltalk
Swift (on OS X and iOS)
Tcl
Visual Basic
Xojo
AutoIt [25]

4.5.2

Middleware

ADO.NET adapter, initially developed by Robert Simpson, is maintained jointly with the SQLite developers
since April 2010.[26]
ODBC driver has been developed and is maintained separately by Christian Werner.[27] Werners ODBC driver
is the recommended connection method for accessing SQLite from OpenOce.org.[28]
COM (ActiveX) wrapper making SQLite accessible on Windows to scripted languages such as JScript and
VBScript. This adds database capabilities to HTML Applications (HTA).[29]
XULRunner uses SQLite

4.5. ADOPTION

4.5.3

39

Web browsers

The browsers Google Chrome, Opera, Safari and the Android Browser all allow for storing information in, and
retrieving it from, a SQLite database within the browser, using the Web SQL Database technology, although
this is rapidly becoming deprecated (namely superseded by IndexedDB).
Mozilla Firefox and Mozilla Thunderbird store a variety of conguration data (bookmarks, cookies, contacts
etc.) in internally managed SQLite databases, and even oer an add-on to manage SQLite databases.

4.5.4

Web application frameworks

Bugzilla, Mozillas bug database written in Perl can use SQLite to store data and settings.
Django, a Python web framework, works with SQLite3 by default.[30]
As of version 7, Drupal, a PHP-based content management system for making websites and blogs, has an
option to install using SQLite.[31]
Ruby on Rails' default database management system is also SQLite.
web2py, a Python web framework, default database management system is also SQLite.

4.5.5

Various

Skype is a widely deployed application that uses SQLite.[32]


Adobe Systems uses SQLite as its le format in Adobe Photoshop Lightroom, a standard database in Adobe
AIR, and internally within Adobe Reader.[33]
The Service Management Facility, used for service management within the Solaris and OpenSolaris operating
systems, uses SQLite internally.
Flame, a malware program used for cyberespionage, used SQLite to store the data it collects.
The Xojo Programming Language has SQLite capability built in to both the desktop and web frameworks.

4.5.6

Operating systems

SQLite is included by default in:


Blackberrys BlackBerry 10 OS
Microsofts Windows Phone 8
Symbian OS
Nokias Maemo
Googles Android
Linux Foundations MeeGo
LGs webOS[34]
NetBSD
OpenBSD
FreeBSD where starting with 10-RELEASE version it is used by the core package management system.
illumos
Oracle Solaris 10 where the Service Management Facility database is serialized for booting.

40

CHAPTER 4. SQLITE
Apple[35] adopted it as an option in OS X's Core Data API from the original implementation in Mac OS X
10.4 onwards, and also for administration of videos and songs, and in iOS for storage of text messages on the
iPhone.
Tizen

4.6 Ports
SQLite was ported to JavaScript, in an implementation named sql.js. It was done by passing the SQLite source code
through the Emscripten compiler.()

4.7 See also


SpatiaLite
Comparison of relational database management systems
List of relational database management systems
Flat le database
SQL Server Compact
H2 (DBMS)
Berkeley DB

4.8 Citations
[1] Recent SQLite News. 2015-04-08. Retrieved 2015-04-09.
[2] SQLite Copyright. sqlite.org. Retrieved May 17, 2010.
[3] D. Richard Hipp (presenter) (May 31, 2006). An Introduction to SQLite (VIDEO). Google Inc. Event occurs at 00:01:14.
Retrieved March 23, 2010. [...] ess-kju-ellite [...]
[4] D. Richard Hipp (presenter) (May 31, 2006). An Introduction to SQLite. Google Inc. Event occurs at 00:48:15. Retrieved
March 23, 2010. [...] sequelite [...]
[5] Owens, Michael (2006). Chapter 4: SQL. In Gilmore, Jason; Thomas, Keir. The Denitive Guide to SQLite. D. Richard
Hipp (foreword), Preston Hagar (technical reviewer). Apress. p. 133. ISBN 978-1-59059-673-9. Retrieved 30 December
2014.
[6] Most Widely Deployed SQL Database Estimates. Sqlite.org. Retrieved May 11, 2011.
[7] The source code for SQLite is in the public domain. Sqlite.org. Retrieved May 11, 2011.
[8] http://www.iiug.org/faqs/informix-faq/ifaq01.htm.1#1.2
[9] https://lwn.net/Articles/601144/
[10] http://use-the-index-luke.com/blog/2014-05/what-i-learned-about-sqlite-at-a-postgresql-conference
[11] https://www.pgcon.org/2014/schedule/events/736.en.html
[12] Owens, Michael (2006). The Denitive Guide to SQLite. Apress. doi:10.1007/978-1-4302-0172-4_1. ISBN 978-1-59059673-9.
[13] Interview: Richard Hipp on UnQL, a New Query Language for Document Databases. InfoQ. August 4, 2011. Retrieved
October 5, 2011.
[14] SQL Features That SQLite Does Not Implement. SQLite. January 1, 2009. Retrieved October 14, 2009.

4.9. REFERENCES

41

[15] Frequently Asked Questions. SQLite. January 26, 2009. Retrieved February 7, 2009.
[16] Write Ahead Logging in SQLite 3.7. SQLite. Retrieved September 3, 2011. WAL provides more concurrency as readers
do not block writers and a writer does not block readers. Reading and writing can proceed concurrently
[17] ReleaseLog SQLite.org, visited 8th December 2013
[18] Case-insensitive matching of Unicode characters does not work. SQLite Frequently Asked Questions. Sqlite.org. Retrieved
May 11, 2011.
[19] Fossil: Fossil Performance. Fossil-scm.org. August 23, 2009. Retrieved September 12, 2009.
[20] How SQLite Is Tested. SQLite. Retrieved September 12, 2009.
[21] JSPDO JavaScript database access abstraction API
[22] DBD::SQLite: Perl DBI Interface to SQLite
[23] PySQLite: Python bindings for SQLite
[24] SQLite/Ruby: Ruby bindings for SQLite
[25] : SQLite user dened functions Reference
[26] http://system.data.sqlite.org/index.html/doc/trunk/www/index.wiki
[27] http://www.ch-werner.de/sqliteodbc/
[28] http://documentation.openoffice.org/HOW_TO/data_source/SQLite.pdf
[29] sqlite Sqlite Wrappers. SQLite. February 7, 2009. Retrieved February 7, 2009.
[30] Databases. Django Documentation. Django Software Foundation. Retrieved 13 November 2012.
[31] Drupal 7.
[32] Skype client using SQLite?". Mail-archive.com. August 28, 2007. Retrieved June 14, 2010.
[33] Well-Known Users of SQLite. Sqlite.org. Retrieved June 14, 2010.
[34] Well-known Users of SQLite. Sqlite.org. Retrieved June 14, 2010.
[35] Show Download History List of All Files Ever Downloaded Within Mac OS X.

4.9 References
Allen, Grant; Owens, Mike (November 5, 2010). The Denitive Guide to SQLite (2nd ed.). Apress. p. 368.
ISBN 1-4302-3225-0.
Kreibich, Jay A. (August 17, 2010). Using SQLite (1st ed.). O'Reilly Media. p. 528. ISBN 0-596-52118-9.
van der Lans, Rick F. (September 7, 2009). The SQL Guide to SQLite (1st ed.). lulu.com. p. 542. ISBN
0-557-07676-5.
Newman, Chris (November 9, 2004). SQLite (Developers Library) (1st ed.). Sams. p. 336. ISBN 0-67232685-X.

4.10 External links


Ocial website
SQLite at DMOZ
An Introduction to SQLite on YouTube

Chapter 5

PostgreSQL
PostgreSQL, often simply Postgres, is an object-relational database management system (ORDBMS) with an
emphasis on extensibility and standards-compliance. As a database server, its primary function is to store data securely, supporting best practices, and to allow for retrieval at the request of other software applications. It can handle
workloads ranging from small single-machine applications to large Internet-facing applications with many concurrent
users. Recent versions also provide replication of the database itself for availability and scalability.
PostgreSQL implements the majority of the SQL:2011 standard,[8][9] is ACID-compliant and transactional (including
most DDL statements) avoiding locking issues using multiversion concurrency control (MVCC), provides immunity
to dirty reads and full serializability; handles complex SQL queries using many indexing methods that are not available
in other databases; has updateable views and materialized views, triggers, foreign keys; supports functions and stored
procedures, and other expandability,[10] and has a large number of extensions written by third parties. In addition
to the possibility of working with the major proprietary and open source databases, PostgreSQL supports migration
from them, by its extensive standard SQL support and available migration tools. And if proprietary extensions had
been used, by its extensibility that can emulate many through some built-in and third-party open source compatibility
extensions, such as for Oracle.
PostgreSQL is cross-platform and runs on many operating systems including Linux, FreeBSD, Solaris, and Microsoft
Windows. Mac OS X, starting with OS X 10.7 Lion, has the server as its standard default database in the server
edition,[11][12] and PostgreSQL client tools in the desktop edition. The vast majority of Linux distributions have it
available in supplied packages.
PostgreSQL is developed by the PostgreSQL Global Development Group, a diverse group of many companies and
individual contributors.[13] It is free and open source software, released under the terms of the PostgreSQL License,
a permissive free software license.

5.1 Name
PostgreSQLs developers pronounce it /postrskjul/.[14] It is abbreviated as Postgres, its original name. Because
of ubiquitous support for the SQL Standard among most relational databases, the community considered changing the
name back to Postgres. However, the PostgreSQL Core Team announced in 2007 that the product would continue to
use the name PostgreSQL.[15] The name refers to the projects origins as a post-Ingres" database, being a development
from University Ingres DBMS (Ingres being an acronym for INteractive Graphics Retrieval System).[16][17]

5.2 History
PostgreSQL evolved from the Ingres project at the University of California, Berkeley. In 1982 the leader of the Ingres team, Michael Stonebraker, left Berkeley to make a proprietary version of Ingres.[16] He returned to Berkeley in
1985 and started a post-Ingres project to address the problems with contemporary database systems that had become
increasingly clear during the early 1980s. The new project, POSTGRES, aimed to add the fewest features needed to
completely support types.[18] These features included the ability to dene types and to fully describe relationships
something used widely before but maintained entirely by the user. In Postgres, the database understood relation42

5.3. MULTIVERSION CONCURRENCY CONTROL (MVCC)

43

ships, and could retrieve information in related tables in a natural way using rules. Postgres used many of the ideas
of Ingres, but not its code.[19]
Starting in 1986, the POSTGRES team published a number of papers describing the basis of the system, and by
1987 had a prototype version shown at the 1988 ACM SIGMOD Conference. The team released version 1 to a
small number of users in June 1989, then version 2 with a re-written rules system in June 1990. Version 3, released
in 1991, again re-wrote the rules system, and added support for multiple storage managers and an improved query
engine. By 1993 the great number of users began to overwhelm the project with requests for support and features.
After releasing version 4.2 on June 30, 1994[20] primarily a cleanup the project ended. Berkeley had released
POSTGRES under an MIT-style license, which enabled other developers to use the code for any use. At the time,
POSTGRES used an Ingres-inuenced POSTQUEL query language interpreter, which could be interactively used
with a console application named monitor.
In 1994, Berkeley graduate students Andrew Yu and Jolly Chen replaced the POSTQUEL query language interpreter
with one for the SQL query language, creating Postgres95. The front-end program monitor was also replaced by psql.
Yu and Chen released the code on the web.
On July 8, 1996, Marc Fournier at Hub.org Networking Services provided the rst non-university development server
for the open-source development eort.[1] With the participation of Bruce Momjian and Vadim B. Mikheev, work
began to stabilize the code inherited from Berkeley. The rst open-source version was released on August 1, 1996.
In 1996 the project was renamed to PostgreSQL to reect its support for SQL. The online presence at the website
PostgreSQL.org began on October 22, 1996.[21] The rst PostgreSQL release formed version 6.0 on January 29, 1997.
Since then a group of developers and volunteers around the world have maintained the software as The PostgreSQL
Global Development Group.
The PostgreSQL project continues to make major releases (approximately annually) and minor bugx releases,
all available under its free and open-source software PostgreSQL License. Code comes from contributions from
proprietary vendors, support companies, and open-source programmers at large.
See also Release history below.

5.3 Multiversion concurrency control (MVCC)


PostgreSQL manages concurrency through a system known as multiversion concurrency control (MVCC), which gives
each transaction a snapshot of the database, allowing changes to be made without being visible to other transactions
until the changes are committed. This largely eliminates the need for read locks, and ensures the database maintains
the ACID (atomicity, consistency, isolation, durability) principles in an ecient manner. PostgreSQL oers three
levels of transaction isolation: Read Committed, Repeatable Read and Serializable. Because PostgreSQL is immune
to dirty reads, requesting a Read Uncommitted transaction isolation level provides read committed instead. Prior to
PostgreSQL 9.1, requesting Serializable provided the same isolation level as Repeatable Read. PostgreSQL 9.1 and
later support full serializability via the serializable snapshot isolation (SSI) technique.[22]

5.4 Storage and replication


5.4.1

Replication

PostgreSQL, beginning with version 9.0, includes built-in binary replication, based on shipping the changes (writeahead logs) to slave systems asynchronously.
Version 9.0 also introduced the ability to run read-only queries against these replicated slaves, where earlier versions
would only allow that after promoting them to be a new master. This allows splitting read trac among multiple
nodes eciently. Earlier replication software that allowed similar read scaling normally relied on adding replication
triggers to the master, introducing additional load onto it.
Beginning from version 9.1, PostgreSQL also includes built-in synchronous replication[23] that ensures that, for each
write transaction, the master waits until at least one slave node has written the data to its transaction log. Unlike
other database systems, the durability of a transaction (whether it is asynchronous or synchronous) can be specied
per-database, per-user, per-session or even per-transaction. This can be useful for work loads that do not require

44

CHAPTER 5. POSTGRESQL

such guarantees, and may not be wanted for all data as it will have some negative eect on performance due to the
requirement of the conrmation of the transaction reaching the synchronous standby.
There can be a mixture of synchronous and asynchronous standby servers. A list of synchronous standby servers can
be specied in the conguration which determines which servers are candidates for synchronous replication. The rst
in the list which is currently connected and actively streaming is the one that will be used as the current synchronous
server. When this fails, it falls to the next in line.
Synchronous multi-master replication is currently not included in the PostgreSQL core. Postgres-XC which is based
on PostgreSQL provides scalable synchronous multi-master replication,[24] available in version 1.1 is licensed under
the same license as PostgreSQL. A similar project is called Postgres-XL and is available under the Mozilla Public
License.[25]
The community has also written some tools to make managing replication clusters easier, such as repmgr.
There are also several asynchronous trigger-based replication packages for PostgreSQL. These remain useful even
after introduction of the expanded core capabilities, for situations where binary replication of an entire database
cluster is not the appropriate approach:
Slony-I
Londiste, part of SkyTools (developed by Skype)
Bucardo multi-master replication (developed by Backcountry.com)[26]
SymmetricDS multi-master, multi-tier replication

5.4.2

Indexes

PostgreSQL includes built-in support for regular B-tree and hash indexes, and two types of inverted indexes: generalized search trees (GiST) and generalized inverted indexes (GIN). Hash indexes are implemented, but discouraged
because they cannot be recovered after a crash or power loss. In addition, user-dened index methods can be created,
although this is quite an involved process. Indexes in PostgreSQL also support the following features:
Expression indexes can be created with an index of the result of an expression or function, instead of simply
the value of a column.
Partial indexes, which only index part of a table, can be created by adding a WHERE clause to the end of the
CREATE INDEX statement. This allows a smaller index to be created.
The planner is capable of using multiple indexes together to satisfy complex queries, using temporary inmemory bitmap index operations.
As of PostgreSQL 9.1, k-nearest neighbors (k-NN) indexing (also referred to KNN-GiST) provides ecient
searching of closest values to that specied, useful to nding similar words, or close objects or locations with
geospatial data. This is achieved without exhaustive matching of values.
In PostgreSQL 9.2 and above, index-only scans often allow the system to fetch data from indexes without ever
having to access the main table.

5.4.3

Schemas

In PostgreSQL, all objects (with the exception of roles and tablespaces) are held within a schema. Schemas eectively
act like namespaces, allowing objects of the same name to co-exist in the same database. Schemas are analogous to
directories in a le system, except that they cannot be nested, nor is it possible to create a symbolic link pointing
to another schema or object.
By default, databases are created with the public schema, but any additional schemas can be added, and the public
schema isn't mandatory. A search_path determines the order in which schemas are checked on unqualied objects
(those without a prexed schema), which can be congured on a database or role level. The search path, by default,
contains the special schema name of "$user, which rst looks for a schema named after the connected database user
(e.g. if the user dave were connected, it would rst look for a schema also named dave when referring to any

5.4. STORAGE AND REPLICATION

45

objects). If such a schema is not found, it then proceeds to the next schema. New objects are created in whichever
valid schema (one that presently exists) is listed rst in the search path.

5.4.4

Data types

A wide variety of native data types are supported, including:


Boolean
Arbitrary precision numerics
Character (text, varchar, char)
Binary
Date/time (timestamp/time with/without timezone, date, interval)
Money
Enum
Bit strings
Text search type
Composite
HStore (an extension enabled key-value store within PostgreSQL)
Arrays (variable length and can be of any data type, including text and composite types) up to 1 GB in total
storage size
Geometric primitives
IPv4 and IPv6 addresses
CIDR blocks and MAC addresses
XML supporting XPath queries
UUID
JSON (since version 9.2), and a faster binary JSONB (since version 9.4; not the same as BSON[27] )
In addition, users can create their own data types which can usually be made fully indexable via PostgreSQLs GiST
infrastructure. Examples of these include the geographic information system (GIS) data types from the PostGIS
project for PostgreSQL.
There is also a data type called a domain, which is the same as any other data type but with optional constraints
dened by the creator of that domain. This means any data entered into a column using the domain will have to
conform to whichever constraints were dened as part of the domain.
Starting with PostgreSQL 9.2, a data type that represents a range of data can be used which are called range types.
These can be discrete ranges (e.g. all integer values 1 to 10) or continuous ranges (e.g. any point in time between
10:00 am and 11:00 am). The built-in range types available include ranges of integers, big integers, decimal numbers,
time stamps (with and without time zone) and dates.
Custom range types can be created to make new types of ranges available, such as IP address ranges using the inet
type as a base, or oat ranges using the oat data type as a base. Range types support inclusive and exclusive range
boundaries using the [] and () characters respectively. (e.g. '[4,9)' represents all integers starting from and including
4 up to but not including 9.) Range types are also compatible with existing operators used to check for overlap,
containment, right of etc.

46

CHAPTER 5. POSTGRESQL

5.4.5

User-dened objects

New types of almost all objects inside the database can be created, including:
Casts
Conversions
Data types
Domains
Functions, including aggregate functions and window functions
Indexes including custom indexes for custom types
Operators (existing ones can be overloaded)
Procedural languages

5.4.6

Inheritance

Tables can be set to inherit their characteristics from a parent table. Data in child tables will appear to exist in the
parent tables, unless data is selected from the parent table using the ONLY keyword, i.e. SELECT * FROM ONLY
parent_table. Adding a column in the parent table will cause that column to appear in the child table.
Inheritance can be used to implement table partitioning, using either triggers or rules to direct inserts to the parent
table into the proper child tables.
As of 2010 this feature is not fully supported yetin particular, table constraints are not currently inheritable. All
check constraints and not-null constraints on a parent table are automatically inherited by its children. Other types of
constraints (unique, primary key, and foreign key constraints) are not inherited.
Inheritance provides a way to map the features of generalization hierarchies depicted in Entity Relationship Diagrams
(ERD) directly into the PostgreSQL database.

5.4.7

Other storage features

Referential integrity constraints including foreign key constraints, column constraints, and row checks
Binary and textual large-object storage
Tablespaces
Per-column collation (from 9.1)
Online backup
Point-in-time recovery, implemented using write-ahead logging
In-place upgrades with pg_upgrade for less downtime (supports upgrades from 8.3.x and later)

5.5 Control and connectivity


5.5.1

Foreign data wrappers

As of version 9.1, PostgreSQL can link to other systems to retrieve data via foreign data wrappers (FDWs). These
can take the form of any data source, such as a le system, another RDBMS, or a web service. This means regular
database queries can use these data sources like regular tables, and even join multiple data sources together.

5.5. CONTROL AND CONNECTIVITY

5.5.2

47

Interfaces

PostgreSQL has several interfaces available and is also widely supported among programming language libraries.
Built-in interfaces include libpq (PostgreSQLs ocial C application interface) and ECPG (an embedded C system).
External interfaces include:
libpqxx: C++ interface
PostgresDAC: PostgresDAC (for Embarcadero RadStudio/Delphi/CBuilder XE-XE3)
DBD::Pg: Perl DBI driver
JDBC: JDBC interface
Lua: Lua interface
Npgsql: .NET data provider
ST-Links SpatialKit: Link Tool to ArcGIS
node-postgres: Node.js interface
pgoledb: OLEDB interface
psqlODBC: ODBC interface
psycopg2:[28] Python interface (also used by HTSQL)
pgtclng: Tcl interface
pyODBC: Python library
php5-pgsql: PHP driver based on libpq
postmodern: A Common Lisp interface

5.5.3

Procedural languages

Procedural languages allow developers to extend the database with custom subroutines (functions), often called stored
procedures. These functions can be used to build triggers (functions invoked upon modication of certain data) and
custom aggregate functions. Procedural languages can also be invoked without dening a function, using the DO
command at SQL level.
Languages are divided into two groups: Safe languages are sandboxed and can be safely used by any user. Procedures written in unsafe languages can only be created by superusers, because they allow bypassing the databases
security restrictions, but can also access sources external to the database. Some languages like Perl provide both safe
and unsafe versions.
PostgreSQL has built-in support for three procedural languages:
Plain SQL (safe). Simpler SQL functions can get expanded inline into the calling (SQL) query, which saves
function call overhead and allows the query optimizer to see inside the function.
PL/pgSQL (safe), which resembles Oracles PL/SQL procedural language and SQL/PSM.
C (unsafe), which allows loading custom shared libraries into the database. Functions written in C oer the
best performance, but bugs in code can crash and potentially corrupt the database. Most built-in functions are
written in C.
In addition, PostgreSQL allows procedural languages to be loaded into the database through extensions. Three language extensions are included with PostgreSQL to support Perl, Python and Tcl. There are external projects to add
support for many other languages, including Java, JavaScript (PL/V8), R.

48

CHAPTER 5. POSTGRESQL

5.5.4

Triggers

Triggers are events triggered by the action of SQL DML statements. For example, an INSERT statement might
activate a trigger that checks if the values of the statement are valid. Most triggers are only activated by either
INSERT or UPDATE statements.
Triggers are fully supported and can be attached to tables. In PostgreSQL 9.0 and above, triggers can be per-column
and conditional, in that UPDATE triggers can target specic columns of a table, and triggers can be told to execute
under a set of conditions as specied in the triggers WHERE clause. As of PostgreSQL 9.1, triggers can be attached
to views by utilising the INSTEAD OF condition. Views in versions prior to 9.1 can have rules, though. Multiple
triggers are red in alphabetical order. In addition to calling functions written in the native PL/pgSQL, triggers can
also invoke functions written in other languages like PL/Python or PL/Perl.

5.5.5

Asynchronous notications

PostgreSQL provides an asynchronous messaging system that is accessed through the NOTIFY, LISTEN and UNLISTEN commands. A session can issue a NOTIFY command, along with the user-specied channel and an optional
payload, to mark a particular event occurring. Other sessions are able to detect these events by issuing a LISTEN
command, which can listen to a particular channel. This functionality can be used for a wide variety of purposes,
such as letting other sessions know when a table has updated or for separate applications to detect when a particular
action has been performed. Such a system prevents the need for continuous polling by applications to see if anything
has yet changed, and reducing unnecessary overhead. Notications are fully transactional, in that messages are not
sent until the transaction they were sent from is committed. This eliminates the problem of messages being sent for
an action being performed which is then rolled back.
Many of the connectors for PostgreSQL provide support for this notication system (including libpq, JDBC, Npgsql,
psycopg and node.js) so it can be used by external applications.

5.5.6

Rules

Rules allow the query tree of an incoming query to be rewritten. Rules, or more properly, Query Re-Write Rules,
are attached to a table/class and Re-Write the incoming DML (select, insert, update, and/or delete) into one or
more queries that either replace the original DML statement or execute in addition to it. Query Re-Write occurs after
DML statement parsing, but before query planning.

5.5.7

Other querying features

Transactions
Full text search
Views
Materialized views[29]
Updateable views[30]
Recursive views[31]
Inner, outer (full, left and right), and cross joins
Sub-selects
Correlated sub-queries[32]
Regular expressions[33]
Common table expressions and writable common table expressions
Encrypted connections via TLS (current versions do no use vulnerable SSL, even with that conguration
option)[34]

5.6. SECURITY

49

Domains
Savepoints
Two-phase commit
TOAST (The Oversized-Attribute Storage Technique) is used to transparently store large table attributes (such
as big MIME attachments or XML messages) in a separate area, with automatic compression.
Embedded SQL is implemented using preprocessor. SQL code is rst written embedded into C code. Then
code is run through ECPG preprocessor, which replaces SQL with calls to code library. Then code can be
compiled using a C compiler. Embedding works also with C++ but it does not recognize all C++ constructs.

5.6 Security
Security within the database is managed on a per-role-basis. A role is generally regarded to be a user (a role that can
log in), or a group (a role of which other roles are members). Permissions can be granted or revoked on any object
down to the column level, and can also allow/prevent the creation of new objects at the database, schema or table
levels.
The sepgsql extension (provided with PostgreSQL as of version 9.1) provides an additional layer of security by integrating with SELinux. This utilises PostgreSQLs SECURITY LABEL feature.
PostgreSQL natively supports a broad number of external authentication mechanisms including:
password (either MD5 or plain-text)
GSSAPI
SSPI
Kerberos
ident (maps O/S user name as provided by an ident server to database user name)
peer (maps local user name to database user name)
LDAP
Active Directory
RADIUS
certicate
PAM
The GSSAPI, SSPI, Kerberos, peer, ident and certicate methods can also use a specied map le that lists which
users matched by that authentication system are allowed to connect as a specic database user.
These methods are specied in the clusters host-based authentication conguration le (pg_hba.conf), which determines what connections are allowed. This allows control over which user can connect to which database, where they
can connect from (IP address/IP address range/domain socket), which authentication system will be enforced, and
whether the connection must use TLS.

5.7 Upcoming features


Upcoming features in 9.5, in order of commit, include:
IMPORT FOREIGN SCHEMA to import foreign tables from a foreign schema, meaning tables no longer have
to be manually congured[35]

50

CHAPTER 5. POSTGRESQL
ALTER TABLE ... SET LOGGED / UNLOGGED for switching tables between logged and unlogged states[36]
Row-Level Security Policies for controlling which rows are visible or can be added to a table[37]
SKIP LOCKED for row-level locks[38]
BRIN (Block Range Indexes) to speed up queries on very large tables[39]
Parallel VACUUMing with vacuumdb tool[40]
Foreign tables can inherit and be inherited from[41]
pg_rewind tool to eciently resynchronise failed primary to new primary[42]
Index-only scans in GiST indexes[43]
CREATE TRANSFORM for mapping data type structures to procedural language data types[44]

5.8 Add-ons
MADlib: an open source analytics library for PostgreSQL providing mathematical, statistical and machinelearning methods for structured and unstructured data
MySQL migration wizard: included with EnterpriseDBs PostgreSQL installer (source code also available)[45]
Performance Wizard: included with EnterpriseDBs PostgreSQL installer (source code also available)[45]
pgRouting: extended PostGIS to provide geospatial routing functionality[46] (GNU GPL)
PostGIS: a popular add-on which provides support for geographic objects (GNU GPL)
Postgres Enterprise Manager: a non-free tool consisting of a service, multiple agents, and a GUI which provides
remote monitoring, management, reporting, capacity planning and tuning[47]
ST-Links SpatialKit: Extension for directly connecting to spatial databases[48]

5.9 Benchmarks and performance


Many informal performance studies of PostgreSQL have been done.[49] Performance improvements aimed at improving scalability started heavily with version 8.1. Simple benchmarks between version 8.0 and version 8.4 showed
that the latter was more than 10 times faster on read-only workloads and at least 7.5 times faster on both read and
write workloads.[50]
The rst industry-standard and peer-validated benchmark was completed in June 2007 using the Sun Java System
Application Server (proprietary version of GlassFish) 9.0 Platform Edition, UltraSPARC T1-based Sun Fire server
and Postgres 8.2.[51] This result of 778.14 SPECjAppServer2004 JOPS@Standard compares favourably with the 874
JOPS@Standard with Oracle 10 on an Itanium-based HP-UX system.[49]
In August 2007, Sun submitted an improved benchmark score of 813.73 SPECjAppServer2004 JOPS@Standard.
With the system under test at a reduced price, the price/performance improved from $US 84.98/JOPS to $US
70.57/JOPS.[52]
The default conguration of PostgreSQL uses only a small amount of dedicated memory for performance-critical
purposes such as caching database blocks and sorting. This limitation is primarily because older operating systems
required kernel changes to allow allocating large blocks of shared memory.[53] PostgreSQL.org provides advice on
basic recommended performance practice in a wiki.[54]
In April 2012, Robert Haas of EnterpriseDB demonstrated PostgreSQL 9.2s linear CPU scalability using a server
with 64 cores.[55]

5.10. PLATFORMS

51

5.10 Platforms
PostgreSQL is available for the following operating systems: Linux (all recent distributions), Windows (Windows
2000 SP4 and later) (compilable by e.g. Visual Studio, now with up to most recent 2013 version), DragonFly
BSD, FreeBSD, OpenBSD, NetBSD, Mac OS X, AIX, BSD/OS, HP-UX, IRIX, OpenIndiana,[56] OpenSolaris, SCO
OpenServer, SCO UnixWare, Solaris and Tru64 Unix. As of 2012, support for the following obsolete systems was
removed:[57] DG/UX, NeXTSTEP, SunOS 4, SVR4, Ultrix 4, and Univel. Most other Unix-like systems should also
work.
PostgreSQL works on any of the following instruction set architectures: x86 and x86-64 on Windows and other
operatings systems; other than Windows: IA-64 Itanium, PowerPC, PowerPC 64, S/390, S/390x, SPARC, SPARC
64, Alpha, ARMv8-A (64-bit)[58] and older ARM (32-bit), MIPS, MIPSel, M68k, and PA-RISC. It is also known to
work on M32R, NS32k, and VAX. In addition to these, it is possible to build PostgreSQL for an unsupported CPU
by disabling spinlocks.[59]

5.11 Database administration


See also: Comparison of database tools
Open source front-ends and tools for administering PostgreSQL include:
psql The primary front-end for PostgreSQL is the psql command-line program, which can be used to enter SQL
queries directly, or execute them from a le. In addition, psql provides a number of meta-commands and
various shell-like features to facilitate writing scripts and automating a wide variety of tasks; for example tab
completion of object names and SQL syntax.
pgAdmin The pgAdmin package is a free and open source graphical user interface administration tool for PostgreSQL, which is supported on many computer platforms.[60] The program is available in more than a dozen
languages. The rst prototype, named pgManager, was written for PostgreSQL 6.3.2 from 1998, and rewritten
and released as pgAdmin under the GNU General Public License (GPL) in later months. The second incarnation (named pgAdmin II) was a complete rewrite, rst released on January 16, 2002. The third version,
pgAdmin III, was originally released under the Artistic License and then released under the same license as
PostgreSQL. Unlike prior versions that were written in Visual Basic, pgAdmin III is written in C++, using the
wxWidgets framework allowing it to run on most common operating systems.
phpPgAdmin phpPgAdmin is a web-based administration tool for PostgreSQL written in PHP and based on the
popular phpMyAdmin interface originally written for MySQL administration.[61]
PostgreSQL Studio PostgreSQL Studio allows users to perform essential PostgreSQL database development tasks
from a web-based console. PostgreSQL Studio allows users to work with cloud databases without the need to
open rewalls.[62]
TeamPostgreSQL AJAX/JavaScript-driven web interface for PostgreSQL. Allows browsing, maintaining and creating data and database objects via a web browser. The interface oers tabbed SQL editor with auto-completion,
row-editing widgets, click-through foreign key navigation between rows and tables, 'favorites management for
commonly used scripts, among other features. Supports SSH for both the web interface and the database connections. Installers are available for Windows, Mac and Linux, as well as a simple cross-platform archive that
runs from a script.[63]
LibreOce/OpenOce.org Base LibreOce/OpenOce.org Base can be used as a front-end for PostgreSQL.[64][65]
pgFouine The pgFouine PostgreSQL log analyzer generates detailed reports from a PostgreSQL log le and provides
VACUUM analysis.[66]
A number of companies oer proprietary tools for PostgreSQL. They often consist of a universal core that is adapted
for various specic database products. These tools mostly share the administration features with the open source tools
but oer improvements in data modeling, importing, exporting or reporting.

52

CHAPTER 5. POSTGRESQL

5.12 Prominent users


Prominent organizations and products that use PostgreSQL as the primary database include:
Yahoo! for web user behavioral analysis, storing two petabytes and claimed to be the largest data warehouse
using a heavily modied version of PostgreSQL with an entirely dierent column-based storage engine and
dierent query processing layer. While for performance, storage, and query purposes the database bears little
resemblance to PostgreSQL, the front-end maintains compatibility so that Yahoo can use many o-the-shelf
tools already written to interact with PostgreSQL.[67][68]
In 2009, social networking website MySpace used Aster Data Systems's nCluster database for data warehousing, which was built on unmodied PostgreSQL.[69][70]
State Farm uses PostgreSQL on their Aster Data Systems's nCluster Analytics server.
Geni.com uses PostgreSQL for their main genealogy database.[71]
OpenStreetMap, a collaborative project to create a free editable map of the world.[72]
Alias, domain registries for .org, .info and others.[73]
Sony Online multiplayer online games.[74]
BASF, shopping platform for their agribusiness portal.[75]
Reddit social news website.[76]
Skype VoIP application, central business databases.[77]
Sun xVM, Suns virtualization and datacenter automation suite.[78]
MusicBrainz, open online music encyclopedia.[79]
The International Space Station for collecting telemetry data in orbit and replicating it to the ground.[80]
MyYearbook social networking site.[81]
Instagram, a popular mobile photo sharing service[82]
Disqus, an online discussion and commenting service[83]
PostgreSQL is oered by some major vendors as software as a service:
Heroku, a platform as a service provider, has supported PostgreSQL since the start in 2007.[84] They oer
value-add features like full database roll-back (ability to restore a database from any point in time),[85] which
is based on WAL-E, open source software developed by Heroku.[86]
In January 2012, EnterpriseDB released a cloud version of both PostgreSQL and their own proprietary Postgres
Plus Advanced Server with automated provisioning for failover, replication, load-balancing, and scaling. It runs
on Amazon Web Services.[87]
VMware oers vFabric Postgres for private clouds on vSphere since May 2012.[88]
In November 2013, Amazon.com announced that they are adding PostgreSQL to their Relational Database
Service oering.[89][90]

5.13. PROPRIETARY DERIVATIVES AND SUPPORT

53

5.13 Proprietary derivatives and support


Although the license allowed proprietary products based on Postgres, the code did not develop in the proprietary
space at rst. The rst main oshoot originated when Paula Hawthorn (an original Ingres team member who moved
from Ingres) and Michael Stonebraker formed Illustra Information Technologies to make a proprietary product based
on Postgres.
In 2000, former Red Hat investors created the company Great Bridge to make a proprietary product based on PostgreSQL and compete against proprietary database vendors. Great Bridge sponsored several PostgreSQL developers
and donated many resources back to the community,[91] but by late 2001 closed due to tough competition from
companies like Red Hat and to poor market conditions.[92][93]
In 2001 Command Prompt, Inc. released Mammoth PostgreSQL, a proprietary product based on PostgreSQL. In
2008 Command Prompt, Inc. released the source under the original license. Command Prompt, Inc. continues to
support the PostgreSQL community actively through developer sponsorships and projects including PL/Perl, PL/php,
and hosting of community projects such as the PostgreSQL build farm.
In January 2005, PostgreSQL received backing by database vendor Pervasive Software, known for its Btrieve product
which was ubiquitous on the Novell NetWare platform. Pervasive announced commercial support and community
participation and achieved some success. In July 2006, Pervasive left the PostgreSQL support market.[94]
In mid-2005 two other companies announced plans to make proprietary products based on PostgreSQL with focus
on separate niche markets. EnterpriseDB added functionality to allow applications written to work with Oracle to be
more readily run with PostgreSQL. Greenplum contributed enhancements directed at data warehouse and business
intelligence applications, including the BizGres project.
In October 2005 John Loiacono, executive vice president of software at Sun Microsystems, commented: We're not
going to OEM Microsoft but we are looking at PostgreSQL right now,[95] although no specics were released at
that time. By November 2005 Sun had announced support for PostgreSQL.[96] By June 2006 Sun Solaris 10 (6/06
release) shipped with PostgreSQL.
In August 2007, EnterpriseDB announced EnterpriseDB Postgres, a pre-congured distribution of PostgreSQL including many contrib modules and add-on components.[97] EnterpriseDB Postgres was renamed to Postgres Plus in
March 2008. Postgres Plus is available in two versions: Postgres Plus Solution Pack[98] (comprising PostgreSQL delivered in a GUI one-click install plus Solution Pack components that include; Postgres Enterprise Manager, Update
Monitor, xDB Replication Server, SQL Proler, SQL Protect, Migration Toolkit and PL/Secure), and Postgres Plus
Advanced Server[99] which has all the features of Postgres Plus Solutions Pack plus Oracle compatibility, performance
features not available in PostgreSQL, as well as advanced security features not available in PostgreSQL. Both versions
are available for download at no cost and are fully supported. The Solution Pack components and Advanced Server
are restricted by a limited use license for evaluation purposes only unless purchased though a subscription. In 2011,
EnterpriseDB announced Postgres Plus Cloud Database,[100] which easily provisions PostgreSQL and Postgres Plus
Advanced Server databases (with Oracle compatibility) in single instances, high availability clusters, or development
sandboxes for Database-as-a-Service environments.
In 2011, 2ndQuadrant became a Platinum Sponsor of PostgreSQL, in recognition of their long-standing contributions
and developer sponsorship. 2ndQuadrant employ one of the largest teams of PostgreSQL contributors and provide
professional support for open source PostgreSQL.
Many other companies have used PostgreSQL as the base for their proprietary database projects. e.g. Truviso,
Netezza, ParAccel. In many cases the products have been enhanced so much that the software has been forked,
though with some features cherry-picked from later releases.

5.14 Release history


5.15 See also
Comparison of relational database management systems

54

CHAPTER 5. POSTGRESQL

5.16 References
[1] Happy Birthday, PostgreSQL!". PostgreSQL Global Development Group. July 8, 2008.
[2] PostgreSQL 9.4.1, 9.3.6, 9.2.10, 9.1.15 & 9.0.19 Released. PostgreSQL. The PostgreSQL Global Development Group.
2015-02-05. Retrieved 2015-02-05.
[3] PostgreSQL licence approved by OSI. Crynwr. 2010-02-18. Retrieved 2010-02-18.
[4] OSI PostgreSQL Licence. Open Source Initiative. 2010-02-20. Retrieved 2010-02-20.
[5] License. PostgreSQL Global Development Group. Retrieved 2010-09-20.
[6] https://packages.debian.org/sid/postgresql
[7] http://directory.fsf.org/wiki/PostgreSQL
[8] SQL Conformance. postgresql.org. 2013-04-04. Retrieved 2013-08-28.
[9] Appendix D. SQL Conformance. PostgreSQL 9 Documentation. PostgreSQL Global Development Group. 2009 [1996].
Retrieved 2013-04-01.
[10] What is PostgreSQL?". PostgreSQL 9.3.0 Documentation. PostgreSQL Global Development Group. Retrieved 2013-0920.
[11] Lion Server: MySQL not included. 2011-08-04. Retrieved 2011-11-12.
[12] OS X Lion Server Technical Specications. 2011-08-04. Retrieved 2011-11-12.
[13] Contributor Proles. PostgreSQL. Retrieved December 17, 2011.
[14] Audio sample, 5.6k MP3
[15] Project name statement from the core team. archives.postgresql.org. 2007-11-16. Retrieved 2007-11-16.
[16] Stonebraker, M; Rowe, LA (May 1986). The design of POSTGRES (PDF). Proc. 1986 ACM SIGMOD Conference on
Management of Data. Washington, DC. Retrieved 2011-12-17.
[17] http://www.postgresql.org/about/history/
[18] Stonebraker, M; Rowe, LA. The POSTGRES data model (PDF). Proceedings of the 13th International Conference on Very
Large Data Bases. Brighton, England: Morgan Kaufmann Publishers. pp. 8396. ISBN 0-934613-46-X.
[19] Pavel Stehule (9 June 2012). Historie projektu PostgreSQL (in Czech).
[20] University POSTGRES, Version 4.2. 1999-07-26.
[21] Page, Dave (2015-04-07). Re: 20th anniversary of PostgreSQL ?". pgsql-advocacy (Mailing list). Retrieved 9 April
2015.
[22] Dan R. K. Ports, Kevin Grittner (2012). Serializable Snapshot Isolation in PostgreSQL (PDF). Proceedings of the VLDB
Endowment 5 (12): 18501861.
[23] PostgreSQL 9.1 with synchronous replication (news), H Online
[24] Postgres-XC project page (website), Postgres-XC
[25] Postgres-XL product page (website), TransLattice
[26] Marit Fischer (2007-11-10). Backcountry.com nally gives something back to the open source community (Press release). Backcountry.com.
[27] Geoghegan, Peter (March 23, 2014). What I think of jsonb.
[28] psycopg2
[29] Add a materialized view relations.. 2013-03-04. Retrieved 2013-03-04.
[30] Support automatically-updatable views.. 2012-12-08. Retrieved 2012-12-08.
[31] Add CREATE RECURSIVE VIEW syntax. 2013-02-01. Retrieved 2013-02-28.

5.16. REFERENCES

55

[32] Momjian, Bruce (2001). Subqueries. PostgreSQL: Introduction and Concepts. Addison-Wesley. ISBN 0-201-70331-9.
Retrieved 2010-09-25.
[33] Bernier, Robert (2 February 2006). Using Regular Expressions in PostgreSQL. O'Reilly Media. Retrieved 2010-09-25.
[34] http://blog.hagander.net/archives/222-A-few-short-notes-about-PostgreSQL-and-POODLE.html
[35] Implement IMPORT FOREIGN SCHEMA.. 2014-07-10. Retrieved 2014-09-11.
[36] Implement ALTER TABLE .. SET LOGGED / UNLOGGED. 2014-08-22. Retrieved 2014-08-27.
[37] Row-Level Security Policies (RLS)". 2014-09-19. Retrieved 2014-09-19.
[38] Implement SKIP LOCKED for row-level locks. 2014-10-07. Retrieved 2014-10-07.
[39] BRIN: Block Range Indexes. 2014-11-07. Retrieved 2014-11-09.
[40] vacuumdb: enable parallel mode. 2015-01-23. Retrieved 2015-01-28.
[41] Allow foreign tables to participate in inheritance.. 2015-03-22. Retrieved 2015-03-26.
[42] Add pg_rewind, for re-synchronizing a master server after failback.. 2015-03-23. Retrieved 2015-03-26.
[43] Add support for index-only scans in GiST.. 2015-03-26. Retrieved 2015-03-26.
[44] Add transforms feature. 2015-04-26. Retrieved 2015-04-27.
[45] Postgres Plus Downloads. Company website. EnterpriseDB. Retrieved November 12, 2011.
[46] pgRouting, PostLBS
[47] Postgres Enterprise Manager. Company website. EnterpriseDB. Retrieved November 12, 2011.
[48] ST Links
[49] Josh Berkus (2007-07-06). PostgreSQL publishes rst real benchmark. Retrieved 2007-07-10.
[50] Gyrgy Vilmos (2009-09-29). PostgreSQL history. Retrieved 2010-08-28.
[51] SPECjAppServer2004 Result. SPEC. 2007-07-06. Retrieved 2007-07-10.
[52] SPECjAppServer2004 Result. SPEC. 2007-07-04. Retrieved 2007-09-01.
[53] Managing Kernel Resources. PostgreSQL Manual. PostgreSQL.org. Retrieved November 12, 2011.
[54] Greg Smith, Robert Treat, and Christopher Browne. Tuning your PostgreSQL server. Wiki. PostgreSQL.org. Retrieved
November 12, 2011.
[55] Robert Haas (2012-04-03). Did I Say 32 Cores? How about 64?". Retrieved 2012-04-08.
[56] oi_151a Release Notes. OpenIndiana. Retrieved 2012-04-07.
[57] Git postgresql.git/commitdiff". Git.postgresql.org. Retrieved 2012-07-08.
[58] http://lists.debian.org/debian-devel/2012/07/msg00536.html
[59] Supported Platforms. PostgreSQL Global Development Group. Retrieved 2012-04-06.
[60] pgAdmin: PostgreSQL administration and management tools. website. Retrieved November 12, 2011.
[61] phpPgAdmin Project (2008-04-25). About phpPgAdmin. Retrieved 2008-04-25.
[62] PostgreSQL Studio (2013-10-09). About PostgreSQL Studio. Retrieved 2013-10-09.
[63] TeamPostgreSQL website. 2013-10-03. Retrieved 2013-10-03.
[64] oooforum.org (2010-01-10). Back Ends for OpenOce. Retrieved 2011-01-05.
[65] libreoce.org (2012-10-14). Base features. Retrieved 2012-10-14.
[66] Greg Smith (15 October 2010). PostgreSQL 9.0 High Performance. Packt Publishing. ISBN 978-1-84951-030-1.
[67] Eric Lai (2008-05-22). Size matters: Yahoo claims 2-petabyte database is worlds biggest, busiest. Computerworld.

56

CHAPTER 5. POSTGRESQL

[68] Thomas Claburn (2008-05-21). Yahoo Claims Record With Petabyte Database. InformationWeek.
[69] Emmanuel Cecchet (May 21, 2009). Building PetaByte Warehouses with Unmodied PostgreSQL (PDF). PGCon 2009.
Retrieved November 12, 2011.
[70] MySpace.com scales analytics for all their friends (PDF). case study. Aster Data. June 15, 2010. Archived (PDF) from
the original on November 14, 2010. Retrieved November 12, 2011.
[71] Last Weekends Outage. Blog. Geni. 2011-08-01.
[72] Database. Wiki. OpenStreetMap.
[73] PostgreSQL aliates .ORG domain, AU: Computer World
[74] Sony Online opts for open-source database over Oracle, Computer World
[75] A Web Commerce Group Case Study on PostgreSQL (PDF) (1.2 ed.), PostgreSQL
[76] Reddit software wiki - Architecture Overview. Reddit. 27 March 2014. Retrieved 2014-11-25.
[77] PostgreSQL at Skype. Skype Developer Zone. 2006. Retrieved 2007-10-23.
[78] How Much Are You Paying For Your Database?". Sun Microsystems blog. 2007. Retrieved 2007-12-14.
[79] Database MusicBrainz. MusicBrainz Wiki. Retrieved 5 February 2011.
[80] Duncavage, Daniel P (2010-07-13). NASA needs Postgres-Nagios help.
[81] Roy, Gavin M (2010). PostgreSQL at myYearbook.com (talk). USA East: PostgreSQL Conference.
[82] Keeping Instagram up with over a million new users in twelve hours. Instagram-engineering.tumblr.com. 2011-05-17.
Retrieved 2012-07-07.
[83] Postgres at Disqus. Retrieved May 24, 2013.
[84] Alex Williams (1 April 2013). Heroku Forces Customer Upgrade To Fix Critical PostgreSQL Security Hole. TechCrunch.
[85] Barb Darrow (11 November 2013). Heroku gussies up Postgres with database roll-back and proactive alerts. GigaOM.
[86] Craig Kerstiens (26 September 2013). WAL-E and Continuous Protection with Heroku Postgres. Heroku blog.
[87] EnterpriseDB Oers Up Postgres Plus Cloud Database. Techweekeurope.co.uk. 2012-01-27. Retrieved 2012-07-07.
[88] Al Sargent (15 May 2012). Introducing VMware vFabric Suite 5.1: Automated Deployment, New Components, and
Open Source Support. VMware blogs.
[89] Je (14 November 2013). Amazon RDS for PostgreSQL Now Available. Amazon Web Services Blog.
[90] Alex Williams (14 November 2013). PostgreSQL Now Available On Amazons Relational Database Service. TechCrunch.
[91] Maya Tamiya (2001-01-10). Interview: Bruce Momjian. LWN.net. Retrieved 2007-09-07.
[92] Great Bridge ceases operations (Press release). Great Bridge. 2001-09-06. Retrieved 2007-09-07.
[93] Nikolai Bezroukov (1 July 2004). The Sunset of Linux Hype. Portraits of Open Source Pioneers. NORFOLK, Va.,
September 6, 2001 -- Great Bridge LLC, the company that pioneered commercial distribution and support of the PostgreSQL open source database, announced today that it has ceased business operations
[94] John Farr (2006-07-25). Open letter to the PostgreSQL Community. Pervasive Software. Archived from the original on
2007-02-25. Retrieved 2007-02-13.
[95] Rodney Gedda (2005-10-05). Suns software chief eyes databases, groupware. Computerworld. Retrieved 2007-02-13.
[96] Sun Announces Support for Postgres Database on Solaris 10 (Press release). Sun Microsystems. 2005-11-17. Retrieved
2007-02-13.
[97] EnterpriseDB Announces First-Ever Professional-Grade PostgreSQL Distribution for Linux (Press release). EnterpriseDB.
2007-08-07. Retrieved 2007-08-07.
[98] Postgres Plus Solution Pack. EnterpriseDB. Retrieved 2012-07-07.
[99] Postgres Plus Advanced Server. EnterpriseDB. Retrieved 2012-07-07.
[100] Postgres Plus Cloud Database. EnterpriseDB. Retrieved 2012-07-07.
[101] Versioning policy. PostgreSQL Global Development Group. Retrieved 2012-01-30.

5.17. FURTHER READING

57

5.17 Further reading


Obe, Regina; Hsu, Leo (July 8, 2012). PostgreSQL: Up and Running. O'Reilly. ISBN 1-4493-2633-1.
Krosing, Hannu; Roybal, Kirk (June 15, 2013). PostgreSQL Server Programming. Packt Publishing. ISBN
9781849516983.
Riggs, Simon; Krosing, Hannu (October 27, 2010). PostgreSQL 9 Administration Cookbook. Packt Publishing.
ISBN 1-84951-028-8.
Smith, Greg (October 15, 2010). PostgreSQL 9 High Performance. Packt Publishing. ISBN 1-84951-030-X.
Gilmore, W. Jason; Treat, Robert (February 27, 2006). Beginning PHP and PostgreSQL 8: From Novice to
Professional. Apress. p. 896. ISBN 1-59059-547-5.
Douglas, Korry (August 5, 2005). PostgreSQL (Second ed.). Sams. p. 1032. ISBN 0-672-32756-2.
Matthew, Neil; Stones, Richard (April 6, 2005). Beginning Databases with PostgreSQL (Second ed.). Apress.
p. 664. ISBN 1-59059-478-9.
Worsley, John C; Drake, Joshua D (January 2002). Practical PostgreSQL. O'Reilly Media. p. 636. ISBN
1-56592-846-6.

5.18 External links


Ocial website
PostgreSQL Extension Network
PostgreSQL at DMOZ
Heroku Postgres
Postgres.app
PostgreSQL Tutorial

Chapter 6

SQL
This article is about the database language. For the IATA code, see San Carlos Airport (California).
SQL ( i /skjul/,[4] or i /sikwl/;[5] Structured Query Language[6][7][8][9] ) is a special-purpose programming
language designed for managing data held in a relational database management system (RDBMS), or for stream
processing in a relational data stream management system (RDSMS).
Originally based upon relational algebra and tuple relational calculus, SQL consists of a data denition language and
a data manipulation language. The scope of SQL includes data insert, query, update and delete, schema creation and
modication, and data access control. Although SQL is often described as, and to a great extent is, a declarative
language (4GL), it also includes procedural elements.
SQL was one of the rst commercial languages for Edgar F. Codd's relational model, as described in his inuential
1970 paper, A Relational Model of Data for Large Shared Data Banks.[10] Despite not entirely adhering to the
relational model as described by Codd, it became the most widely used database language.[11][12]
SQL became a standard of the American National Standards Institute (ANSI) in 1986, and of the International
Organization for Standardization (ISO) in 1987.[13] Since then, the standard has been revised to include a larger
set of features. Despite the existence of such standards, though, most SQL code is not completely portable among
dierent database systems without adjustments.

6.1 History
SQL was initially developed at IBM by Donald D. Chamberlin and Raymond F. Boyce in the early 1970s.[14] This
version, initially called SEQUEL (Structured English QUEry Language), was designed to manipulate and retrieve data
stored in IBMs original quasi-relational database management system, System R, which a group at IBM San Jose
Research Laboratory had developed during the 1970s.[14] The acronym SEQUEL was later changed to SQL because
SEQUEL was a trademark of the UK-based Hawker Siddeley aircraft company.[15]
In the late 1970s, Relational Software, Inc. (now Oracle Corporation) saw the potential of the concepts described
by Codd, Chamberlin, and Boyce, and developed their own SQL-based RDBMS with aspirations of selling it to the
U.S. Navy, Central Intelligence Agency, and other U.S. government agencies. In June 1979, Relational Software,
Inc. introduced the rst commercially available implementation of SQL, Oracle V2 (Version2) for VAX computers.
After testing SQL at customer test sites to determine the usefulness and practicality of the system, IBM began developing commercial products based on their System R prototype including System/38, SQL/DS, and DB2, which
were commercially available in 1979, 1981, and 1983, respectively.[16]

6.2 Syntax
6.2.1

Language elements

The SQL language is subdivided into several language elements, including:


58

6.2. SYNTAX

59

A chart showing several of the SQL language elements that compose a single statement

Clauses, which are constituent components of statements and queries. (In some cases, these are optional.)[17]
Expressions, which can produce either scalar values, or tables consisting of columns and rows of data
Predicates, which specify conditions that can be evaluated to SQL three-valued logic (3VL) (true/false/unknown)
or Boolean truth values and are used to limit the eects of statements and queries, or to change program ow.
Queries, which retrieve the data based on specic criteria. This is an important element of SQL.
Statements, which may have a persistent eect on schemata and data, or may control transactions, program
ow, connections, sessions, or diagnostics.
SQL statements also include the semicolon (";") statement terminator. Though not required on every
platform, it is dened as a standard part of the SQL grammar.
Insignicant whitespace is generally ignored in SQL statements and queries, making it easier to format SQL
code for readability.

6.2.2

Operators

Conditional (CASE) expressions


SQL has the case/when/then/else/end expression, which was introduced in SQL-92. In its most general form, which
is called a searched case in the SQL standard, it works like else if in other programming languages:
CASE WHEN n > 0 THEN 'positive' WHEN n < 0 THEN 'negative' ELSE 'zero' END
SQL tests WHEN conditions in the order they appear in the source. If the source does not specify an ELSE expression,
SQL defaults to ELSE NULL. An abbreviated syntaxcalled simple case in the SQL standardmirrors switch
statements:
CASE n WHEN 1 THEN 'one' WHEN 2 THEN 'two' ELSE 'I cannot count that high' END
This syntax uses implicit equality comparisons, with the usual caveats for comparing with NULL.
For the Oracle-SQL dialect, the latter can be shortened to an equivalent DECODE construct:
SELECT DECODE(n, 1, 'one', 2, 'two', 'i cannot count that high') FROM some_table;
The last value is the default; if none is specied, it also defaults to NULL. However, unlike the standards simple
case, Oracles DECODE considers two NULLs equal with each other.[18]

6.2.3

Queries

The most common operation in SQL is the query, which is performed with the declarative SELECT statement.
SELECT retrieves data from one or more tables, or expressions. Standard SELECT statements have no persistent

60

CHAPTER 6. SQL

eects on the database. Some non-standard implementations of SELECT can have persistent eects, such as the
SELECT INTO syntax that exists in some databases.[19]
Queries allow the user to describe desired data, leaving the database management system (DBMS) responsible for
planning, optimizing, and performing the physical operations necessary to produce that result as it chooses.
A query includes a list of columns to include in the nal result, immediately following the SELECT keyword. An
asterisk ("*") can also be used to specify that the query should return all columns of the queried tables. SELECT is
the most complex statement in SQL, with optional keywords and clauses that include:
The FROM clause, which indicates the table(s) to retrieve data from. The FROM clause can include optional
JOIN subclauses to specify the rules for joining tables.
The WHERE clause includes a comparison predicate, which restricts the rows returned by the query. The
WHERE clause eliminates all rows from the result set where the comparison predicate does not evaluate to
True.
The GROUP BY clause is used to project rows having common values into a smaller set of rows. GROUP BY
is often used in conjunction with SQL aggregation functions or to eliminate duplicate rows from a result set.
The WHERE clause is applied before the GROUP BY clause.
The HAVING clause includes a predicate used to lter rows resulting from the GROUP BY clause. Because
it acts on the results of the GROUP BY clause, aggregation functions can be used in the HAVING clause
predicate.
The ORDER BY clause identies which columns to use to sort the resulting data, and in which direction to
sort them (ascending or descending). Without an ORDER BY clause, the order of rows returned by an SQL
query is undened.
The following is an example of a SELECT query that returns a list of expensive books. The query retrieves all rows
from the Book table in which the price column contains a value greater than 100.00. The result is sorted in ascending
order by title. The asterisk (*) in the select list indicates that all columns of the Book table should be included in the
result set.
SELECT * FROM Book WHERE price > 100.00 ORDER BY title;
The example below demonstrates a query of multiple tables, grouping, and aggregation, by returning a list of books
and the number of authors associated with each book.
SELECT Book.title AS Title, COUNT(*) AS Authors FROM Book JOIN Book_author ON Book.isbn = Book_author.isbn
GROUP BY Book.title;
Example output might resemble the following:
Title Authors ---------------------- ------- SQL Examples and Guide 4 The Joy of SQL 1 An Introduction to SQL 2
Pitfalls of SQL 1
Under the precondition that isbn is the only common column name of the two tables and that a column named title
only exists in the Books table, the above query could be rewritten in the following form:
SELECT title, COUNT(*) AS Authors FROM Book NATURAL JOIN Book_author GROUP BY title;
However, many vendors either do not support this approach, or require certain column naming conventions for natural
joins to work eectively.
SQL includes operators and functions for calculating values on stored values. SQL allows the use of expressions in
the select list to project data, as in the following example, which returns a list of books that cost more than 100.00
with an additional sales_tax column containing a sales tax gure calculated at 6% of the price.
SELECT isbn, title, price, price * 0.06 AS sales_tax FROM Book WHERE price > 100.00 ORDER BY title;

6.2. SYNTAX

61

Subqueries
Queries can be nested so that the results of one query can be used in another query via a relational operator or
aggregation function. A nested query is also known as a subquery. While joins and other table operations provide
computationally superior (i.e. faster) alternatives in many cases, the use of subqueries introduces a hierarchy in
execution that can be useful or necessary. In the following example, the aggregation function AVG receives as input
the result of a subquery:
SELECT isbn, title, price FROM Book WHERE price < (SELECT AVG(price) FROM Book) ORDER BY title;
A subquery can use values from the outer query, in which case it is known as a correlated subquery.
Since 1999 the SQL standard allows named subqueries called common table expression (named and designed after the
IBM DB2 version 2 implementation; Oracle calls these subquery factoring). CTEs can also be recursive by referring
to themselves; the resulting mechanism allows tree or graph traversals (when represented as relations), and more
generally xpoint computations.

Null or three-valued logic (3VL)


Main article: Null (SQL)
The concept of Null was introduced into SQL to handle missing information in the relational model. The word NULL
is a reserved keyword in SQL, used to identify the Null special marker. Comparisons with Null, for instance equality
(=) in WHERE clauses, results in an Unknown truth value. In SELECT statements SQL returns only results for which
the WHERE clause returns a value of True; i.e., it excludes results with values of False and also excludes those whose
value is Unknown.
Along with True and False, the Unknown resulting from direct comparisons with Null thus brings a fragment of
three-valued logic to SQL. The truth tables SQL uses for AND, OR, and NOT correspond to a common fragment of
the Kleene and Lukasiewicz three-valued logic (which dier in their denition of implication, however SQL denes
no such operation).[20]
There are however disputes about the semantic interpretation of Nulls in SQL because of its treatment outside direct
comparisons. As seen in the table above direct equality comparisons between two NULLs in SQL (e.g. NULL =
NULL) returns a truth value of Unknown. This is in line with the interpretation that Null does not have a value (and
is not a member of any data domain) but is rather a placeholder or mark for missing information. However, the
principle that two Nulls aren't equal to each other is eectively violated in the SQL specication for the UNION and
INTERSECT operators, which do identify nulls with each other.[21] Consequently, these set operations in SQL may
produce results not representing sure information, unlike operations involving explicit comparisons with NULL (e.g.
those in a WHERE clause discussed above). In Codds 1979 proposal (which was basically adopted by SQL92) this
semantic inconsistency is rationalized by arguing that removal of duplicates in set operations happens at a lower level
of detail than equality testing in the evaluation of retrieval operations.[20] However, computer science professor Ron
van der Meyden concluded that The inconsistencies in the SQL standard mean that it is not possible to ascribe any
intuitive logical semantics to the treatment of nulls in SQL.[21]
Additionally, since SQL operators return Unknown when comparing anything with Null directly, SQL provides
two Null-specic comparison predicates: IS NULL and IS NOT NULL test whether data is or is not Null.[22]
Universal quantication is not explicitly supported by SQL, and must be worked out as a negated existential quantication.[23][24][25] There is also the "<row value expression> IS DISTINCT FROM <row value expression>" inxed
comparison operator, which returns TRUE unless both operands are equal or both are NULL. Likewise, IS NOT
DISTINCT FROM is dened as NOT (<row value expression> IS DISTINCT FROM <row value expression>)".
SQL:1999 also introduced BOOLEAN type variables, which according to the standard can also hold Unknown values. In practice, a number of systems (e.g. PostgreSQL) implement the BOOLEAN Unknown as a BOOLEAN
NULL.

6.2.4

Data manipulation

The Data Manipulation Language (DML) is the subset of SQL used to add, update and delete data:

62

CHAPTER 6. SQL
INSERT adds rows (formally tuples) to an existing table, e.g.:

INSERT INTO example (eld1, eld2, eld3) VALUES ('test', 'N', NULL);
UPDATE modies a set of existing table rows, e.g.:
UPDATE example SET eld1 = 'updated value' WHERE eld2 = 'N';
DELETE removes existing rows from a table, e.g.:
DELETE FROM example WHERE eld2 = 'N';
MERGE is used to combine the data of multiple tables. It combines the INSERT and UPDATE elements. It
is dened in the SQL:2003 standard; prior to that, some databases provided similar functionality via dierent
syntax, sometimes called "upsert".
MERGE INTO TABLE_NAME USING table_reference ON (condition) WHEN MATCHED THEN UPDATE
SET column1 = value1 [, column2 = value2 ...] WHEN NOT MATCHED THEN INSERT (column1 [, column2
...]) VALUES (value1 [, value2 ...])

6.2.5

Transaction controls

Transactions, if available, wrap DML operations:


START TRANSACTION (or BEGIN WORK, or BEGIN TRANSACTION, depending on SQL dialect)
marks the start of a database transaction, which either completes entirely or not at all.
SAVE TRANSACTION (or SAVEPOINT) saves the state of the database at the current point in transaction
CREATE TABLE tbl_1(id INT); INSERT INTO tbl_1(id) VALUES(1); INSERT INTO tbl_1(id) VALUES(2);
COMMIT; UPDATE tbl_1 SET id=200 WHERE id=1; SAVEPOINT id_1upd; UPDATE tbl_1 SET id=1000
WHERE id=2; ROLLBACK TO id_1upd; SELECT id FROM tbl_1;
COMMIT makes all data changes in a transaction permanent.
ROLLBACK discards all data changes since the last COMMIT or ROLLBACK, leaving the data as it was
prior to those changes. Once the COMMIT statement completes, the transactions changes cannot be rolled
back.
COMMIT and ROLLBACK terminate the current transaction and release data locks. In the absence of a START
TRANSACTION or similar statement, the semantics of SQL are implementation-dependent. The following example
shows a classic transfer of funds transaction, where money is removed from one account and added to another. If
either the removal or the addition fails, the entire transaction is rolled back.
START TRANSACTION; UPDATE Account SET amount=amount-200 WHERE account_number=1234; UPDATE Account SET amount=amount+200 WHERE account_number=2345; IF ERRORS=0 COMMIT; IF ERRORS<>0 ROLLBACK;

6.2.6

Data denition

The Data Denition Language (DDL) manages table and index structure. The most basic items of DDL are the
CREATE, ALTER, RENAME, DROP and TRUNCATE statements:

6.2. SYNTAX

63

CREATE creates an object (a table, for example) in the database, e.g.:


CREATE TABLE example( column1 INTEGER, column2 VARCHAR(50), column3 DATE NOT NULL, PRIMARY KEY (column1, column2) );
ALTER modies the structure of an existing object in various ways, for example, adding a column to an existing
table or a constraint, e.g.:
ALTER TABLE example ADD column4 NUMBER(3) NOT NULL;
TRUNCATE deletes all data from a table in a very fast way, deleting the data inside the table and not the table
itself. It usually implies a subsequent COMMIT operation, i.e., it cannot be rolled back (data is not written to
the logs for rollback later, unlike DELETE).
TRUNCATE TABLE example;
DROP deletes an object in the database, usually irretrievably, i.e., it cannot be rolled back, e.g.:
DROP TABLE example;

6.2.7

Data types

Each column in an SQL table declares the type(s) that column may contain. ANSI SQL includes the following data
types.[26]
Character strings
CHARACTER(n) or CHAR(n): xed-width n-character string, padded with spaces as needed
CHARACTER VARYING(n) or VARCHAR(n): variable-width string with a maximum size of n characters
NATIONAL CHARACTER(n) or NCHAR(n): xed width string supporting an international character set
NATIONAL CHARACTER VARYING(n) or NVARCHAR(n): variable-width NCHAR string
Bit strings
BIT(n): an array of n bits
BIT VARYING(n): an array of up to n bits
Numbers
INTEGER, SMALLINT and BIGINT
FLOAT, REAL and DOUBLE PRECISION
NUMERIC(precision, scale) or DECIMAL(precision, scale)
For example, the number 123.45 has a precision of 5 and a scale of 2. The precision is a positive integer that
determines the number of signicant digits in a particular radix (binary or decimal). The scale is a non-negative
integer. A scale of 0 indicates that the number is an integer. For a decimal number with scale S, the exact numeric
value is the integer value of the signicant digits divided by 10S .
SQL provides a function to round numerics or dates, called TRUNC (in Informix, DB2, PostgreSQL, Oracle and
MySQL) or ROUND (in Informix, SQLite, Sybase, Oracle, PostgreSQL and Microsoft SQL Server)[27]

64

CHAPTER 6. SQL

Date and time


DATE: for date values (e.g. 2011-05-03)
TIME: for time values (e.g. 15:51:36). The granularity of the time value is usually a tick (100 nanoseconds).
TIME WITH TIME ZONE or TIMETZ: the same as TIME, but including details about the time zone in
question.
TIMESTAMP: This is a DATE and a TIME put together in one variable (e.g. 2011-05-03 15:51:36).
TIMESTAMP WITH TIME ZONE or TIMESTAMPTZ: the same as TIMESTAMP, but including details
about the time zone in question.
SQL provides several functions for generating a date / time variable out of a date / time string (TO_DATE, TO_TIME,
TO_TIMESTAMP), as well as for extracting the respective members (seconds, for instance) of such variables. The
current system date / time of the database server can be called by using functions like NOW. The IBM Informix
implementation provides the EXTEND and the FRACTION functions to increase the accuracy of time, for systems
requiring sub-second precision.[28]

6.2.8

Data control

The Data Control Language (DCL) authorizes users to access and manipulate data. Its two main statements are:
GRANT authorizes one or more users to perform an operation or a set of operations on an object.
REVOKE eliminates a grant, which may be the default grant.
Example:
GRANT SELECT, UPDATE ON example TO some_user, another_user; REVOKE SELECT, UPDATE ON example FROM some_user, another_user;

6.3 Procedural extensions


SQL is designed for a specic purpose: to query data contained in a relational database. SQL is a set-based, declarative
query language, not an imperative language like C or BASIC. However, extensions to Standard SQL add procedural
programming language functionality, such as control-of-ow constructs. These include:
In addition to the standard SQL/PSM extensions and proprietary SQL extensions, procedural and object-oriented
programmability is available on many SQL platforms via DBMS integration with other languages. The SQL standard
denes SQL/JRT extensions (SQL Routines and Types for the Java Programming Language) to support Java code in
SQL databases. SQL Server 2005 uses the SQLCLR (SQL Server Common Language Runtime) to host managed
.NET assemblies in the database, while prior versions of SQL Server were restricted to unmanaged extended stored
procedures primarily written in C. PostgreSQL lets users write functions in a wide variety of languagesincluding
Perl, Python, Tcl, and C.[29]

6.4 Criticism
SQL deviates in several ways from its theoretical foundation, the relational model and its tuple calculus. In that model,
a table is a set of tuples, while in SQL, tables and query results are lists of rows: the same row may occur multiple
times, and the order of rows can be employed in queries (e.g. in the LIMIT clause). Whether this is a common
practical concern, it is also a subject of debate. Furthermore, additional features (such as NULL and views) were
introduced without founding them directly on the relational model, which makes them more dicult to interpret.
Critics argue that SQL should be replaced with a language that strictly returns to the original foundation: for example, see The Third Manifesto. Other critics suggest that Datalog has two advantages over SQL: it has cleaner

6.5. STANDARDIZATION

65

semantics, which facilitates program understanding and maintenance, and it is more expressive, in particular for
recursive queries.[30]
Another criticism is that SQL implementations are incompatible between vendors and do not necessarily completely
follow standards. In particular date and time syntax, string concatenation, NULLs, and comparison case sensitivity
vary from vendor to vendor. A particular exception is PostgreSQL, which strives for standards compliance.[31]
Popular implementations of SQL commonly omit support for basic features of Standard SQL, such as the DATE or
TIME data types. The most obvious such examples, and incidentally the most popular commercial and proprietary
SQL DBMSs, are Oracle (whose DATE behaves as DATETIME,[32][33] and lacks a TIME type)[34] and MS SQL
Server (before the 2008 version). As a result, SQL code can rarely be ported between database systems without
modications.
There are several reasons for this lack of portability between database systems:
The complexity and size of the SQL standard means that most implementors do not support the entire standard.
The standard does not specify database behavior in several important areas (e.g. indexes, le storage...), leaving
implementations to decide how to behave.
The SQL standard precisely species the syntax that a conforming database system must implement. However,
the standards specication of the semantics of language constructs is less well-dened, leading to ambiguity.
Many database vendors have large existing customer bases; where the newer version of the SQL standard
conicts with the prior behavior of the vendors database, the vendor may be unwilling to break backward
compatibility.
There is little commercial incentive for vendors to make it easier for users to change database suppliers (see
vendor lock-in).
Users evaluating database software tend to place other factors such as performance higher in their priorities
than standards conformance.

6.5 Standardization
SQL was adopted as a standard by the American National Standards Institute (ANSI) in 1986 as SQL-86[35] and
the International Organization for Standardization (ISO) in 1987. Nowadays the standard is subject to continuous
improvement by the Joint Technical Committee ISO/IEC JTC 1, Information technology, Subcommittee SC 32, Data
management and interchange, which aliate to ISO as well as IEC. It is commonly denoted by the pattern: ISO/IEC
9075-n:yyyy Part n: title, or, as a shortcut, ISO/IEC 9075.
ISO/IEC 9075 is complemented by ISO/IEC 13249: SQL Multimedia and Application Packages (SQL/MM), which
denes SQL based interfaces and packages to widely spread applications like video, audio and spatial data.
Until 1996, the National Institute of Standards and Technology (NIST) data management standards program certied
SQL DBMS compliance with the SQL standard. Vendors now self-certify the compliance of their products.[36]
The original standard declared that the ocial pronunciation for SQL was an initialism: /skjul/ (es queue
el).[11] Regardless, many English-speaking database professionals (including Donald Chamberlin himself[37] ) use
the acronym-like pronunciation of /sikwl/ (sequel),[38] mirroring the languages pre-release development name
of SEQUEL.[14][15]
The SQL standard has gone through a number of revisions:
Interested parties may purchase SQL standards documents from ISO,[41] IEC or ANSI. A draft of SQL:2008 is freely
available as a zip archive.[42]
The SQL standard is divided into nine parts.
ISO/IEC 9075-1:2011 Part 1: Framework (SQL/Framework). It provides logical concepts.
ISO/IEC 9075-2:2011 Part 2: Foundation (SQL/Foundation). It contains the most central elements of the
language and consists of both mandatory and optional features.

66

CHAPTER 6. SQL
ISO/IEC 9075-3:2008 Part 3: Call-Level Interface (SQL/CLI). It denes interfacing components (structures,
procedures, variable bindings) that can be used to execute SQL statements from applications written in Ada,
C respectively C++, COBOL, Fortran, MUMPS, Pascal or PL/I. (For Java see part 10.) SQL/CLI is dened
in such a way that SQL statements and SQL/CLI procedure calls are treated as separate from the calling
applications source code. Open Database Connectivity is a well-known superset of SQL/CLI. This part of the
standard consists solely of mandatory features.
ISO/IEC 9075-4:2011 Part 4: Persistent Stored Modules (SQL/PSM) It standardizes procedural extensions
for SQL, including ow of control, condition handling, statement condition signals and resignals, cursors and
local variables, and assignment of expressions to variables and parameters. In addition, SQL/PSM formalizes
declaration and maintenance of persistent database language routines (e.g., stored procedures). This part of
the standard consists solely of optional features.
ISO/IEC 9075-9:2008 Part 9: Management of External Data (SQL/MED). It provides extensions to SQL that
dene foreign-data wrappers and datalink types to allow SQL to manage external data. External data is data
that is accessible to, but not managed by, an SQL-based DBMS. This part of the standard consists solely of
optional features.
ISO/IEC 9075-10:2008 Part 10: Object Language Bindings (SQL/OLB). It denes the syntax and semantics
of SQLJ, which is SQL embedded in Java (see also part 3). The standard also describes mechanisms to ensure
binary portability of SQLJ applications, and species various Java packages and their contained classes. This
part of the standard consists solely of optional features, as opposed to SQL/OLB JDBC, which is not part of
the SQL standard, which denes an API.
ISO/IEC 9075-11:2011 Part 11: Information and Denition Schemas (SQL/Schemata). It denes the Information Schema and Denition Schema, providing a common set of tools to make SQL databases and objects
self-describing. These tools include the SQL object identier, structure and integrity constraints, security
and authorization specications, features and packages of ISO/IEC 9075, support of features provided by
SQL-based DBMS implementations, SQL-based DBMS implementation information and sizing items, and
the values supported by the DBMS implementations.[43] This part of the standard contains both mandatory
and optional features.
ISO/IEC 9075-13:2008 Part 13: SQL Routines and Types Using the Java Programming Language (SQL/JRT).
It species the ability to invoke static Java methods as routines from within SQL applications ('Java-in-thedatabase'). It also calls for the ability to use Java classes as SQL structured user-dened types. This part of the
standard consists solely of optional features.
ISO/IEC 9075-14:2011 Part 14: XML-Related Specications (SQL/XML). It species SQL-based extensions
for using XML in conjunction with SQL. The XML data type is introduced, as well as several routines, functions,
and XML-to-SQL data type mappings to support manipulation and storage of XML in an SQL database.[39]
This part of the standard consists solely of optional features.

ISO/IEC 9075 is complemented by ISO/IEC 13249 SQL Multimedia and Application Packages. This closely related
but separate standard is developed by the same committee. It denes interfaces and packages based on SQL. The
aim is a unied access to typical database applications like text, pictures, data mining or spatial data.
ISO/IEC 13249-1:2007 Part 1: Framework
ISO/IEC 13249-2:2003 Part 2: Full-Text
ISO/IEC 13249-3:2011 Part 3: Spatial
ISO/IEC 13249-5:2003 Part 5: Still image
ISO/IEC 13249-6:2006 Part 6: Data mining
ISO/IEC 13249-8:xxxx Part 8: Metadata registries (MDR) (work in progress)

6.6. ALTERNATIVES

67

6.6 Alternatives
A distinction should be made between alternatives to SQL as a language, and alternatives to the relational model
itself. Below are proposed relational alternatives to the SQL language. See navigational database and NoSQL for
alternatives to the relational model.
.QL: object-oriented Datalog
4D Query Language (4D QL)
Datalog
HTSQL: URL based query method
IBM Business System 12 (IBM BS12): one of the rst fully relational database management systems, introduced in 1982
ISBL
jOOQ: SQL implemented in Java as an internal internal domain-specic language
Java Persistence Query Language (JPQL): The query language used by the Java Persistence API and Hibernate
persistence library
LINQ: Runs SQL statements written like language constructs to query collections directly from inside .Net
code.
Object Query Language
OttoQL
QBE (Query By Example) created by Mosh Zloof, IBM 1977
Quel introduced in 1974 by the U.C. Berkeley Ingres project.
Tutorial D
XQuery

6.7 See also


Wikibook SQL
Comparison of object-relational database management systems
Comparison of relational database management systems
D (data language specication)
D4 (programming language)
Hierarchical model
List of relational database management systems
MUMPS
NoSQL
OttoQL
Transact-SQL
Online analytical processing (OLAP)
Online transaction processing (OLTP)

68

CHAPTER 6. SQL
Data warehouse
Data stream processing with SQL
Star schema
Snowake schema

6.8 Notes
[1] Media Type registration for application/sql. Internet Assigned Numbers Authority. 10 April 2013. Retrieved 10 April
2013.
[2] The application/sql Media Type, RFC 6922. Internet Engineering Task Force. April 2013. p. 3. Retrieved 10 April
2013.
[3] Paul, Ryan. A guided tour of the Microsoft Command Shell. Ars Technica. Retrieved 10 April 2011.
[4] Beaulieu, Alan (April 2009). Mary E Treseler, ed. Learning SQL (2nd ed.). Sebastapol, CA, USA: O'Reilly. ISBN
978-0-596-52083-0.
[5] SQL, n.. Oxford English Dictionary. Oxford University Press. Retrieved 2014-11-27.
[6] Encyclopedia Britannica. SQL. Retrieved 2013-04-02.
[7] From Oxford Dictionaries: Denition of SQL - abbreviation, Structured Query Language, an international standard for
database manipulation. Oxford Dictionaries. SQL.
[8] IBM. SQL Guide.
[9] From Microsoft: Structured Query Language, invented at IBM in the 1970s. It is more commonly known by its acronym,
SQL .. Microsoft. Structured Query Language (SQL)".
[10] Codd, Edgar F (June 1970). A Relational Model of Data for Large Shared Data Banks. Communications of the ACM
(Association for Computing Machinery) 13 (6): 37787. doi:10.1145/362384.362685. Retrieved 2007-06-09.
[11] Chapple, Mike. SQL Fundamentals. Databases. About.com. Retrieved 2009-01-28.
[12] Structured Query Language (SQL)". International Business Machines. October 27, 2006. Retrieved 2007-06-10.
[13] ISO/IEC 9075-1:2008: Information technology Database languages SQL Part 1: Framework (SQL/Framework)".
[14] Chamberlin, Donald D; Boyce, Raymond F (1974). SEQUEL: A Structured English Query Language (PDF). Proceedings
of the 1974 ACM SIGFIDET Workshop on Data Description, Access and Control (Association for Computing Machinery):
24964. Retrieved 2007-06-09.
[15] Oppel, Andy (February 27, 2004). Databases Demystied. San Francisco, CA: McGraw-Hill Osborne Media. pp. 901.
ISBN 0-07-146960-5.
[16] History of IBM, 1978. IBM Archives. IBM. Retrieved 2007-06-09.
[17] ANSI/ISO/IEC International Standard (IS). Database Language SQLPart 2: Foundation (SQL/Foundation). 1999.
[18] DECODE. Docs.oracle.com. Retrieved 2013-06-14.
[19] Transact-SQL Reference. SQL Server Language Reference. SQL Server 2005 Books Online. Microsoft. 2007-09-15.
Retrieved 2007-06-17.
[20] Hans-Joachim, K. (2003). Null Values in Relational Databases and Sure Information Answers. Semantics in Databases.
Second International Workshop Dagstuhl Castle, Germany, January 712, 2001. Revised Papers. Lecture Notes in Computer Science 2582. pp. 119138. doi:10.1007/3-540-36596-6_7. ISBN 978-3-540-00957-3.
[21] Ron van der Meyden, "Logical approaches to incomplete information: a survey" in Chomicki, Jan; Saake, Gunter (Eds.)
Logics for Databases and Information Systems, Kluwer Academic Publishers ISBN 978-0-7923-8129-7, p. 344; PS preprint
(note: page numbering diers in preprint from the published version)
[22] ISO/IEC. ISO/IEC 9075-2:2003, SQL/Foundation. ISO/IEC.
[23] M. Negri, G. Pelagatti, L. Sbattella (1989) Semantics and problems of universal quantication in SQL.

6.9. REFERENCES

69

[24] Fratarcangeli, Claudio (1991). Technique for universal quantication in SQL. Retrieved from ACM.org.
[25] Kawash, Jalal (2004) Complex quantication in Structured Query Language (SQL): a tutorial using relational calculus Journal of Computers in Mathematics and Science Teaching ISSN 0731-9258 Volume 23, Issue 2, 2004 AACE Norfolk,
Virginia. Retrieved from Thefreelibrary.com.
[26] Information Technology: Database Language SQL. CMU. (proposed revised text of DIS 9075).
[27] Arie Jones, Ryan K. Stephens, Ronald R. Plew, Alex Kriegel, Robert F. Garrett (2005), SQL Functions Programmers
Reference. Wiley, 127 pages.
[28] http://publib.boulder.ibm.com/infocenter/idshelp/v111/index.jsp?topic=/com.ibm.sqlr.doc/sqlr150.htm
[29] PostgreSQL contributors (2011). PostgreSQL server programming. PostgreSQL 9.1 ocial documentation. postgresql.org. Retrieved 2012-03-09.
[30] http://lbd.udc.es/jornadas2011/actas/PROLE/PROLE/S5/13_article.pdf
[31] PostgreSQL contributors (2012). About PostgreSQL. PostgreSQL 9.1 ocial website. PostgreSQL Global Development
Group. Retrieved March 9, 2012. PostgreSQL prides itself in standards compliance. Its SQL implementation strongly
conforms to the ANSI-SQL:2008 standard
[32] Lorentz, Diana; Roeser, Mary Beth; Abraham, Sundeep; Amor, Angela; Arora, Geeta; Arora, Vikas; Ashdown, Lance;
Baer, Hermann; Bellamkonda, Shrikanth (October 2010) [1996]. Basic Elements of Oracle SQL: Data Types. Oracle
Database SQL Language Reference 11g Release 2 (11.2). Oracle Database Documentation Library. Redwood City, CA:
Oracle USA, Inc. Retrieved December 29, 2010. For each DATE value, Oracle stores the following information: century,
year, month, date, hour, minute, and second
[33] Lorentz, Diana; Roeser, Mary Beth; Abraham, Sundeep; Amor, Angela; Arora, Geeta; Arora, Vikas; Ashdown, Lance;
Baer, Hermann; Bellamkonda, Shrikanth (October 2010) [1996]. Basic Elements of Oracle SQL: Data Types. Oracle
Database SQL Language Reference 11g Release 2 (11.2). Oracle Database Documentation Library. Redwood City, CA:
Oracle USA, Inc. Retrieved December 29, 2010. The datetime data types are DATE...
[34] Lorentz, Diana; Roeser, Mary Beth; Abraham, Sundeep; Amor, Angela; Arora, Geeta; Arora, Vikas; Ashdown, Lance;
Baer, Hermann; Bellamkonda, Shrikanth (October 2010) [1996]. Basic Elements of Oracle SQL: Data Types. Oracle
Database SQL Language Reference 11g Release 2 (11.2). Oracle Database Documentation Library. Redwood City, CA:
Oracle USA, Inc. Retrieved December 29, 2010. Do not dene columns with the following SQL/DS and DB2 data types,
because they have no corresponding Oracle data type:... TIME
[35] Finding Aid. X3H2 Records, 197895. American National Standards Institute.
[36] Doll, Shelley (June 19, 2002). Is SQL a Standard Anymore?". TechRepublics Builder.com. TechRepublic. Archived
from the original on 2013-01-02. Retrieved 2010-01-07.
[37] Gillespie, Patrick. Pronouncing SQL: S-Q-L or Sequel?". Pronouncing SQL: S-Q-L or Sequel?. Retrieved 12 February
2012.
[38] Melton, Jim; Alan R Simon (1993). 1.2. What is SQL?". Understanding the New SQL: A Complete Guide. Morgan
Kaufmann. p. 536. ISBN 1-55860-245-3. SQL (correctly pronounced ess cue ell, instead of the somewhat common
sequel)...
[39] Wagner, Michael (2010). SQL/XML:2006 - Evaluierung der Standardkonformitt ausgewhlter Datenbanksysteme. Diplomica Verlag. p. 100. ISBN 3-8366-9609-6.
[40] "SQL:2008 now an approved ISO international standard. Sybase. July 2008.
[41] ISO/IEC 9075-2:2011: Information technology -- Database languages -- SQL -- Part 2: Foundation (SQL/Foundation)".
[42] "SQL:2008 draft (ZIP). Whitemarsh Information Systems Corporation.
[43] ISO/IEC 9075-11:2008: Information and Denition Schemas (SQL/Schemata)". 2008. p. 1.

6.9 References
Codd, Edgar F (June 1970). A Relational Model of Data for Large Shared Data Banks. Communications of
the ACM 13 (6): 37787. doi:10.1145/362384.362685.
Discussion on alleged SQL aws (C2 wiki)
C. J. Date with Hugh Darwen: A Guide to the SQL standard : a users guide to the standard database language
SQL, 4th ed., Addison Wesley, USA 1997, ISBN 978-0-201-96426-4

70

CHAPTER 6. SQL

6.10 External links


1995 SQL Reunion: People, Projects, and Politics, by Paul McJones (ed.): transcript of a reunion meeting
devoted to the personal history of relational databases and SQL.
American National Standards Institute. X3H2 Records, 19781995 Charles Babbage Institute Collection documents the H2 committees development of the NDL and SQL standards.
Oral history interview with Donald D. Chamberlin Charles Babbage Institute In this oral history Chamberlin
recounts his early life, his education at Harvey Mudd College and Stanford University, and his work on relational
database technology. Chamberlin was a member of the System R research team and, with Raymond F. Boyce,
developed the SQL database language. Chamberlin also briey discusses his more recent research on XML
query languages.
Comparison of Dierent SQL Implementations This comparison of various SQL implementations is intended
to serve as a guide to those interested in porting SQL code between various RDBMS products, and includes
comparisons between SQL:2008, PostgreSQL, DB2, MS SQL Server, MySQL, Oracle, and Informix.
Event stream processing with SQL - An introduction to real-time processing of streaming data with continuous
SQL queries

Chapter 7

NoSQL
Structured storage redirects here. For the Microsoft technology also known as structured storage, see COM Structured Storage.
A NoSQL (often interpreted as Not only SQL[1][2] ) database provides a mechanism for storage and retrieval of data
that is modeled in means other than the tabular relations used in relational databases. Motivations for this approach
include simplicity of design, horizontal scaling, and ner control over availability. The data structures used by NoSQL
databases (e.g. key-value, graph, or document) dier from those used in relational databases, making some operations
faster in NoSQL and others faster in relational databases. The particular suitability of a given NoSQL database
depends on the problem it must solve.
NoSQL databases are increasingly used in big data and real-time web applications.[3] NoSQL systems are also called
Not only SQL to emphasize that they may also support SQL-like query languages. Many NoSQL stores compromise
consistency (in the sense of the CAP theorem) in favor of availability and partition tolerance. Barriers to the greater
adoption of NoSQL stores include the use of low-level query languages, the lack of standardized interfaces, and huge
investments in existing SQL.[4] Most NoSQL stores lack true ACID transactions, although a few recent systems, such
as FairCom c-treeACE, Google Spanner (though technically a NewSQL database), FoundationDB and OrientDB
have made them central to their designs. (See table Join and ACID Support.)

7.1 History
Carlo Strozzi used the term NoSQL in 1998 to name his lightweight, open-source relational database that did not expose the standard SQL interface.[5] Strozzi suggests that, as the current NoSQL movement departs from the relational
model altogether; it should therefore have been called more appropriately 'NoREL'",[6] referring to 'No Relational'.
Eric Evans reintroduced the term NoSQL in early 2009 when Johan Oskarsson of Last.fm organized an event to discuss
open-source distributed databases.[7] The name attempted to label the emergence of an increasing number of nonrelational, distributed data stores. Most of the early NoSQL systems did not attempt to provide atomicity, consistency,
isolation and durability guarantees, contrary to the prevailing practice among relational database systems.[8]

7.2 Types of NoSQL databases


There have been various approaches to classify NoSQL databases, each with dierent categories and subcategories.
Because of the variety of approaches and overlaps it is dicult to get and maintain an overview of non-relational
databases. Nevertheless, a basic classication is based on data model. A few examples in each category are:
Column: Accumulo, Cassandra, Druid, HBase, Vertica
Document: Lotus Notes, Clusterpoint, Apache CouchDB, Couchbase, Forerunner, JOQULAR,MarkLogic,
MongoDB, OrientDB, Qizx
71

72

CHAPTER 7. NOSQL
Key-value: CouchDB, Dynamo, FoundationDB, MemcacheDB, Redis, Riak, FairCom c-treeACE, Aerospike,
OrientDB, MUMPS
Graph: Allegro, Neo4J, InniteGraph, OrientDB, Virtuoso, Stardog
Multi-model: OrientDB, FoundationDB, ArangoDB, Alchemy Database, CortexDB

A more detailed classication is the following, based on one from Stephen Yen:[9]

7.3 Performance
Ben Scoeld rated dierent categories of NoSQL databases as follows:

[10]

Performance and scalability comparisons are sometimes done with the YCSB benchmark.
See also: Comparison of structured storage software

7.4 Handling relational data


Since most NoSQL databases lack ability for joins in queries, the database schema generally needs to be designed
dierently. There are three main techniques for handling relational data in a NoSQL database. (See table Join and
ACID Support for NoSQL databases that support joins.)

7.4.1

Multiple queries

Instead of retrieving all the data with one query, its common to do several queries to get the desired data. NoSQL
queries are often faster than traditional SQL queries so the cost of having to do additional queries may be acceptable.
If an excessive number of queries would be necessary, one of the other two approaches is more appropriate.

7.4.2

Caching/replication/non-normalized data

Instead of only storing foreign keys, its common to store actual foreign values along with the models data. For
example, each blog comment might include the username in addition to a user id, thus providing easy access to the
username without requiring another lookup. When a username changes however, this will now need to be changed
in many places in the database. Thus this approach works better when reads are much more common than writes.[11]

7.4.3

Nesting data

With document databases like MongoDB its common to put more data in a smaller number of collections. For
example in a blogging application, one might choose to store comments within the blog post document so that with
a single retrieval one gets all the comments. Thus in this approach a single document contains all the data you need
for a specic task.

7.5 Examples
7.5.1

Document store

Main articles: Document-oriented database and XML database


The central concept of a document store is the notion of a document. While each document-oriented database
implementation diers on the details of this denition, in general, they all assume that documents encapsulate and

7.5. EXAMPLES

73

encode data (or information) in some standard formats or encodings. Encodings in use include XML, YAML, and
JSON as well as binary forms like BSON.
Dierent implementations oer dierent ways of organizing and/or grouping documents:
Collections
Tags
Non-visible Metadata
Directory hierarchies
Compared to relational databases, for example, collections could be considered analogous to tables and documents
analogous to records. But they are dierent: every record in a table has the same sequence of elds, while documents
in a collection may have elds that are completely dierent.
Documents are addressed in the database via a unique key that represents that document. One of the other dening
characteristics of a document-oriented database is that, beyond using the simple key-document (or key-value) lookup
to retrieve a document, the database oers an API or query language that retrieves documents based on their contents.
Document store databases and their query language

7.5.2

Graph

Main article: Graph database


This kind of database is designed for data whose relations are well represented as a graph (elements interconnected
with an undetermined number of relations between them). The kind of data could be social relations, public transport
links, road maps or network topologies, for example.
Graph databases and their query language

7.5.3

Key-value stores

Key-value (KV) stores use the associative array (also known as a map or dictionary) as their fundamental data model.
In this model, data is represented as a collection of key-value pairs, such that each possible key appears at most once
in the collection.[12][13]
The key-value model is one of the simplest non-trivial data models, and richer data models are often implemented on
top of it. The key-value model can be extended to an ordered model that maintains keys in lexicographic order. This
extension is powerful, in that it can eciently process key ranges.[14]
Key-value stores can use consistency models ranging from eventual consistency to serializability. Some support ordering of keys. Some maintain data in memory (RAM), while others employ solid-state drives or rotating disks. Here
is a list of key-value stores:
KV - eventually consistent
Dynamo
Riak[15]
KV - ordered
Berkeley DB
FairCom c-treeACE/c-treeRTG

74

CHAPTER 7. NOSQL
FoundationDB
IBM Informix C-ISAM
InnityDB
LMDB
MemcacheDB
NDBM

KV - RAM
Aerospike
Coherence
FairCom c-treeACE
Hazelcast
memcached
OpenLink Virtuoso
redis
XAP
KV - solid-state drive or rotating disk
Aerospike
BigTable
CDB
Clusterpoint Database Server
Couchbase Server
FairCom c-treeACE
GT.M[16]
Hibari
Keyspace
LevelDB
LMDB
MemcacheDB (using Berkeley DB)
MongoDB
NoSQLz
Coherence
Oracle NoSQL Database
OpenLink Virtuoso
Tarantool
Tokyo Cabinet
Tuple space

7.5. EXAMPLES

7.5.4

Object database

Main article: Object database

db4o
GemStone/S
InterSystems Cach
JADE
JOQULAR
NeoDatis ODB
ObjectDatabase++
ObjectDB
Objectivity/DB
ObjectStore
ODABA
Perst
OpenLink Virtuoso
Versant Object Database
ZODB

7.5.5

Tabular

Apache Accumulo
BigTable
Apache Hbase
Hypertable
Mnesia
OpenLink Virtuoso

7.5.6

Tuple store

Apache River
GigaSpaces
Tarantool
TIBCO ActiveSpaces
OpenLink Virtuoso

75

76

CHAPTER 7. NOSQL

7.5.7

Triple/quad store (RDF) database

Apache JENA
MarkLogic
Ontotext-OWLIM
Oracle NoSQL database
SparkleDB
Virtuoso Universal Server
Stardog

7.5.8

Hosted

Amazon DynamoDB
Datastore on Google Appengine
Clusterpoint database
Cloudant Data Layer (CouchDB)
Freebase
OpenLink Virtuoso

7.5.9

Multivalue databases

D3 Pick database
Extensible Storage Engine (ESE/NT)
InnityDB
InterSystems Cach
Northgate Information Solutions Reality, the original Pick/MV Database
OpenQM
Revelation Softwares OpenInsight
Rocket U2

7.5.10

Multimodel database

OrientDB
FoundationDB

7.5.11

Correlation database

7.5.12

Cell database

=== ACID and JOIN Support


If a database is marked as supporting ACID or Joins, then the documentation for the database makes that claim. The
degree to which the capability is fully supported in a manner similar to most SQL databases or the degree to which
it meets the needs of a specic application it left up to the reader to asses.

7.6. SEE ALSO

77

7.6 See also


CAP theorem
Comparison of object database management systems
Comparison of structured storage software
Correlation database
Distributed cache
Faceted search
MultiValue database
Multi-model database
Triplestore

7.7 References
[1] NoSQL (Not Only SQL)". NoSQL database, also called Not Only SQL
[2] Martin Fowler. NosqlDenition. many advocates of NoSQL say that it does not mean a no to SQL, rather it means
Not Only SQL
[3] RDBMS dominate the database market, but NoSQL systems are catching up. DB-Engines.com. 21 Nov 2013. Retrieved
24 Nov 2013.
[4] K. Grolinger, W.A. Higashino, A. Tiwari, M.A.M. Capretz (2013). Data management in cloud environments: NoSQL
and NewSQL data stores (PDF). JoCCASA, Springer. Retrieved 8 Jan 2014.
[5] Lith, Adam; Jakob Mattson (2010). Investigating storage solutions for large data: A comparison of well performing
and scalable data storage solutions for real time extraction and batch insertion of data (PDF). Gteborg: Department of
Computer Science and Engineering, Chalmers University of Technology. p. 70. Retrieved 12 May 2011. Carlo Strozzi
rst used the term NoSQL in 1998 as a name for his open source relational database that did not oer a SQL interface[...]
[6] NoSQL Relational Database Management System: Home Page. Strozzi.it. 2 October 2007. Retrieved 29 March 2010.
[7] NoSQL 2009. Blog.sym-link.com. 12 May 2009. Retrieved 29 March 2010.
[8] Mike Chapple. The ACID Model.
[9] Yen, Stephen. NoSQL is a Horseless Carriage (PDF). NorthScale. Retrieved 2014-06-26..
[10] Scoeld, Ben (2010-01-14). NoSQL - Death to Relational Databases(?)". Retrieved 2014-06-26.
[11] Making the Shift from Relational to NoSQL (PDF). Couchbase.com. Retrieved December 5, 2014.
[12] Sandy (14 January 2011). Key Value stores and the NoSQL movement. http://dba.stackexchange.com/questions/607/
what-is-a-key-value-store-database: Stackexchange. Retrieved 1 January 2012. Key-value stores allow the application
developer to store schema-less data. This data usually consists of a string that represents the key, and the actual data that is
considered the value in the key-value relationship. The data itself is usually some kind of primitive of the programming
language (a string, an integer, or an array) or an object that is being marshaled by the programming languages bindings to
the key-value store. This structure replaces the need for a xed data model and allows proper formatting.
[13] Marc Seeger (21 September 2009). Key-Value Stores: a practical overview (PDF). http://blog.marc-seeger.de/2009/
09/21/key-value-stores-a-practical-overview/: Marc Seeger. Retrieved 1 January 2012. Key-value stores provide a highperformance alternative to relational database systems with respect to storing and accessing data. This paper provides a
short overview of some of the currently available key-value stores and their interface to the Ruby programming language.
[14] Ilya Katsov (1 March 2012). NoSQL Data Modeling Techniques. Ilya Katsov. Retrieved 8 May 2014.
[15] Riak: An Open Source Scalable Data Store. 28 November 2010. Retrieved 28 November 2010 * OpenLink Virtuoso
Project Voldemort. Check date values in: |accessdate= (help)

78

CHAPTER 7. NOSQL

[16] Tweed, Rob; George James (2010). A Universal NoSQL Engine, Using a Tried and Tested Technology (PDF). p. 25.
Without exception, the most successful and well-known of the NoSQL databases have been developed from scratch, all
within just the last few years. Strangely, it seems that nobody looked around to see whether there were any existing, successfully implemented database technologies that could have provided a sound foundation for meeting Web-scale demands.
Had they done so, they might have discovered two products, GT.M and Cach.....*

7.8 Further reading


Pramod Sadalage and Martin Fowler (2012). NoSQL Distilled: A Brief Guide to the Emerging World of Polyglot
Persistence. Addison-Wesley. ISBN 0-321-82662-0.
Dan McCreary & Ann Kelly (2013). Making Sense of NoSQL: A guide for managers and the rest of us. ISBN
9781617291074.
Christof Strauch (2012). NoSQL Databases (PDF).
Moniruzzaman AB, Hossain SA (2013). NoSQL Database: New Era of Databases for Big data Analytics Classication, Characteristics and Comparison.
Kai Orend (2013). Analysis and Classication of NoSQL Databases and Evaluation of their Ability to Replace
an Object-relational Persistence Layer.
Ganesh Krishnan, Sarang Kulkarni, Dharmesh Kirit Dadbhawala. Method and system for versioned sharing,
consolidating and reporting information.

7.9 External links


Christoph Strauch. NoSQL whitepaper (PDF). Hochschule der Medien, Stuttgart.
Stefan Edlich. NoSQL database List.
Peter Neubauer (2010). Graph Databases, NOSQL and Neo4j.
Sergey Bushik (2012). A vendor-independent comparison of NoSQL databases: Cassandra, HBase, MongoDB, Riak. NetworkWorld.
Prof. PhD Roberto V. Zicari (2014). NoSQL Data Stores Articles, Papers, Presentations. odbms.org.

Chapter 8

NewSQL
NewSQL is a class of modern relational database management systems that seek to provide the same scalable performance of NoSQL systems for online transaction processing (OLTP) read-write workloads while still maintaining
the ACID guarantees of a traditional database system.[1][2][3]

8.1 History
The term was rst used by 451 Group analyst Matthew Aslett in a 2011 research paper discussing the rise of new
database systems as challengers to established vendors.[4] Many enterprise systems that handle high-prole data (e.g.,
nancial and order processing systems) also need to be able to scale but are unable to use NoSQL solutions because
they cannot give up strong transactional and consistency requirements.[4][5] The only options previously available for
these organizations were to either purchase a more powerful single-node machine or develop custom middleware that
distributes queries over traditional DBMS nodes. Both approaches are prohibitively expensive and thus are not an
option for many. Thus, in this paper, Aslett discusses how NewSQL upstarts are poised to challenge the supremacy
of commercial vendors, in particular Oracle.

8.2 Systems
Although NewSQL systems vary greatly in their internal architectures, the two distinguishing features common
amongst them is that they all support the relational data model and use SQL as their primary interface.[6] The applications targeted by these NewSQL systems are characterized as having a large number of transactions that (1) are
short-lived (i.e., no user stalls), (2) touch a small subset of data using index lookups (i.e., no full table scans or large
distributed joins), and (3) are repetitive (i.e. executing the same queries with dierent inputs).[7] These NewSQL
systems achieve high performance and scalability by eschewing much of the legacy architecture of the original IBM
System R design, such as heavyweight recovery or concurrency control algorithms.[8] One of the rst known NewSQL
systems is the H-Store parallel database system.[9][10]
NewSQL systems can be loosely grouped into three categories:

8.2.1

[11][12]

New architectures

The rst type of NewSQL systems are completely new database platforms. These are designed to operate in a distributed cluster of shared-nothing nodes, in which each node owns a subset of the data. These databases are often
written from scratch with a distributed architecture in mind, and include components such as distributed concurrency control, ow control, and distributed query processing. Example systems in this category are Google Spanner, Clustrix, VoltDB, MemSQL, Pivotal's SQLFire and GemFire XD, SAP HANA,[13] FoundationDB, NuoDB,
Innitum, [14] [15][16] TransLattice, ActorDB,[17] and Trafodion.[18]
79

80

CHAPTER 8. NEWSQL

8.2.2

SQL Engines

The second category are highly optimized storage engines for SQL. These systems provide the same programming
interface as SQL, but scale better than built-in engines, such as InnoDB. Examples of these new storage engines
include Infobright, TokuDB and the now defunct InniDB.

8.2.3

Transparent sharding

These systems provide a sharding middleware layer to automatically split databases across multiple nodes. Examples
of this type of system includes dbShards, Scalearc, and ScaleBase.

8.3 See also


Transaction processing
Partition (database)

8.4 References
[1] Aslett, Matthew (2011). How Will The Database Incumbents Respond To NoSQL And NewSQL?" (PDF). 451 Group
(published 2011-04-04). Retrieved 2012-07-06.
[2] Stonebraker, Michael (2011-06-16). NewSQL: An Alternative to NoSQL and Old SQL for New OLTP Apps. Communications of the ACM Blog. Retrieved 2012-07-06.
[3] Ho, Todd (2012-09-24). Google Spanners Most Surprising Revelation: NoSQL is Out and NewSQL is In. Retrieved
2012-10-07.
[4] Aslett, Matthew (2010). What we talk about when we talk about NewSQL. 451 Group (published 2011-04-06). Retrieved 2012-10-07.
[5] Lloyd, Alex (2012). Building Spanner. Berlin Buzzwords (published 2012-06-05). Retrieved 2012-10-07.
[6] Cattell, R. (2011). Scalable SQL and NoSQL data stores (PDF). ACM SIGMOD Record 39 (4): 12. doi:10.1145/1978915.1978919.
[7] Stonebraker, Mike et al. (2007). The end of an architectural era: (its time for a complete rewrite (PDF). VLDB '07:
Proceedings of the 33rd international conference on Very large data bases. Vienna, Austria.
[8] Stonebraker, M.; Cattell, R. (2011). 10 rules for scalable performance in 'simple operation' datastores. Communications
of the ACM 54 (6): 72. doi:10.1145/1953122.1953144.
[9] Aslett, Matthew (2008). Is H-Store the future of database management systems?" (published 2008-03-04). Retrieved
2012-07-05.
[10] Dignan, Larry (2008). H-Store: Complete destruction of the old DBMS order?". Retrieved 2012-07-05.
[11] Venkatesh, Prasanna (2012). NewSQL - The New Way to Handle Big Data (published 2012-01-30). Retrieved 201210-07.
[12] Levari, Doron (2011). The NewSQL Market Breakdown. Retrieved 2012-04-08.
[13] SAP HANA. SAP. Retrieved 17 July 2014.
[14] Innitum: High Performance Distributed Computing Database. 2012.
[15] Proctor, Seth (2013). Exploring the Architecture of the NuoDB Database, Part 1. Retrieved 2013-07-12.
[16] Proctor, Seth (2013). Exploring the Architecture of the NuoDB Database, Part 2. Retrieved 2013-07-17.
[17] ActorDB a distributed SQL database. 2014.
[18] Trafodion: Transactional SQL-on-HBase. 2014.

Chapter 9

XML database
An XML database is a data persistence software system that allows data to be specied, and sometimes stored,
in XML format. These data can then be queried, transformed, exported and returned to a calling system. XML
databases are a avor of document-oriented databases which are in turn a category of NoSQL database (meaning
Not (only) SQL).

9.1 Rationale for XML in databases


There are a number of reasons to directly specify data in XML or other document formats such as JSON. For XML
in particular, they include:
An enterprise may have a lot of XML in an existing standard format
Data may need to be exposed or ingested as XML, so using another format such as relational forces doublemodeling of the data
XML is very well suited to sparse data, deeply nested data and mixed content (such as text with embedded
markup tags)
XML is human readable whereas relational tables require expertise to access
Metadata is often available as XML
Semantic web data is available as RDF/XML
[1] [2]

O'Connell gives one reason for the use of XML in databases: the increasingly common use of XML for data transport,
which has meant that data is extracted from databases and put into XML documents and vice-versa.[3] It may prove
more ecient (in terms of conversion costs) and easier to store the data in XML format. In content-based applications,
the ability of the native XML database also minimizes the need for extraction or entry of metadata to support searching
and navigation.

9.2 XML Enabled databases


XML enabled databases typically oer one or more of the following approaches to storing XML within the traditional
relational structure:
1. XML is stored into a CLOB (Character large object)
2. XML is `shredded` into a series of Tables based on a Schema[4]
3. XML is stored into a native XML Type as dened by ISO Standard 9075-14[5]
81

82

CHAPTER 9. XML DATABASE

RDBMS that support the ISO XML Type are:


1. IBM DB2 (pureXML[6] )
2. Microsoft SQL Server[7]
3. Oracle Database[8]
4. PostgreSQL[9] [10]
Typically an XML enabled database is best suited where the majority of data are non-XML. For datasets where the
majority of data are XML, a native XML database is better suited.

9.2.1

Example of XML Type Query in IBM DB2 SQL

SELECT id, vol, xmlquery('$j/name', passing journal AS j) AS name FROM journals WHERE xmlexists('$j[licence="CreativeComm
passing journal AS j)

9.3 Native XML databases


These databases are typically better when much of the data is in XML or other non-relational formats.
BaseX http://basex.org/
eXistDB http://exist-db.org/exist/apps/homepage/index.html
MarkLogic http://marklogic.com
All the above databases uses XML as an interface to specify documents as tree structured data that may contain
unstructured text, but on disk the data is stored as optimized binary les. This makes query and retrieval faster. For
MarkLogic it also allows XML and JSON to co-exist in one binary format.[11]
Key features of native XML databases include:
Has an XML document as at least one fundamental unit of (logical) storage, just as a relational database has a
row in a table as a fundamental unit of (logical) storage.
Need not have any particular underlying physical storage model. For example, NXDs can use optimized, proprietary storage formats. This is a key aspect of XML databases. Managing XML as large strings is inecient
due to the extra markup in XML. Compressing and indexing XML allows the illusion of directly accessing,
querying and transforming XML while gaining the performance advantages of working with optimized binary
tree structures.[12]
The standards for XML querying per W3C recommendation are XQuery 1.0 and XQuery 3.0. XQuery includes
XPath as a sub-language and XML itself is a valid sub-syntax of XQuery.
In addition to XPath, XML databases support XSLT as a method of transforming documents or query-results retrieved
from the database. XSLT provides a declarative language written using an XML grammar. It aims to dene a set
of XPath lters that can transform documents (in part or in whole) into other formats including plain text, XML, or
HTML.
But big picture, XML persistence describes only one format in the larger, faster moving NoSQL movement at this
time. Many databases support XML plus other formats, even if XML is internally stored as an optimized, highperformance format and is a rst-class citizen within the database. (see Google Trends Link above to see relative
popularity of terms).

9.4. REFERENCES

9.3.1

Language features

9.3.2

Supported APIs

83

9.4 References
[1] Nicola, Matthias (28 September 2010). 5 Reasons for Storing XML in a Database. Native XML Database. Retrieved 17
March 2015.
[2] Feldman, Damon (11 April 2013). Moving from Relational Modeling to XML and MarkLogic Data Models. MarkLogic
World. Retrieved 17 March 2015.
[3] O'Connell, S. (2005). Section 9.2. Advanced Databases Course Notes (Syllabus) (Southampton, England: University of
Southampton).
[4] XML Schema Storage and Query: Basic. Oracle XML DB Developers Guide, 10g Release 2. Oracle Corporation. August
2005. Retrieved 17 March 2015.. Section Creating XMLType Tables and Columns Based on XML Schema
[5] ISO/IEC 9075-14:2011: Information technology -- Database languages -- SQL -- Part 14: XML-Related Specications
(SQL/XML)". International Organization for Standardization. 2011. Retrieved 17 March 2015.
[6] pureXML overview -- DB2 as an XML database. IBM Knowledge Center. IBM. Retrieved 17 March 2015.
[7] Using XML in SQL Server. Microsoft Developer Network. Microsoft Corporation. Retrieved 17 March 2015.
[8] XMLType Operations. Oracle XML DB Developers Guide, 10g Release 2. Oracle Corporation. August 2005. Retrieved
17 March 2015.
[9] 8.13. XML Type. PostgreSQL 9.0.19 Documentation. Retrieved 17 March 2015.
[10] PostgreSQL - Data Types - XML Type
[11] Siegel, Erik; Retter, Adam (December 2014). 4. Architecture. eXist. O'Reilly & Associates. ISBN 978-1-4493-3710-0.
Retrieved 18 March 2015.
[12] Kellogg, Dave (11 April 2010). Yes, Virginia, MarkLogic is a NoSQL System. Kellblog. Retrieved 18 March 2015.
[13] XQuery Update Extension. Retrieved 18 March 2015.

9.5 External links


XML Databases - The Business Case, Charles Foster, June 2008 - Talks about the current state of Databases
and data persistence, how the current Relational Database model is starting to crack at the seams and gives an
insight into a strong alternative for todays requirements.
An XML-based Database of Molecular Pathways (2005-06-02) Speed / Performance comparisons of eXist,
X-Hive, Sedna and Qizx/open
XML Native Database Systems: Review of Sedna, Ozone, NeoCoreXMS 2006
XML Data Stores: Emerging Practices
Bhargava, P.; Rajamani, H.; Thaker, S.; Agarwal, A. (2005) XML Enabled Relational Databases, Texas, The
University of Texas at Austin.
Initiative for XML Databases
XML and Databases, Ronald Bourret, September 2005
The State of Native XML Databases, Elliotte Rusty Harold, August 13, 2007
Qualcomm Qizx Ocial website

Chapter 10

Data denition language


A data denition language or data description language (DDL) is a syntax similar to a computer programming
language for dening data structures, especially database schemas.

10.1 History
The data denition language concept and name was rst introduced in relation to the Codasyl database model, where
the schema of the database was written in a language syntax describing the records, elds, and sets of the user
data model.[1] Later it was used to refer to a subset of Structured Query Language (SQL) for creating tables and
constraints. SQL-92 introduced a schema manipulation language and schema information tables to query schemas.
These information tables were specied as SQL/Schemata in SQL:2003. The term DDL is also used in a generic
sense to refer to any formal language for describing data or information structures.

10.2 SQL
Many data description languages use a declarative syntax to dene elds and data types. SQL, however, uses a
collection of imperative verbs whose eect is to modify the schema of the database by adding, changing, or deleting
denitions of tables or other objects. These statements can be freely mixed with other SQL statements, so the DDL
is not truly a separate language.

10.2.1

CREATE statements

Create - To make a new database, table, index, or stored procedure.


A CREATE statement in SQL creates an object in a relational database management system (RDBMS). In the SQL
1992 specication, the types of objects that can be created are schemas, tables, views, domains, character sets, collations, translations, and assertions. Many implementations extend the syntax to allow creation of additional objects,
such as indexes and user proles. Some systems (such as PostgreSQL) allow CREATE, and other DDL commands,
inside a transaction and thus they may be rolled back.
CREATE TABLE statement
A commonly used CREATE command is the CREATE TABLE command. The typical usage is:
CREATE TABLE [table name] ( [column denitions] ) [table parameters].
column denitions: A comma-separated list consisting of any of the following
Column denition: [column name] [data type] {NULL | NOT NULL} {column options}
Primary key denition: PRIMARY KEY ( [comma separated column list] )
84

10.2. SQL

85

Constraints: {CONSTRAINT} [constraint denition]


RDBMS specic functionality
For example, the command to create a table named employees with a few sample columns would be:
CREATE TABLE employees ( id INTEGER PRIMARY KEY, rst_name VARCHAR(50) NOT NULL, last_name
VARCHAR(75) NOT NULL, fname VARCHAR(50) NOT NULL, dateofbirth DATE NULL );
Note that some forms of CREATE TABLE DDL may incorporate DML (data manipulation language)-like constructs
as well, such as the CREATE TABLE AS SELECT (CTAS) syntax of SQL.[2]

10.2.2

DROP statements

Drop - To destroy an existing database, table, index, or view.


A DROP statement in SQL removes an object from a relational database management system (RDBMS). The types
of objects that can be dropped depends on which RDBMS is being used, but most support the dropping of tables,
users, and databases. Some systems (such as PostgreSQL) allow DROP and other DDL commands to occur inside
of a transaction and thus be rolled back. The typical usage is simply:
DROP objecttype objectname.
For example, the command to drop a table named employees would be:
DROP TABLE employees;
The DROP statement is distinct from the DELETE and TRUNCATE statements, in that DELETE and TRUNCATE
do not remove the table itself. For example, a DELETE statement might delete some (or all) data from a table while
leaving the table itself in the database, whereas a DROP statement would remove the entire table from the database.

10.2.3

ALTER statements

Alter - To modify an existing database object.


An ALTER statement in SQL changes the properties of an object inside of a relational database management system
(RDBMS). The types of objects that can be altered depends on which RDBMS is being used. The typical usage is:
ALTER objecttype objectname parameters.
For example, the command to add (then remove) a column named bubbles for an existing table named sink would
be:
ALTER TABLE sink ADD bubbles INTEGER; ALTER TABLE sink DROP COLUMN bubbles;

10.2.4

rename statement

Rename - to rename the table. for example


RENAME TABLE old_name TO new_name;

10.2.5

Referential integrity statements

Finally, another kind of DDL sentence in SQL is one used to dene referential integrity relationships, usually implemented as primary key and foreign key tags in some columns of the tables.
These two statements can be included inside a CREATE TABLE or an ALTER TABLE sentence.

86

CHAPTER 10. DATA DEFINITION LANGUAGE

10.3 Other languages


ple of a DDL for XML
DML means(Data Manipulation Language) it is set of commands that operate in a database e.g.Insert delete
etc.
DCL means (Data Control Language ) determine whether a user is permitted to perform commit roll back etc
action

10.4 See also


Data manipulation language
Data control language
Select (SQL)
Insert (SQL)
Update (SQL)
Delete (SQL)

10.5 References
[1] Olle, T. William (1978). The Codasyl Approach to Data Base Management. Wiley. ISBN 0-471-99579-7.
[2] Allen, Grant (2010). The Denitive Guide to SQLite. Apresspod. Mike Owens (2 ed.). Apress. p. 368. ISBN 9781430232254.
Retrieved 2012-10-02. The create table statement has a special syntax for creating tables from select statements. [...]: [...]
create table foods2 as select * from foods; [...] Many other databases refer to this approach as CTAS, which stands for
Create Table As Select, and that phrase is not uncommon among SQLite users.

10.6 External links


How to change data type of a column MS SQL - How to change data type of a column

Chapter 11

Data manipulation language


A data manipulation language (DML) is a family of syntax elements similar to a computer programming language used for selecting, inserting, deleting and updating data in a database. Performing read-only queries of data is
sometimes also considered a component of DML.
A popular data manipulation language is that of Structured Query Language (SQL), which is used to retrieve and
manipulate data in a relational database.[1] Other forms of DML are those used by IMS/DLI, CODASYL databases,
such as IDMS and others.
Data manipulation language comprises the SQL data change statements,[2] which modify stored data but not the
schema or database objects. Manipulation of persistent database objects, e.g., tables or stored procedures, via the
SQL schema statements,[2] rather than the data stored within them, is considered to be part of a separate data denition
language. In SQL these two categories are similar in their detailed syntax, data types, expressions etc., but distinct in
their overall function.[2]
Data manipulation languages have their functional capability organized by the initial word in a statement, which is
almost always a verb. In the case of SQL, these verbs are:
SELECT ... FROM ... WHERE ...
INSERT INTO ... VALUES ...
UPDATE ... SET ... WHERE ...
DELETE FROM ... WHERE ...
The purely read-only SELECT query statement is classed with the 'SQL-data' statements[2] and so is considered by
the standard to be outside of DML. The SELECT ... INTO form is considered to be DML because it manipulates
(i.e. modies) data. In common practice though, this distinction is not made and SELECT is widely considered to
be part of DML.[3]
Most SQL database implementations extend their SQL capabilities by providing imperative, i.e. procedural languages. Examples of these are Oracle's PL/SQL and DB2's SQL_PL.
Data manipulation languages tend to have many dierent avors and capabilities between database vendors. There
have been a number of standards established for SQL by ANSI,[1] but vendors still provide their own extensions to
the standard while not implementing the entire standard.
Data manipulation languages are divided into two types, procedural programming and declarative programming.
Data manipulation languages were initially only used within computer programs, but with the advent of SQL have
come to be used interactively by database administrators.
For example, the command to insert a row into table employees:
INSERT INTO employees(rst_name, last_name, fname) VALUES ('John', 'Capita', 'xcapit00');

87

88

CHAPTER 11. DATA MANIPULATION LANGUAGE

11.1 See also


CRUD
Data denition language
Data control language
Query language
SPL
Select (SQL)
Insert (SQL)
Update (SQL)
Delete (SQL)
Create (SQL)
Drop (SQL)

11.2 References
The SQL92 standard.
[1] SQL92
[2] SQL92 4.22.2, SQL statements classied by function
[3] Data Manipulation Language Statements. Oracle. Data manipulation language (DML) statements query or manipulate
data in existing schema objects.

Chapter 12

Query language
Database language redirects here. For other types of database languages, see Database Languages.
Query languages are computer languages used to make queries in databases and information systems.

12.1 Types
Broadly, query languages can be classied according to whether they are database query languages or information
retrieval query languages. The dierence is that a database query language attempts to give factual answers to factual
questions, while an information retrieval query language attempts to nd documents containing information that is
relevant to an area of inquiry.

12.2 Examples
Examples include:
.QL is a proprietary object-oriented query language for querying relational databases; successor of Datalog;
Contextual Query Language (CQL) a formal language for representing queries to information retrieval systems
such as web indexes or bibliographic catalogues.
CQLF (CODASYL Query Language, Flat) is a query language for CODASYL-type databases;
Concept-Oriented Query Language (COQL) is used in the concept-oriented model (COM). It is based on a
novel data modeling construct, concept, and uses such operations as projection and de-projection for multidimensional analysis, analytical operations and inference;
DMX is a query language for Data Mining models;
Datalog is a query language for deductive databases;
F-logic is a declarative object-oriented language for deductive databases and knowledge representation.
FQL enables you to use a SQL-style interface to query the data exposed by the Graph API. It provides advanced
features not available in the Graph API.[1]
Gellish English is a language that can be used for queries in Gellish English Databases, for dialogues (requests
and responses) as well as for information modeling and knowledge modeling;[2]
HTSQL is a query language that translates HTTP queries to SQL;
ISBL is a query language for PRTV, one of the earliest relational database management systems;
LINQ query-expressions is a way to query various data sources from .NET languages
89

90

CHAPTER 12. QUERY LANGUAGE


LDAP is an application protocol for querying and modifying directory services running over TCP/IP;
MQL is a cheminformatics query language for a substructure search allowing beside nominal properties also
numerical properties;
MDX is a query language for OLAP databases;
N1QL is a Couchbase's query language nding data in Couchbase Servers;
OQL is Object Query Language;
OCL (Object Constraint Language). Despite its name, OCL is also an object query language and an OMG
standard;
OPath, intended for use in querying WinFS Stores;
OttoQL, intended for querying tables, XML, and databases;
Poliqarp Query Language is a special query language designed to analyze annotated text. Used in the Poliqarp
search engine;
QUEL is a relational database access language, similar in most ways to SQL;
RDQL is a RDF query language;
SMARTS is the cheminformatics standard for a substructure search;
SPARQL is a query language for RDF graphs;
SPL is a search language for machine-generated big data, based upon Unix Piping and SQL.
SQL is a well known query language and Data Manipulation Language for relational databases;
SuprTool is a proprietary query language for SuprTool, a database access program used for accessing data in
Image/SQL (formerly TurboIMAGE) and Oracle databases;
TMQL Topic Map Query Language is a query language for Topic Maps;
Tutorial D is a query language for truly relational database management systems (TRDBMS);
XQuery is a query language for XML data sources;
XPath is a declarative language for navigating XML documents;
XSPARQL is an integrated query language combining XQuery with SPARQL to query both XML and RDF
data sources at once;
YQL is an SQL-like query language created by Yahoo!

12.3 See also


Data Manipulation Language

12.4 References
[1] FQL Overview. Facebook Developers.
[2] http://gellish.wiki.sourceforge.net/Querying+a+Gellish+English+database

12.5. TEXT AND IMAGE SOURCES, CONTRIBUTORS, AND LICENSES

91

12.5 Text and image sources, contributors, and licenses


12.5.1

Text

Database Source: http://en.wikipedia.org/wiki/Database?oldid=661055565 Contributors: Paul Drye, NathanBeach, Dreamyshade, LC~enwiki,


Robert Merkel, Zundark, The Anome, Stephen Gilbert, Sjc, Andre Engels, Chuckhomann, Fubar Obfusco, Ben-Zin~enwiki, Maury
Markowitz, Waveguy, Imran, Leandrod, Stevertigo, Edward, Ubiquity, Michael Hardy, JereyYasskin, Fuzzie, Pnm, Ixfd64, TakuyaMurata, SebastianHelm, Pcb21, CesarB, MartinSpamer, ArnoLagrange, Ahoerstemeier, Haakon, Nanshu, Angela, Bogdangiusca, Cyan, Poor
Yorick, Mxn, Mulad, Feedmecereal, Jay, Greenrd, Wik, DJ Clayworth, Tpbradbury, E23~enwiki, Furrykef, Morwen, Sandman~enwiki,
Finlay McWalter, Jni, Chuunen Baka, Robbot, Noldoaran, Sander123, Craig Stuntz, Chrism, Chris 73, Vespristiano, Chocolateboy, Netizen, Nurg, Romanm, Lowellian, Pingveno, Tualha, Rursus, Rothwellisretarded, Jondel, TittoAssini, Hadal, Vikreykja, Mushroom,
HaeB, Pengo, SpellBott, Tobias Bergemann, Stirling Newberry, Psb777, Giftlite, Graeme Bartlett, Sarchand~enwiki, Arved, Inter,
Kenny sh, Levin, Peruvianllama, Everyking, Ssd, Niteowlneils, Namlemez, Mboverload, SWAdair, Bobblewik, Wmahan, Gadum,
SarekOfVulcan, Quadell, Kevins, Antandrus, Beland, OverlordQ, Rdsmith4, APH, Troels Arvin, Gscshoyru, Ohka-, Sonett72, Trevor
MacInnis, Canterbury Tail, Bluemask, Zro, Grstain, Mike Rosoft, DanielCD, Shipmaster, EugeneZelenko, AnjaliSinha, KeyStroke, Discospinster, Rich Farmbrough, Rhobite, Lovelac7, Pak21, C12H22O11, Andrewferrier, Mumonkan, Kzzl, Paul August, Edgarde, Djordjes, S.K., Elwikipedista~enwiki, CanisRufus, *drew, MBisanz, Karmast, Kiand, Cpereyra, Tom, Causa sui, Chrax, PatrikR, Hurricane111, Mike Schwartz, Wipe, John Vandenberg, Polluks, Ejrrjs, JeTan, Nk, Franl, Alphax, Railgun, Sleske, Sam Korn, Nsaa, Mdd,
HasharBot~enwiki, Jumbuck, Storm Rider, Alansohn, Tablizer, Etxrge, Arthena, Keenan Pepper, Ricky81682, Riana, AzaToth, Zippanova, Kocio, PaePae, Velella, Skybrian, Helixblue, Filx, Frankman, Danhash, Max Naylor, Harej, Mathewforyou, W mccall, Ringbang,
Chirpy, Djsasso, Dan100, Brookie, Issk, Marasmusine, Simetrical, Reinoutr, Woohookitty, Mindmatrix, Camw, Arcann, 25or6to4,
Decrease789, Mazca, Pol098, Commander Keane, Windsok, Ruud Koot, Tabletop, Bbatsell, KingsleyIdehen, DeirdreGerhardt, GregorB, AnmaFinotera, Plrk, Crucis, Prashanthns, TrentonLipscomb, Turnstep, PeregrineAY, Dysepsion, Mandarax, Wulla, MassGalactusUniversum, Graham87, Qwertyus, DePiep, Jclemens, Sjakkalle, Rjwilmsi, Koavf, DeadlyAssassin, Vary, Carbonite, GlenPeterson,
Feydey, Eric Burnett, Jb-adder, ElKevbo, The wub, Sango123, FlaBot, Doc glasgow, Latka, GnuDoyng, Jstaniek, RexNL, AndriuZ,
Intgr, Antrax, Ahunt, Imnotminkus, JonathanFreed, King of Hearts, Chobot, Visor, Phearlez, DVdm, Bkhouser, NSR, Cornellrockey,
Rimonu, YurikBot, Wavelength, Sceptre, JarrahTree, Phantomsteve, Michael Slone, Woseph, Fabartus, Toquinha, GLaDOS, SpuriousQ, RadioFan2 (usurped), Akamad, Stephenb, Rsrikanth05, Cryptic, Cpuwhiz11, BobStepno, Wimt, SamJohnston, RadioKirk, NawlinWiki, Wiki alf, Jonathan Webley, Jaxl, Milo99, Welsh, Joel7687, SAE1962, Journalist, Nick, Aaron Brenneman, RayMetz100, Matticus78, Larsinio, Mikeblas, Ezeu, Zwobot, Supten, Dbrs, JMRyan, Bluerocket, LindaEllen, Samir, DeadEyeArrow, Werdna, User27091,
Mugunth Kumar, SimonMorgan, Lod, Twelvethirteen, Deville, Theodolite, Zzuuzz, Mike Dillon, Closedmouth, Arthur Rubin, Fang
Aili, Th1rt3en, GraemeL, JoanneB, Alasdair, Echartre, JLaTondre, ArielGold, Stuhacking, Kungfuadam, Mhkay, Bernd in Japan, GrinBot~enwiki, DVD R W, Jonearles, CIreland, Victor falk, Pillefj, SmackBot, Hydrogen Iodide, McGeddon, WikiuserNI, Unyoyega, Pgk,
AnonUser, Davewild, AutumnSnow, Brick Thrower, Stie, Jab843, PJM, Kslays, Edgar181, Lexo, David Fuchs, Siebren, Yamaguchi ,
Gilliam, Donama, Ohnoitsjamie, Chaojoker, Chris the speller, TimBentley, MikeSy, Thumperward, Nafclark, Oli Filth, MalafayaBot,
Silly rabbit, Robocoder, Deli nk, Jerome Charles Potts, Baa, Robth, DHN-bot~enwiki, Methnor, Colonies Chris, Darth Panda, Can't
sleep, clown will eat me, Chlewbot, Paul E Ester, Edivorce, Allan McInnes, Mugaliens, Khoikhoi, COMPFUNK2, Soosed, Cybercobra,
Jwy, Jdlambert, Dreadstar, Insineratehymn, Hgilbert, BryanG, Ultraexactzz, RayGates, Daniel.Cardenas, Kukini, Kkailas, SashatoBot,
Krashlandon, Jasimab, Srikeit, Kuru, Jonwynne, Microchip08, Tazmaniacs, Gobonobo, PeeAeMKay, Sir Nicholas de Mimsy-Porpington,
Lguzenda, Tim Q. Wells, Minna Sora no Shita, Joelo, HeliXx, IronGargoyle, 16@r, MarkSutton, Slakr, Tasc, Beetstra, Noah Salzman, Wikidrone, Babbling.Brook, Childzy, Optakeover, Waggers, Ryulong, ThumbFinger, DougBarry, Asyndeton, Dead3y3, Iridescent,
Mrozlog, TwistOfCain, Paul Foxworthy, Igoldste, Benni39, Dwolt, DEddy, Courcelles, Linkspamremover, Navabromberger, Dkastner, Tawkerbot2, Flubeca, LessHeard vanU, Megatronium, FatalError, JForget, Comps, VoxLuna, Spdegabrielle, Thatperson, Ahy1,
CmdrObot, Ale jrb, Ericlaw02, Iced Kola, KyraVixen, Kushal one, GHe, Constructive, Dgw, Argon233, FlyingToaster, Moreschi,
Sewebster, Simeon, Joshnpowell, Ubiq, Cantras, Mato, Gogo Dodo, Parzi, Chasingsol, Pascal.Tesson, Dancter, SymlynX, Tawkerbot4, Shirulashem, DumbBOT, Chrislk02, Alaibot, IComputerSaysNo, SpK, Omicronpersei8, UberScienceNerd, Cavanagh, Click23,
Mattisse, Thijs!bot, Epbr123, Qwyrxian, HappyInGeneral, Andyjsmith, CynicalMe, Mojo Hand, Philippe, Eric3K, Peashy, Maxferrario, Mentisto, AntiVandalBot, Majorly, Luna Santin, Widefox, Seaphoto, Turlo Lomon, MrNoblet, EarthPerson, Kbthompson, Credema, Spartaz, Lfstevens, Deadbeef, JAnDbot, Eric Bekins, MER-C, BlindEagle, Blood Red Sandman, RIH-V, Andonic, PhilKnight,
Saiken79, LittleOldMe, Jdrumgoole, Magioladitis, Karlhahn, Bongwarrior, VoABot II, Hasek is the best, JamesBWatson, Think outside
the box, Lucyin, Twsx, WODUP, Cic, Jvhertum, Bubba hotep, Culverin, Danieljamesscott, Adrian J. Hunter, 28421u2232nfenfcenc,
Stdazi, Wwmbes, Cpl Syx, Kunaldeo, Kozmando, Chris G, DerHexer, JaGa, Ahodgkinson, Oroso, Leaderofearth, MartinBot, Ironman5247, Arjun01, NAHID, Poeloq, CableCat, Rettetast, R'n'B, NetManage, Tgeairn, J.delanoy, Pharaoh of the Wizards, Trusilver, Rohitj.iitk, Bogey97, Ayecee, Uncle Dick, Maurice Carbonaro, Jesant13, Ginsengbomb, Darth Mike, Gzkn, Bcartolo, BrokenSphere, Katalaveno, Auegel, Chriswiki, DamnRandall, Girl2k, NewEnglandYankee, SJP, Gregtzy, Kraftlos, Madth3, Madhava 1947,
Jackacon, Juliancolton, Cometstyles, Ryager, Raspalchima, Seanust 1, Lamp90, Bonadea, Aditya gopal3, Pdcook, Ja 62, TheNewPhobia, DigitalEnthusiast, Squids and Chips, CardinalDan, Ryanslater, Ryanslater2, Siteobserver, Lights, VolkovBot, Amaraiel, Thedjatclubrock, Alain Amiouni, Indubitably, JustinHagstrom, WOSlinker, Barneca, N25696, Erikrj, Philip Trueman, Lingwitt, TXiKiBoT, Wiki tiki tr, Moogwrench, Vipinhari, Technopat, Caster23, GDonato, ScMeGr, Olinga, Ann Stouter, Anonymous Dissident,
Cyberjoac, Qxz, Gozzy345, Lradrama, Sintaku, Clarince63, Twebby, DragonLord, Jackfork, LeaveSleaves, Wya 7890, Mannafredo,
Amd628, Zhenqinli, Hankhuck, Gwizard, Synthebot, Kingius, Bblank, Why Not A Duck, Atkinsdc, Pjoef, Aepanico, Logan, HybridBoy, Thehulkmonster, D. Recorder, Calutuigor, SieBot, Fooker69, Calliopejen1, Praba tuty, Kimera Kat, Jauerback, LeeHam2007,
Caltas, Eagleal, Triwbe, Yintan, TalkyLemon, Keilana, Bentogoa, Flyer22, Radon210, Oda Mari, JCLately, Jojalozzo, Hxhbot, Le
Pied-bot~enwiki, Sucker666, Theory of deadman, KoshVorlon, 10285658sdsaa, Mkeranat, Fratrep, Macy, ChorizoLasagna, Autumn
Wind, Maxime.Debosschere, Spazure, Paulinho28, Vanished User 8902317830, G12kid, Pinkadelica, Treekids, Denisarona, Escape Orbit, Levin Carsten, Kanonkas, Startswithj, Explicit, Beeblebrox, ClueBot, Frsparrow, Phoenix-wiki, Hugsandy, Strongsauce, Avenged
Eightfold, The Thing That Should Not Be, Buzzimu, Jan1nad, Poterxu, Supertouch, Unbuttered Parsnip, Garyzx, Zipircik, SuperHamster, Boing! said Zebedee, Doddsy1993, Niceguyedc, Sam Barsoom, Blanchardb, Dylan620, Mikey180791, Puchiko, Mspraveen, Vivacewwxu~enwiki, Veryprettysh, Robert Skyhawk, Drumroll99, Excirial, Pumpmeup, M4gnum0n, Dbates1999, LaosLos, Northernhenge, Eeekster, Tyler, Odavy, Cenarium, Lunchscale, Peter.C, Jotterbot, MECiAf., Huntthetroll, Tictacsir, Thehelpfulone, Inspector
34, Thingg, Aitias, DerBorg, Subash.chandran007, Versus22, Burner0718, Johnuniq, SoxBot III, Apparition11, DumZiBoT, Jmanigold,
XLinkBot, EastTN, Gsallis, PrePress, Avoided, Pee Tern, Galzigler, Noctibus, Qwertykris, Dsimic, Osarius, HexaChord, Rakeki, Addbot, Proofreader77, Pyfan, Willking1979, Some jerk on the Internet, Betterusername, Captain-tucker, Ngpd, Fgnievinski, Fieldday-

92

CHAPTER 12. QUERY LANGUAGE

sunday, JephapE, Xhelllox, Vishnava, CanadianLinuxUser, Fluernutter, Cevalsi, Cambalachero, CarsracBot, DFS454, Glane23, FiriBot,
SDSWIKI, Roux, Favonian, Doniago, Exor674, AtheWeatherman, Jasper Deng, Hotsta, Evildeathmath, Tide rolls, Nicoosuna, Kivar2,
Matj Grabovsk, Dart88, Gail, David0811, Duyanfang, Jarble, Arbitrarily0, LuK3, Informatwr, Ben Ben, Luckas-bot, Yobot, Sudarevic,
2D, OrgasGirl, Bunnyhop11, Fraggle81, Gishac, MarcoAurelio, Pvjohnson, Nallimbot, SwisterTwister, Srdju001, Peter Flass, Bbb23,
N1RK4UDSK714, AnomieBOT, AmritasyaPutra, Rubinbot, Sonia, Jim1138, JackieBot, Piano non troppo, Kingpin13, Ulric1313, Imfargo, Flewis, Bluerasberry, Materialscientist, Kimsey0, Citation bot, OllieFury, BlurTento, Clark89, Darthvader023, Xqbot, Anders
Torlind, Kimberly ayoma, Sythy2, Llyntegid, Addihockey10, Capricorn42, Bcontins, 4twenty42o, Craftyminion, Grim23, Yossman007,
Preet91119, Tonydent, GrouchoBot, Call me Bubba, Kekekecakes, Bjcubsfan, Earlypsychosis, Prunesqualer, Crashdoom, Amaury, Doulos Christos, Sophus Bie, The Wiki Octopus, IElonex!, Shadowjams, , Oho1, Dougofborg, Al Wiseman, Chtuw, Captain-n00dle,
Gonfus, Prari, FrescoBot, Sock, Riverraisin, Fortdj33, Blackguard SF, Dogposter, Mark Renier, StaticVision, HJ Mitchell, Sae1962,
Wione, Weetoddid, ZenerV, Kwiki, Javert, ZooPro, Winterst, Shadowseas, I dream of horses, HRoestBot, Grsmca, LittleWink, 10metreh, Supreme Deliciousness, Hamtechperson, Sissis bd, 28nebraska, Jschnur, Xfact, RedBot, Btilm, MastiBot, Rotanagol, Bharath357,
, 05winsjp, Psaajid, Meaghan, Abhikumar1995, Jandalhandler, Refactored, FoxBot, TobeBot, Mercy11, , KotetsuKat,
ItsZippy, Lotje, Callanecc, Writeread82, Vrenator, Reidh21234, Reaper Eternal, Luizfsc, TheGrimReaper NS, Xin0427, Suusion of
Yellow, SnoFox, BluCreator, Colindolly, TheMesquito, Minimac, Thinktdub, Heysim0n, RazorXX8, DARTH SIDIOUS 2, Lingliu07,
KILLERKEA23, Leonnicholls07, Mean as custard, Helloher, ArwinJ, Kvasilev, Regancy42, FetchcommsAWB, Timbits82, Aj.robin,
Salvio giuliano, Skamecrazy123, Rollins83, EmausBot, John of Reading, FFGeyer, Armen1304, Heymid, ScottyBerg, Lores92201,
Beta M, Dewritech, GoingBatty, RA0808, RenamedUser01302013, Itafran2010, Knbanker, Winner 42, Carbo1200, Wikipelli, K6ka,
Sheeana, Ceyjan, Serketan, AsceticRose, Anirudh Emani, Tudorol, Komal.Ar, Pete1248, Savh, Ravinjit, Joshwa1234567890, F, NicatronTg, M.badnjki, Alpha Quadrant (alt), Tuhl, Makecat, Ocaasi, OnePt618, Tolly4bolly, W163, TyA, L Kensington, Mayur, Donner60,
Mentibot, MainFrame, Nz101, Matthewrbowker, Peter Karlsen, GregWPhoto, GrayFullbuster, Rishu arora11, DASHBotAV, Kellyk99,
28bot, Rocketrod1960, Diamondland, ClueBot NG, SpikeTorontoRCP, Mechanical digger, Jack Greenmaven, MelbourneStar, Satellizer,
Dancayta, Chester Markel, Bwhynot14, Millermk, Theimmaculatechemist, Lsschwar, Bowlderizer, Zhoravdb, Widr, Danim, Ugebgroup8,
CasualVisitor, Vibhijain, Franky21, Jk2q3jrklse, Cammo33, Oddbodz, Lbausalop, Cambapp, Strike Eagle, Calabe1992, Doorknob747,
Lowercase sigmabot, BG19bot, Freebiekr, MilerWhite, Machdohvah, Tomatronster, Northamerica1000, Wiki13, MusikAnimal, Frze,
Dan653, AwamerT, Allecher, Mark Arsten, Somchai1029, Vincent Liu, Compfreak7, 110808028 amol, Altar, Foxfax555, Rj Haseeb,
Alzpp, Bfugett, Jbrune, Thomasryno, Afree10, Glacialfox, Admrepanther, Era7bd, Soumark, Maxmarengo, Manikandan 2030, Branzman, Melucky2getu, Fylbecatulous, Plavozont, Carliitaeliza, IkamusumeFan, Several Pending, Pratyya Ghosh, Zhaofeng Li, Mrt3366,
VNeumann, ChrisGualtieri, Christophe.billiottet, Lovefamosos, Maty18, Mediran, Khazar2, Deathlasersonline, Saturdayswiki,
,
Mukherjeeassociates, Cerabot~enwiki, Malvikiran, Cheolsoo, R3miixasim, Pebau.grandauer, TwoTwoHello, Lugia2453, Frosty, SFK2,
Graphium, Rafaelschp, 069952497a, Reatlas, Epicgenius, P2Peter, Acetotyce, Rockonomics, Eyesnore, Moazzam chand, JamesMoose,
Jabby11, EvergreenFir, Menublogger, Backendgaming, PappaAvMin, Mike99999, Gburd, Babitaarora, MJunkCat, Boli1107, JJdaboss,
Ray Lightyear, BentlijDB, Hshoemark, Melody Lavender, Ginsuloft, D Eaketts, Eddiecarter1, Eddiejcarter, Mwaci11, Gajurahman,
Manul, IrfanSha, AddWittyNameHere, Dkwebsub, JunWan, WPGA2345, Verajohne, Phinicle, Title302, JaconaFrere, ElijahLloyd97,
7Sidz, Monkbot, JewishMonser69, Rajat Kant Singh, Davidcoppereld123, Sunrocket89, Nomonomnom, Samster0708, Krushna124,
Cabral88, MisteArndon, KizzyCode, Uoy ylgu dratsab, Hillysilly, FSahar, Thedinesh4u, Boybudz321, Jesseminisis, ChamithN, Crystallizedcarbon, Eurodyne, JensLechtenboerger, Papapasan, Is8ac, Torvolt, Rgeurts, MaurolepisDreki, Top The Ball, Jack0898, Rob12467,
Gfsfg, Uthinkurspecial, Asdafsd, SaltySloth, Jrgreene2, Timoutiwin and Anonymous: 2033
Relational database management system Source: http://en.wikipedia.org/wiki/Relational%20database%20management%20system?
oldid=657235466 Contributors: Jan Hidders, Aldie, BL~enwiki, Cwitty, Leandrod, Karada, Kaihsu, Mxn, Uriber, Reddi, Craig Stuntz,
MikeSchinkel, Altenmann, Lowellian, Chris Roy, Davedx, Acrider, Oberiko, Mintleaf~enwiki, Mckaysalisbury, Joseph Dwayne, Neilc,
Beland, Robert Brockway, Maximaximax, Szajd, Troels Arvin, JFM, Grunt, Kate, R, KeyStroke, Rhobite, Smyth, Lulu of the LotusEaters, Elwikipedista~enwiki, Sasquatch, Minghong, Obradovic Goran, Tablizer, Stevegiacomelli, BodyTag, Flata, Crosbiesmith, Xphile2868,
Mindmatrix, Ohyoko, Cnb, Apokrif, Palica, Turnstep, JHMM13, Vegaswikian, Jameshsher, Gurch, BMF81, Nylex, Borgx, Daverocks,
Rsrikanth05, Cryptic, Shepazu, Larsinio, Mikeblas, SmackBot, Mangoe, Reedy, AutumnSnow, Brick Thrower, Anastrophe, Gilliam,
Ohnoitsjamie, Skizzik, Anwar saadat, LinguistAtLarge, George Rodney Maruri Game, Jdthood, Anvish, RedHillian, TenPoundHammer,
Kuru, Heimstern, 16@r, UnDeRTaKeR, Optakeover, Igoldste, Pi, Shabbirbhimani, FatalError, SqlPac, CmdrObot, Bressan, Tomcat66
g500, Klausness, Afabbro, PhiLiP, AntiVandalBot, Lfstevens, Dockurt2k, JamesBWatson, MartinBot, Xcasejet, J.delanoy, Bob hoskins,
Athaenara, Nicks100, Bonadea, Useight, Jnlin, DigitalEnthusiast, Ikhzter, Jtgerman, Wykypydya, Chaitrabhat7, Cactus26, Ballin Insane10, Quest for Truth, JCLately, Denisarona, Vanished user qkqknjitkcse45u3, ClueBot, TallMagic, NuclearWarfare, Sparkiegeek,
XLinkBot, Pichpich, Rror, Joseph chennai, Mr4top, Addbot, Setppo, Lightbot, II MusLiM HyBRiD II, Darx9url, AnomieBOT, Jim1138,
Brassrat70s, Kotika98, , Kernel.package, Amaury, January2009, Josemanimala, VTPG, Weyesr1, Mark Renier, I dream of
horses, DixonDBot, Ale And Quail, DB 103245, EoganOD, Payal2820, Igor Yalovecky, J36miles, Dewritech, Vanished user zq46pw21,
Sam Tomato, Kelti, Tolly4bolly, Donner60, 28bot, AMD, ClueBot NG, Mechanical digger, MelbourneStar, Alonemayank, MerlIwBot, Brilliantwiki, WIKIWIZWORKER, Frze, Vincent Liu, Joao.matos, Googol30, Pratyya Ghosh, Kingston Dominik, Bgibbs2, Frosty,
Paulcolmer, HEAdrian, Fatehyab ahmed, Faizan, Tentinator, JaconaFrere, Monkbot, Christopheryoder and Anonymous: 273
MySQL Source: http://en.wikipedia.org/wiki/MySQL?oldid=657299979 Contributors: AxelBoldt, Peter Winnberg, Derek Ross, Brion
VIBBER, Bryan Derksen, Stephen Gilbert, Taw, Manning Bartlett, VincentV, Andre Engels, LA2, 0, MarkAtwood, JeLuF, Aldie,
Fubar Obfusco, William Avery, Mjb, Formulax~enwiki, Stevertigo, Edward, Patrick, PhilipMW, Tim Starling, Pnm, Ixfd64, Shoaler,
Minesweeper, Greenman, Haakon, Ronz, Nanshu, Snoyes, Den fjttrade ankan~enwiki, LittleDan, Glenn, Bogdangiusca, Cherkash,
Mxn, Conti, Byte, Guaka, Timwi, Nohat, Magnus.de, Fuzheado, Doradus, Aaboelela, Hao2lian, Pedant17, Qu1j0t3, Furrykef, Saltine,
Mattworld, Ed g2s, Bevo, Spikey, Topbanana, Nickshanks, Fvw, Secretlondon, Jamesday, Garo, JorgeGG, Robbot, Midom, Chealer,
Astronautics~enwiki, Kristof vt, Vespristiano, RedWolf, Moondyne, Altenmann, Dittaeva, Nurg, Sverdrup, Texture, Joelwest, JeremyCole, Jon787, Wlievens, Rochkind, Wikibot, Wereon, Mushroom, Diberri, Mattaschen, Centrx, Cokoli, Dinomite, Oberiko, ShaunMacPherson, Nickdc, var Arnfjr Bjarmason, Quadra23, Jonabbey, Thetorpedodog, Chris Wood, XtinaS, Kainaw, AlistairMcMillan,
Brockert, Mckaysalisbury, Bobblewik, Neilc, Stevietheman, Johansosa, James Crippen, Gadum, Pgan002, Jasper Chua, Rajasekaran
Deepak, Beland, ClockworkLunch, ShakataGaNai, Rdsmith4, Oneiros, Burgundavia, Karl-Henner, Rdnk, Troels Arvin, Engleman,
GreenReaper, Zondor, Safety Cap, Grath, Imroy, Madduck, Twinxor, ElTyrant, Rich Farmbrough, Ebelular, Shudog, Satertek, Andrewferrier, Wk muriithi, Smyth, Thomas Willerich, ChadMiller, Gronky, Bg~enwiki, Bender235, Rubicon, Jaberwocky6669, Odalcet, Elwikipedista~enwiki, Nabla, Kwamikagami, Neilrieck, Bobo192, Janna Isabot, BW, Kfogel, TommyG, John Vandenberg, Timl,
Goa103~enwiki, Shlomital, Unknown W. Brackets, Tadman, Minghong, Jonsafari, NeilSantos, 4v4l0n42, HasharBot~enwiki, ClementSeveillac, NickCatal, Patsw, Gary, Vipuser, Fchoong, Mmmready, Yamla, Zippanova, Sligocki, Mac Davis, Ayeroxor, Rabarberski,
Gbeeker, Shareme~enwiki, Cburnett, Suruena, 2mcm, HarrisonFisk, Pauli133, Thebritt, Dan100, Forderud, April Arcus, NicM, Oleg

12.5. TEXT AND IMAGE SOURCES, CONTRIBUTORS, AND LICENSES

93

Alexandrov, Dejvid, Reinoutr, Mindmatrix, Ohyoko, Havermayer, Uncle G, Peter Hitchmough, ^demon, Cbdorsett, Bluemoose, Flamingspinach, GregorB, Frungi, Eyreland, Male1979, Vivek.pandey, Xiong, Turnstep, LimoWreck, Kesla, Graham87, Qwertyus, Deadcorpse, Kbdank71, GrundyCamellia, Sj, Rjwilmsi, Philipolson, Hulagutten, Raztus, Vegaswikian, Boatman, Miha Ulanov, Ghepeu,
Toby Douglass, Gavinatkinson, Zero0w, FlaBot, New Thought, AndriuZ, Intgr, ThePlaz, David H Braun (1964), JM.Beaubourg, Antilived, ChandraSukiman, DVdm, Bgwhite, Peterl, YurikBot, Borgx, Charles Gaudette, StuOfInterest, RussBot, Carl T, Groogle, Hydrargyrum, Barefootguru, Coyote376, CambridgeBayWeather, Stassats, ML, Irrevenant, Finbarr Saunders, GSK, Tkbwik, Semi, Cleared
as led, Gorie, Larsinio, Mikeblas, Jawnsy, Voidxor, MySchizoBuddy, Xompanthy, Action potential, Vlad, Jeremy Visser, Cosmotron,
BraneJ, Sebleblanc, CLW, Satanuke, Jkelly, BMT, Zzuuzz, Mhillyer, Closedmouth, KGasso, H@r@ld, Petri Krohn, CWenger, Realkyhick, JLaTondre, David Biddulph, Hossein.ir, ViperSnake151, Darkfate, RichF, Aforencich, Dfreeman@akebulan.com, Pillefj, Veinor,
A bit iy, SmackBot, Faisal.akeel, Moeron, Colinstu, Reedy, Chiclops~enwiki, Hydrogen Iodide, McGeddon, Miszobi, Brick Thrower,
Matthuxtable, Bobzchemist, Preeeemo, Gilliam, Brianski, Amux, Fokat, Smileyborg, Chris the speller, LinguistAtLarge, Carpetsmoker,
DStoykov, MK8, Thumperward, Morte, Oli Filth, Jeysaba, Jerome Charles Potts, Gutworth, YellowLeftHand, DHN-bot~enwiki, CDV,
Saiswa, Can't sleep, clown will eat me, Frap, Juancnuno, Nixeagle, Stevenjgarner, Addshore, UU, Aaron Ray, Opticyclic, Cybercobra, Downtown dan seattle, Lrusso99, Mr Minchin, Youcantryreachingme, Pgillman, Joelrwilliams, Acdx, Where, Daniel.Cardenas,
Morgo, Scarfy, JzG, Returnkey, Kuru, Rafert, Ksn, IronGargoyle, Camilo Sanchez, 16@r, JHunterJ, Beetstra, Sandb, Vanished user
ih3rjk324jdei2, MTSbot~enwiki, Noleander, Dl2000, Super3boy~enwiki, Hu12, Norm mit, DouglasCalvert, Iridescent, Theone00, Xumxum,
Sander Sde, Montybarker, Beno1000, Kalkadoon, Az1568, Ahsanmani, Linkspamremover, Oshadmon, Altonbr, Awef, SkyWalker,
HDCase, Paulvallee, Raysonho, Dgw, NisseSthlm, Vbgamer45, Dmillman, Isotopp~enwiki, SuperMidget, Nmacu, Cydebot, Karimarie,
Jmmorris, Bryan, Djg2006, ViktorHaag, Gogo Dodo, Travelbird, Mjhoogev, Bazzargh, Rgrof, Nattee, Medovina, Tkynerd, Blocked!,
Asenine, DigitalSorceress, JayW, Briantw, Neustradamus, Marqmike2, Dustinhess, Thijs!bot, IvanStepaniuk, Brainsnorkel, Bruggeri,
Davidelit, N5iln, Dalahst, Zaiken, Davidhorman, Wolfc01, Hcobb, Pcbene, CharlotteWebb, Sherbrooke, I already forgot, Nemolan,
Jayron32, LenzGr, Jj137, JAnDbot, Deective, NapoliRoma, Fhussain, Jonkaz, BCube, MarkPilgrim, SteveSims, Mchl, Magioladitis,
Pedro, PeterMoulding.com, VoABot II, Britton ohl, Macutty, Coredumperror, Tedickey, Sarcasting the hallucination, Mountaingoat, Cander0000, Wdake, Calltech, Gwern, Russelljtdyer, MartinBot, Ariel., Radnam, Ninestrokes, Lmxspice, Zeus, Keith D, Silversh70, R'n'B,
Zacchiro, Whale plane, Mausy5043, Tgeairn, Erp Erpington, Darkride, Adamryanlee, Arite, Mhopeng, Freyk, McSly, Copito42, OAC,
SteveChervitzTrutane, Bofoc Tagar, Omegamormegil, Designdroide, Kvdveer, Neocodesoftware, StefanHinz, Wikieditor06, VolkovBot,
Shortride, Allencheung, Blindmatrix, Grymwulf, LokiClock, Aaron44126, Philip Trueman, TXiKiBoT, Ldonna, GroveGuy, Technopat,
Ann Stouter, Noerrorsfound, Devileo~enwiki, DaBest1, Ydriuf, DocteurCosmos, Cheyer, Seb26, JhsBot, Bobsawyer20, Db the dba,
Maxim, Wykypydya, Hannes Rst, Rgiltrap, Ultra 11, Billinghurst, Xieqi200, Prius 2, CoolKid1993, BrianAker, HiDrNick, Julekmen,
S.rvarr.S, OsamaK, S-n-ushakov, Coee, TJRC, Andrarias, Artagnon, ToePeu.bot, Kgoarany, Purbo T, Bentogoa, Exert, Suwatest,
Editore99, Jojalozzo, Reinderien, Guycalledryan, Thommym, Aruton, Faganp, Chris Mitchell, Squash Racket, Pmalkowski, Martarius,
ClueBot, SummerWithMorons, Kl4m, Beetstra public, CaptTofu, Rodhullandemu, SloppyG, Gtg264f, Emwave, Sisutclie, Sebquantic,
Kl4m-AWB, Crazyman6721, SuperHamster, CounterVandalismBot, Attlas, Callmeonnet, Rockfang, Pointillist, LeslieBD, VOGELLA,
M4gnum0n, Spock of Vulcan, RedYeti, Norandav, TobiasPersson, GFHandel, Sajmure, Dank, Manorhill, SoxBot III, SF007, DumZiBoT, Bravissimo594, JohnMGarrison, TimTay, XLinkBot, Bkarwin, Simplytaty, Alexius08, Subversive.sound, Dfoxvog, Wolkykim,
Dsimic, HexaChord, Bookbrad, Addbot, Ramu50, Axecution, Craigm71, Oegly~enwiki, Grantmx, Cst17, MrOllie, Download, Kalakatha,
Jasper Deng, Staticmain, Danyaddita, Nicoglop, Thowland, Jarble, Hoover789, Karan.102, BaldPark, Yobot, Bunnyhop11, Chiragpinjar,
Naudefjbot~enwiki, N3hima, Wonder, KillerLegend, AnomieBOT, Mpopp75, 1exec1, Coolboy1234, Jim1138, Piano non troppo, Utility Knife, Marianolu, Giants27, Materialscientist, Aneah, ArthurBot, Parthian Scribe, Mike2ykme, Capricorn42, Jewang, Axan.bulut,
Locos epraix, J JMesserly, Someslowly, Rbuj, 16x9, Designer1993, RibotBOT, Applejack1234, Msjaiswal, E0steven, Bwisey, Ericnadler, Eomund, FrescoBot, Kwiki, Slezak, UnixMan45, Atlantia, Mwindrim, Winterst, Simple Bob, Pegasos2, Lichtgestalt~enwiki,
HRoestBot, Tra, Skyerise, RedBot, Amgc56, Troy.frericks, Lyf2002, Jandalhandler, Tcnuk, Danielluyo, Sandeep74, Weylinp, Orenburg1, FoxBot, Josephers, TobeBot, Chris Caven, Orzelf, Thesmug, Lotje, Blue Em, Sibyllaviki, Mz2000, MoreNet, Diannaa, Kipitis, Colindolly, Aviv007, RjwilmsiBot, Dreemteem, James Plummer, Grog.Wilson, Skamecrazy123, WikitanvirBot, Dontdeletecontent, GoingBatty, Gimmetoo, Tisane, Xmm0, Wikipelli, Zafar142003, Thecheesykid, Sobchakw, AvicBot, Kkm010, Ullika~enwiki,
Josve05a, ILYA INDIGO, Kiwi128, Holsen32, Sonez1113, Blacktrance, Dennis714, Gregoroq, Gilad.maayan, Qpniteyqp, Palosirkka,
Erget2005, Julyscripter, Damirgrati, Ochado, Jakub85, Tripathisoft, Senator2029, Dinnerface, ClueBot NG, AlbertBickford, Morgankevinj huggle, Dexp, Sdht, Strcat, HectorAE, Buryshane, Pammer, Patrias, Theopolisme, Helpful Pixie Bot, Mr. Credible, Electriccatsh2, DBigXray, BG19bot, Tigerbomb8, Juiceentertainment, Compfreak7, Matthew-New, Teds247, Cliashford, Yourbane, ZigArt, Red banana3, Tesssla, 13375up4h4x0r, Thesquaregroot, Minsbot, Anbu121, Maheshpatil.blr, FootholdTechnology, Marina Nastenko, Tonusamuel, Khazar2, JYBot, Toeepot, Codename Lisa, Mogism, Winashwin24, Ellenallhatatlan, Thesocialdude, Dmitry Cherniachenko, Akopts, Palmbeachguy, Feder raz, Altered Walter, Serj.by, Captain Conundrum, X2qnet, Comp.arch, UKAmerican, ArmitageAmy, Jepa, ZekeTheThird, TheWanderer1357, Dvorapa, NordLeuchte, Amsfaithsoftware, ScotXW, Erilong, Davidcoppereld123,
Brokennib, QueenFan, Unician, BanzaiTokyo, GOKU6677, Macnaughtonboy, JamesS858 and Anonymous: 920
SQLite Source: http://en.wikipedia.org/wiki/SQLite?oldid=660733566 Contributors: Damian Yerrick, AxelBoldt, Bryan Derksen, Fnielsen,
Fubar Obfusco, Nate Silva, Boleslav Bobcik, Pnm, Wwwwolf, Graue, Haakon, Glenn, Nikai, Wael Ellithy, Tobias Conradi, Timwi,
Aquatopia~enwiki, Sanxiyn, Qu1j0t3, Furrykef, Theta682, Topbanana, Hankwang, Chealer, Peak, Rursus, Rrjanbiah, Delpino, Hif,
Ruakh, Mattaschen, David Gerard, Wjgilmore, Risk one, Sdsher, AlistairMcMillan, Eequor, Brockert, Dave2, Magicmike, Neilc, Tgwena, Dnas, Two Bananas, Abdull, Moxfyre, RandalSchwartz, Kate, SimonEast, R, RossPatterson, Rich Farmbrough, Pmsyyz, Drano,
Mecanismo, Smyth, Scullder, TOR, *drew, Mattisgoo, Kwamikagami, Egrabczewski, Slicky, Giraedata, DG~enwiki, Sleske, Minghong,
Tablizer, Ronark, Stephan Leeds, Gpvos, KTC, Mindmatrix, ChrisNoe, Shello, DanBishop, Bkkbrad, Scjessey, Apokrif, Choas~enwiki,
GregorB, Waldir, Cbyneorne, Havarhen, Turnstep, Rgbea, Yoghurt, Magister Mathematicae, Qwertyus, RadioActive~enwiki, Philipolson,
Gudeldar, Gilesmorant, Beeveer, Fred Bradstadt, Zero0w, FlaBot, Jstaniek, Lmatt, Alvin-cs, Visor, Bgwhite, YurikBot, Argav, Barefootguru, Kimchi.sg, Toehead2001, Mipadi, Mschumacher69, Irishguy, Sekelsenmat, Bota47, Paul Magnussen, H@r@ld, Mainstreetmark, CWenger, JLaTondre, Wikimercenary, Luk, Lethalmonk, SmackBot, Reedy, Optikos, DStoykov, Thumperward, Mdwh, DHNbot~enwiki, Ned Scott, TripleF, Huji, PotatoEater, Compctech, Frap, Arulprasad, JonathanWakely, Mwtoews, Where, Ohconfucius,
ThurnerRupert, Korval, Javier Odom, Rorx, Soumyasch, Heelmijnlevenlang, Jrouquie, A. Parrot, Makyen, Mchirico, Hu12, Theone00,
Saltlakejohn, FatalError, J Milburn, SqlPac, Paolosupernova, AndrewHowse, Cydebot, Roberta F., Mrinal.kant~enwiki, Ebraminio, Jayapalchandran, Thijs!bot, DivideByZero14, Qwyrxian, DmitTrix, Srperez, SpacePacket, Jaxelrod, Gioto, MBParker, Isilanes, Temblast,
Dougher, Lfstevens, VictorAnyakin, Drhipp, Deective, Od1n, Inverse.chi, Greensburger, Alex LE, Zhongchen, Who.am.i, Aulis2003,
Otterfan, Beethoven05, Sappy, Cander0000, Gwern, Arcturis, Eugenwpg, RobertCailliau, AVRS, MartinBot, Devin Asay, Yaron K., Wikitiki89, Sarathbs, Arite, Grshiplett, Cooldude7273, Daxx wp, Jaguar83, Kriplozoik~enwiki, Volkris, SexyBern, MBlakley, TXiKiBoT,
FFMG, Wykypydya, Pascal sa, DavidHalko, Darkzen.bps, Hareesh.t, Cmbeelby, Svick, Scartboy, Nnemo, Kl4m-AWB, Stachelsch,

94

CHAPTER 12. QUERY LANGUAGE

Bigown, Niceguyedc, Fenke, Melizg, Bbb2007, Djbriddock, Streambag, Steph1978~enwiki, Amanda hoic, Johnuniq, SF007, DumZiBoT, XLinkBot, Zbig Lebowsky, C. A. Russell, Jmkim dot com, Addbot, Nuno Brito, AkhtaBot, 0x54097DAA, MrOllie, LaaknorBot,
Ginosbot, Staticmain, Bro4, Jorel314, Yobot, Legobot II, Specious, Wonder, AnomieBOT, Gtz, Therealgeeves, CeciliaPang, Materialscientist, Anybody, Neurolysis, ArthurBot, Xtremejames183, LilHelpa, Xqbot, PabloCastellano, Baest, LordArtemis, GrouchoBot, RibotBOT, U1024, Canadianacademic, Molyneux.peter, FrescoBot, Gerardo cabero~enwiki, Wikiwikiwu, Glider87, Sae1962, Gabrielepx,
Kwiki, Winterst, Simple Bob, Alex degarate, Tim baroon, Jeanfarias, Hoo man, Jandalhandler, Salvidrim!, Latios, Zo8shong, Chris
Caven, Ungzd, Dchestnykh, Lotje, Rapha222, Ybungalobill, Rro4785, Leonelhs, Saint1997, Kirbylover4000, TankMiche, Zaxn1234, Najeeb1010, MVelliste, Philippe.petrinko, Madooo12, Palosirkka, Noncoercive, Quadunit404, Vlops, Dexp, Many delicious meats, Dsimpson dcsi, Marco1713, Danim, Helpful Pixie Bot, Gurghet, Mark Arsten, Patuck, ZeaForUs, OzOle, Xephyrous, Marco1317, Vdvluc,
JamesHaigh, Samyulg, Captain Conundrum, Syntaxerrorz, Marvinella, ScotXW, Claw of Slime, Permafrost46, Donosauro, EHerbst,
Fabricio Correa~enwiki and Anonymous: 365
PostgreSQL Source: http://en.wikipedia.org/wiki/PostgreSQL?oldid=661020005 Contributors: 0, Carey Evans, Wesley, The Anome,
Christopher Mahan, Aldie, Fubar Obfusco, Nate Silva, M~enwiki, Roadrunner, Maury Markowitz, TomCerul, Heron, Cwitty, Frecklefoot, Edward, Fuzzie, Gregben~enwiki, Nixdorf, Liftarn, Wwwwolf, (, CesarB, Ahoerstemeier, KAMiKAZOW, Stevenj, Nanshu,
Angela, Glenn, Sugarsh, Nikai, Ehn, Jay, Tejano, Doradus, Pedant17, Tpbradbury, Polyglot, Cleduc, Jnc, Wernher, Bevo, Joy, Fvw,
Jamesday, Robbot, Chealer, Lowellian, Ianb, Stewartadcock, LX, Lasix, Weialawaga~enwiki, Oberiko, Nickdc, Levin, Fleminra, Ceejayoz, Prell, Lvr, Neilc, Chowbok, Utcursch, Pgan002, Alexf, Cbraga, Billposer, Gene s, Burgundavia, Karl-Henner, Cynical, Troels
Arvin, GreenReaper, Deleteme42, RandalSchwartz, Imroy, Rich Farmbrough, Sesse, Oska, Ardonik, Lulu of the Lotus-Eaters, Slipstream, Gronky, Bender235, PaulMEdwards, Kwamikagami, Kanzure, TommyG, Mereman, Giraedata, Timsheridan, Minghong, Jonsafari, QuantumEleven, Stephen Bain, HasharBot~enwiki, Poli, Gary, Fchoong, Jeltz, Andrewpmk, Ringerc~enwiki, Pauli133, SteinbDJ,
Gmaxwell, Mindmatrix, MianZKhurrum, Dandv, Deeahbz, Jacobolus, Distalzou, Cosmicsoftceo, Bowman, GregorB, AnmaFinotera,
Wisq, Turnstep, Marudubshinki, Graham87, EdDavies, Gilesmorant, KublaChaos, Silvestre Zabala, Zero0w, Mikecron, FlaBot, SchuminWeb, Gurch, Ghen, Intgr, Chobot, Reetep, Peterl, YurikBot, Manop, Gaius Cornelius, Bovineone, Varnav, Geertivp, Mipadi, Tkbwik,
Randolf Richardson, Larsinio, E rulez, Snarius, BraneJ, Gsherry, Analoguedragon, Johndburger, Closedmouth, Johnsu01, MaNeMeBasat,
BanzaiSi, JLaTondre, Benhoyt, Mlibby, A bit iy, SmackBot, Nicolas Barbier, Direvus, Slamb, Faisal.akeel, Reedy, Georgeryp, Dkusnetzky, Anastrophe, Richmeister, Chris the speller, Bluebot, Wolph~enwiki, Advorak, DStoykov, Crashmatrix, Ben.c.roberts, Thumperward, Droll, Jerome Charles Potts, DHN-bot~enwiki, Decibel, Frap, Lantrix, Matchups, MattOates, Stevemidgley, Cybercobra, Emmanuel JARRI, Mwtoews, Where, Towsonu2003~enwiki, SashatoBot, Vincenzo.romano, Brian Gunderson, Av, Misery~enwiki, Abolen,
AdultSwim, MTSbot~enwiki, Peyre, DagErlingSmrgrav, Angryxpeh, Dark ixion, Hu12, FatalError, Raysonho, WeggeBot, Musashi1600,
Andrew.george.hammond, Revolus, Cydebot, Krauss, Ttiotsw, Rchoate, Synergy, Ebraminio, Thijs!bot, MinorEdits, Andyjsmith, Dalahst,
Jcarle, Xzilla, AntiVandalBot, Bearheart, Marokwitz, LenzGr, Room813, Deective, Cjkporter, Martinkunev, Dskoll, GregorySmith,
Apostrophyx, NoDepositNoReturn, JamesBWatson, Bernd vdB~enwiki, Gabriel Kielland, EagleFan, Cander0000, Nevit, Gwern, Scottmacpherson, Ronbtni, Lmxspice, Zeus, R'n'B, Whale plane, Sven Klemm~enwiki, Keesiewonder, Usp, Eleven81, VolkovBot, Allencheung,
Blindmatrix, Bramschoenmakers, Luke Lonergan, Kmacd, HLHJ, RonaldDuncan, Dfetter, Eljope, Jibun, PieterDeBruijn, Agentq314,
Anas2048, Kindofoctarine, Majeru, ChrisMiddleton, Bfcase, X-Fi6, Jojalozzo, Gorgot, Ctkeene, Ctxppc, Jonlandrum, Trevorbrooks,
Martarius, ClueBot, Kl4m, Tintinobelisk, The Thing That Should Not Be, Kl4m-AWB, Nikolas Stephan, Niceguyedc, M4gnum0n,
WikiNickEN, Freerangelibrarian, Pmronchi, Eeekster, TobiasPersson, Chrisarnesen, SF007, DumZiBoT, TimTay, XLinkBot, Jabberwoch, Andy318, Addbot, Mortense, Nate Wessel, Ginzel~enwiki, Fale, Luckas-bot, Yobot, Specious, AnomieBOT, Coolboy1234, Piano
non troppo, Kukushk, ArthurBot, Wikante, Gilo1969, Zenaan, FChurca, Mark Renier, W Nowicki, Alex.ryazantsev, Kwiki, Louperibot, William.temperley, Simple Bob, B3t, Tim baroon, Skyerise, Jandalhandler, Full-date unlinking bot, Bmomjian, Jons2006, Filiprem,
Ravenmewtwo, RjwilmsiBot, Streapadair, EmausBot, Grldedwrdbutler, Marzalpac, Klenot, Dewritech, Peaceray, Solarra, Your Lord
and Master, AvicBot, H3llBot, Demonkoryu, Gz33, . , Sbmeirow, Palosirkka, Eggyknap, Tijfo098, ChuispastonBot,
Rugh, DisneyG, ClueBot NG, Birkbot, Mangal ratna, Redneb33, Web20boom, Kasirbot, Patrias, Denys.Kravchenko, Kwetal1, Kweetal
nl, Winston Chuen-Shih Yang, Codename Lisa, Laurenz albe, Palmbeachguy, Digoal, Praemonitus, RaphaelQS, Comp.arch, ScotXW,
Lavagnino, Craigkerstiens, Erilong, Unician, Simonriggs, X3mole, Helldalgo and Anonymous: 393
SQL Source: http://en.wikipedia.org/wiki/SQL?oldid=660931872 Contributors: Damian Yerrick, Magnus Manske, Jimbo Wales, Eloquence, Wesley, Bryan Derksen, Zundark, The Anome, Jzcool, Sjc, Jan Hidders, Ed Poor, Andre Engels, Greg Lindahl, Hari, PierreAbbat,
William Avery, Roadrunner, Ben-Zin~enwiki, Merphant, Caltrop, Heron, Arvi~enwiki, BL~enwiki, Hirzel, Branko, Leandrod, Frecklefoot, Edward, JohnOwens, Michael Hardy, Modster, DopeshJustin, Lousyd, Rp, Kku, Delirium, Ahoerstemeier, Docu, Angela, Julesd,
Randomned, Jonik, Mxn, Scanos, Nikola Smolenski, Emperorbma, Charles Matthews, Timwi, Dcoetzee, Nohat, Dmsar, Dysprosia,
Jay, Traal, ThomasStrohmann~enwiki, Qu1j0t3, Jerey Smith, Furrykef, Mdchachi, Wernher, Bevo, Nricardo, Shizhao, Toreau, Jamesday, Francs2000, Jeq, Denelson83, Robbot, Hankwang, Chealer, Craig Stuntz, Kizor, Jacek79, RedWolf, Goethean, Dittaeva, Nurg,
Andr3w, Lowellian, Ashley Y, Rfc1394, Rursus, Wikibot, Ruakh, Tobias Bergemann, Weialawaga~enwiki, 0x0077BE, BenFrantzDale,
var Arnfjr Bjarmason, Zigger, Peruvianllama, Alterego, Mark T, Thetorpedodog, Alon~enwiki, Duncharris, Jorge Stol, AlistairMcMillan, Joelm, Neilc, Stevietheman, Decoy, Chowbok, Gadum, Slavering.dog, Mendel, SarekOfVulcan, Gzuckier, Beland, Wmaheriv,
Rdsmith4, Mzajac, Maximaximax, Bumm13, Karl-Henner, Troels Arvin, Yakovsh, Aidan W, Olivier Debre, AnandKumria, Adashiel,
Asqueella, Canterbury Tail, RevRagnarok, D6, Ta bu shi da yu, R, CALR, Coeehood, Aou, Alexrexpvt, KeyStroke, Rhobite, Schuetzm,
Jpk, Paul.mcjones, Traxer~enwiki, MeltBanana, Goplat, Plugwash, Elwikipedista~enwiki, Danakil, DanP, Kop, Lankiveil, Kwamikagami,
Tgeller, Egrabczewski, Ronstone, Blonkm, John Vandenberg, Cwolfsheep, Safay, LuoShengli, Unknown W. Brackets, Franl, Minghong,
Sam Korn, Mdd, Andrisi, Iolar~enwiki, HasharBot~enwiki, Jumbuck, Steve Alvesteer, Goki, Orzetto, Alansohn, Liao, Tablizer, Nsd,
Jezmck, Andrewpmk, M7, Pouya, Osmodiar, Velella, Tiha, RainbowOfLight, VoluntarySlave, Alai, Kitch, S gueiredo, Einst3, Mahanga, Crosbiesmith, Siafu, Ondrejk, Simetrical, Mindmatrix, Lost.goblin, TigerShark, Camw, Arcann, Mathmo, Uncle G, DanBishop,
Admrboltz, Paul Mackay~enwiki, Ruud Koot, KymFarnik, Burgher, Bkwillwm, Wikiklrsc, KingsleyIdehen, MacTed, GregorB, Plrk,
Prashanthns, Wisq, Vivek.pandey, Turnstep, Pmcjones, Mandarax, Wulla, Graham87, Spezied, Quantum00, Cuchullain, BD2412, DePiep, Dpr, Sjakkalle, Rjwilmsi, Tizio, Koavf, XP1, Trlovejoy, Salix alba, Ajcumming, Ltruett, Cww, Chtirrell, Dianelos, Fred Bradstadt,
Platypus222, Miskin, Sgkay, Wragge, FlaBot, Bobstay, RobertG, Ground Zero, Ysangkok, GnuDoyng, ApprenticeFan, Sstrader, Intgr,
Alvin-cs, MoRsE, Chobot, Visor, DVdm, Bobdc, Peterl, Yzchang, Elfguy, YurikBot, MathiasRav, Todd Vierling, Hairy Dude, RussBot,
Severa, Piet Delport, Hydrargyrum, Powerlord, Stephenb, Barefootguru, CambridgeBayWeather, Bovineone, RadioKirk, NawlinWiki,
DragonHawk, Razorx, Gosub, Grafen, Reikon, Neum, Dugosz, Aaron Brenneman, Hakkinen, Xdenizen, Larsinio, Mikeblas, Ezeu,
Scs, Iancarter, Dlyons493, Elkman, Alpha 4615, Saric, Vonfragino, Lt-wiki-bot, Chase me ladies, I'm the Cavalry, Closedmouth,
Jwissick, Cedar101, CyberShadow, GraemeL, Anclation~enwiki, JLaTondre, Solarusdude, Kubra, Allens, Ben D., Mhkay, Rwwww,
GrinBot~enwiki, Dan Atkinson, Jonearles, XSTRIKEx6864, IanGB, AndrewWTaylor, Trevorloin, DrJolo, Jsnx, SmackBot, Tcutcher,
Haza-w, ElectricRay, Incnis Mrsi, Reedy, Frando~enwiki, Basil.bourque, Od Mishehu, Power piglet, Dennis forbes, Brick Thrower,

12.5. TEXT AND IMAGE SOURCES, CONTRIBUTORS, AND LICENSES

95

Stie, Inonit, Jpvinall, ActiveSelective, Commander Keane bot, Unforgettableid, Gilliam, NickGarvey, KD5TVI, Michele.alessandrini,
Schaef, Theone256, Davep.org, Thumperward, Oli Filth, Jerome Charles Potts, Dlohcierekims sock, Octahedron80, Nbarth, DHNbot~enwiki, Thekaleb, Hongooi, SuezanneC Baskerville, Ville Oikarinen, Mahamoty, Jimhark, Countersubject, NYKevin, Can't sleep,
clown will eat me, Rdeleonp, Frap, Jsmethers, Racklever, Kaimiddleton, Mackseem~enwiki, Opticyclic, Cybercobra, Jdlambert, Xibe,
Dreadstar, A.R., Markhobley, Jon Awbrey, FelisLeo, Mersperto, Lambiam, Gennaro Prota, Plcsys, Rklawton, Dbtfz, Kuru, Wingnut909,
Vincenzo.romano, Asix, Av, Stratadrake, Loadmaster, Tasc, Beetstra, Ehheh, Optakeover, Johnmc, Aresgunther, Ric, Hu12, Norm
mit, BranStark, Dreftymac, Sander Sde, GregCovey, Paul Foxworthy, Beno1000, Adrian.walker, Gil Gamesh, Az1568, Cherry Cotton, Booles, Tawkerbot2, The Letter J, Ioannes Pragensis, FatalError, SkyWalker, Comps, Paulmlieberman, SqlPac, CRGreathouse,
Ivan Pozdeev, TunaSushi, Pukkie, JohnCD, Baiji, Harperska, GHe, TheExtruder, Avillia, MaxEnt, Gregbard, JamesNK, Badseed,
Mblumber, Drgrussell, Poloolop, Dancter, Tawkerbot4, Christian75, Dsan, FrancoGG, Epbr123, Skreyola, Ucanlookitup, Davidhorman, Klausness, Escarbot, Mentisto, KrakatoaKatie, AntiVandalBot, Gioto, Luna Santin, Guy Macon, Seaphoto, EarthPerson, Quintote, DennisWithem, Lfstevens, Hardeeps, Bodmerb, Deective, BlindEagle, SiobhanHansa, Acroterion, Kreca, Thirtyfootscrew, Magioladitis, Jaysweet, Bongwarrior, VoABot II, Sinisterstuf, Simuloid, Master2841, Twsx, Cic, Aka042, Bernd vdB~enwiki, Ahecht,
Capnchicken, Gabrielsroka, 28421u2232nfenfcenc, Wwmbes, Allstarecho, Cpl Syx, Just James, Matt.smart, Falcor84, Ftiercel, Gwern, Spectrum266, MartinBot, GrandPoohBah, Grauenwolf, R'n'B, RockMFR, Qweruiop321, J.delanoy, Mojodaddy, Huzarus~enwiki,
Herbythyme, Smartweb, Macaldo, Joeyjojo Junior, Cpiral, Bill Human, Alalia 17, Jackacon, Cometstyles, DH85868993, Channard,
Kvdveer, Ajfweb, MartinRinehart, Bonadea, Sbvb, DigitalEnthusiast, Love1710, Delikedi, 28bytes, Jimmytharpe, VolkovBot, Harlock
jds, Gsapient, Je G., Pparazorback, WOSlinker, Philip Trueman, TXiKiBoT, AllanManangan, Vitund, Crowne, Anonymous Dissident,
Combatentropy, Somme111, Subux, Thunderbritches, Swanyboy2, JhsBot, Kovianyo, MichaelSpeer, PDFbot, David Condrey, Wykypydya, Zhenqinli, Butterscotch, Andy Dingley, SallyBoseman, Synthebot, Enviroboy, AgentCDE, Ulf Abrahamsson~enwiki, AlleborgoBot,
Anoko moonlight, S.rvarr.S, Jeenware, Entoaggie09, Metroking, SieBot, Gopher292, VVVBot, Winchelsea, Caltas, X-Fi6, Starius,
Flyer22, Ehajiyev, MinorContributor, JCLately, SouthLake, Harry~enwiki, RW Marloe, Viridity~enwiki, Legacypath, Svick, AlanUS,
Peter.vanroose, Apienczy, Aarthib123, Ravi555, Escape Orbit, Coremayo, Startswithj, Vanished user qkqknjitkcse45u3, Mikevoxcap,
De728631, ClueBot, SummerWithMorons, The Thing That Should Not Be, Unbuttered Parsnip, Mild Bill Hiccup, DragonBot, Eboyjr,
CF84, Jusdafax, Three-quarter-ten, Ferdna, Decon1985, Vivio Testarossa, Behringerdj, Aseld, Fleurydj, Joieko, Kruusamgi, B15nes7,
SF007, TimTay, XLinkBot, Fastily, Libcub, Mitch Ames, WikHead, Smu95rp, Alexius08, Osarius, Addbot, Ghettoblaster, DOI bot, Tcncv, MrOllie, Download, Favonian, Tomtheeditor, Lucian Sunday, LinkFA-Bot, Jasper Deng, West.andrew.g, Justinkaz, Evildeathmath,
Lightbot, Sergioledesma, Zorrobot, CountryBot, Luckas-bot, Yobot, Saramar10, JackPotte, Bunnyhop11, Ptbotgourou, Washburnmav,
Infojunkie23, KamikazeBot, Wadamja, AnomieBOT, Sql pol, Coolboy1234, Galoubet, Royote, Piano non troppo, Cuckoosnest, Jzel6201,
Materialscientist, Brassrat70s, Lavarock86, Citation bot, La comadreja, Littlebluenick, GB fan, ArthurBot, Quebec99, Xqbot, Meh222,
Greco-German, Yeneesha, Doctorx0079, Nasa-verve, GrouchoBot, Jonas AGX, Frosted14, SciberDoc, Amaury, Xjhx001, Hymek,
Loveenatayal, Joaquin008, David Nemati, PM800, Cekli829, FrescoBot, Logiphile, Netfriend, Wiretse, Mark Renier, Jc3s5h, Wei.cs,
Sippsin, Finalius, Gawat123, Citation bot 1, NiceGuyEduardo, Jschnur, Philippe Perrault, Tjmoel, Alec.korba, RBarryYoung, Starbeard,
Weylinp, TobeBot, Trappist the monk, Lotje, Mt.toth, Vrenator, JnRouvignac, Crysb, DavidWikiuser, Yeng-Wang-Yeh, Oljtn, Bricaniwi,
Difu Wu, Ribaw1, Salvio giuliano, Smeyerinnewton, B6nb3k, Tagtool, EmausBot, John of Reading, WikitanvirBot, Carbo1200, K6ka,
Kelti, Savh, Kpelt, ZroBot, Ida Shaw, Njbooher, F, Shuipzv3, SporkBot, Jay-Sebastos, Kesava84, Donner60, Pun, Bomazi, Tijfo098,
Leave Mr Mitchell alone!, ChuispastonBot, Moontube, Wakebrdkid, Rdmil, ClueBot NG, Ethg242, Peter James, Lukaseder, Bstan72,
O.Koslowski, Edwinludo, Masssly, Widr, Antiqueight, Danim, Helpful Pixie Bot, Hippo75, DefaultLocale, BG19bot, Purple Data, Smithhogg, Grigrim, Mark Arsten, Compfreak7, Amolbot, Syzy, Pogonomyrmex, Gefstar1, Boshomi, Chmarkine, Abuyakl, Dhies88, Davidfreesefan23, Sbose7890, ItsMeowAnywhere, Naveen0665, BattyBot, MatthewIreland, ChrisGualtieri, Thom2729, APerson, Fabius.83,
Mogism, Mradkins96, Detjo, Sailee5, Brsaweda, Frosty, Feder raz, Faizan, Epicgenius, Mark10011, DangerouslyPersuasiveWriter, I
am One of Many, Deepaksogani, Suranjan91, Banannamal, Jacobnibu, Njol, Ilaydakinalan, Mgt88drcr, Monkbot, Poepkop, Alrich44,
NickoCA, Prog algo, Lolsall, Mdhaseenkhan733 and Anonymous: 1094
NoSQL Source: http://en.wikipedia.org/wiki/NoSQL?oldid=661050885 Contributors: AxelBoldt, Maury Markowitz, Jose Icaza, Pnm,
Kku, Komap, Phoe6, Ronz, Ntoll, Ehn, Timwi, Furrykef, Bearcat, Peak, Dilbert, (:Julien:), Tagishsimon, Gadum, Coldacid, Alexf, Beland, Euphoria, Clemwang, R, MMSequeira, Smyth, Leigh Honeywell, Russss, Stephen Bain, Thringer, Walter Grlitz, Markito~enwiki,
Bhaskar, PatrickFisher, YPavan, Eno~enwiki, Crosbiesmith, Marasmusine, Woohookitty, Linas, Tshanky, Barrylb, Dm~enwiki, Tabletop,
MacTed, Nileshbansal, BD2412, Qwertyus, Koavf, Ceefour, Strait, Amire80, Seraphimblade, ErikHaugen, Professionalsql, Vegaswikian,
Jubalkessler, ElKevbo, Dmccreary, AlisonW, RobertG, Sstrader, Intgr, Tedder, Benbovee, Wavelength, Hairy Dude, Bovineone, Morphh,
SamJohnston, Mbonaci, Rjlabs, Leotohill, Poohneat, GraemeL, Volt42, HereToHelp, Jonasfagundes, JLaTondre, Shepard, Matt Heard,
Benhoyt, A bit iy, SmackBot, Fulldecent, Anastrophe, Mauls, Drttm, Gorman, Somewherepurple, KiloByte, Thumperward, Jstplace,
Jerome Charles Potts, , Frap, DavidSol, Cybercobra, Plustgarten, Looris, ThomasMueller, Trbdavies, NickPenguin,
Eedeebee, ThurnerRupert, Petr Kopa, Zaxius, Lguzenda, Heelmijnlevenlang, Omidnoorani, Mauro Bieg, Benatkin, Mjresin, Hu12,
Charbelgereige, Dancrumb, Gpierre, Arto B, Raysonho, Sanspeur, Ostrolphant, ProfessorBaltasar, Netmesh, OmerMor, Neustradamus,
ColdShine, Mydoghasworms, Viper007Bond, Headbomb, CharlesHoman, Peter Gulutzan, Davidhorman, Philu, Bramante~enwiki,
Nick Number, Sorenriise, Polymorph self, Widefox, QuiteUnusual, Lfstevens, Gstein, Syaskin, Dericolho, Joolean, Orenfalkowitz,
Kgeischmann, Philg88, Mitpradeep, Adtadt, GimliDotNet, Lmxspice, Stimpy77, Mikek999, DatabACE, JohnPritchard, Ansh.prat, McSly, Atropos235, Lamp90, Jottinger, Anoop K Nayak, Bbulkow, Tonyrogerson, Robert1947, Billinghurst, Quiark, Kbrose, ManikSurtani,
TJRC, Dawn Bard, Whimsley, DavidBourguignon, Flyer22, Ctxppc, Mesut.ayata, Legacypath, AndrewBass, Edlich, Drq123, CaptTofu,
Stevedekorte, Rossturk, Niceguyedc, Cnorvell, Pointillist, Excirial, Zapher67, PixelBot, Dredwol, Robhughadams, Arjayay, Razorame, StanContributor, Irmatov, Shijucv, The-verver, Tgrall, Miami33139, XLinkBot, Phoenix720, Duncan, Fiskbil, Whooym, Techsaint, Addbot, Fmorstatter, Mortense, Mabdul, MrOllie, LaaknorBot, Chrismcnab, Alexrakia, Getmoreatp, Luckas-bot, Yobot, Amirobot,
Pcap, Ebalter, Ma7dy, AnomieBOT, Angry bee, Fraktalek, White gecko, Materialscientist, Xtremejames183, Cyril Wack, Jabawack81,
Gkorland, Tomdo08, ChristianGruen, FontOfSomeKnowledge, Rtweed1955, Omnipaedista, Sduplooy, Shadowjams, Ciges, Cekli829,
Sdrkyj, FrescoBot, Nawroth, Ashtango, Sae1962, Thegreeneman5, David Paniz, Ertugka, Chenopodiaceous, Winterst, I dream of horses,
Leegee23, Hoo man, Natishalom, Michael Minh, Seancribbs, Jandalhandler, Craigbeveridge, Cnwilliams, Colemala, Argv0, Justinsheehy, AdityaKishore, Javalangstring, Voodootikigod, JnRouvignac, Svesterli, Violaaa, Hoelzro, Magnuschr, Extrovrt101, Wyverald,
Jedexter77, Uhbif19, Zond, Asafdapper, Ptab, Tobiasivarsson, Alexandre.Morgaut, Steve03Mills, Phunehehe, R39132, EmausBot,
Bionderplus, WikitanvirBot, FalseAxiom, Bdijkstra, Dewritech, GoingBatty, RA0808, Ledhed2222, MrWerewolf, EricBloch, Hloeung, ZroBot, Weimanm, Al3xpopescu, Theandrewdavis, Mhegi, Sagarjhobalia, Mtrencseni, Phillips-Martin, Dmitri.grigoriev, H3llBot,
Jnaranjo86, DamarisC, Dstainer, Bulwersator, Eco schranzer, Thomas.uhl, Lyoshenka, Inmortalnet, Really Enthusiastic, Germanviscuso, Stephen E Browne, ClueBot NG, Rabihnassar, Ki2010, Luisramos22, Fxsjy, Korrawit, Tylerskf, Castncoot, ScottConroy, Jrudisin, Mshefer, Ashtango5, Helpful Pixie Bot, Pereb, William greenly, Rpk512, GlobalsDB, DBigXray, Tuvrotya, BG19bot, Nawk, Go-

96

CHAPTER 12. QUERY LANGUAGE

nim, Freshnfruity, Vychtrle, Gaborcselle, Kkbhumana, Frze, AvocatoBot, Mark Arsten, Compfreak7, Anne.naimoli, Matspca, Boshomi,
Dshelby, Brocsima, BigButtery, Winston Chuen-Shih Yang, Griswolf, Socialuser, Ugurbost, Khiladi 2010, Noah Slater, Farvartish,
Knudmoeller, Electricmun11, Mbarrenecheajr, Corrector623, Sandy.toast, F331491, Luebbert42, Anujsahni, Tsvljuchsh, Makecat-bot,
Fitzchak, Toopathnd, Msalvadores, Cloud-dev, Sasindar, CJGarner, Crosstantine, Stevenguttman, Razibot, DallasClarke, Altered Walter, Rediosoft, Tsm32, Franois Robere, Harpreet dandeon, LeeAMitchell, Mbroberg, Virendervermamca, Anilkumar1129, Mhgrove,
FranzKraun, Jasonhpang, Nanolat, Nosql.analyst, Rzicari, Ginsuloft, Sugamsha, K0zka, Tshuva, Dabron, Mongochang, Natan.puzis, Webtrill, CafeNoName, Yasinaktimur, Monkbot, Itamar.haber, User db, Textractor, Maykurutu, Kamaci, Mongodbheavy, RedOctober13,
Nathan194, Jjrenzel, Azanebrain, Annmkelly1, Sunnyeyre, Danny996, Thomas4019, Dr. Testicate, M.D., Johnbweeks, Magic-carpetpilot, IdlePlayground, Datadatadatadata, Kevin at aerospike, Anywhichway and Anonymous: 522
NewSQL Source: http://en.wikipedia.org/wiki/NewSQL?oldid=659686187 Contributors: Maury Markowitz, Beland, Julian Mehnle~enwiki,
Stuartyeates, MacTed, Quuxplusone, Intgr, Datamgmt, Amux, Apavlo, Ibains, Duncan.Hull, MPH007, Phoenix720, Dsimic, MrOllie, Yobot, AnomieBOT, Noq, W Nowicki, Diego diaz espinoza, Cnwilliams, Bulwersator, UMD-Database, BG19bot, Akim.demaille,
Plothridge, Sanketsarang, Brianna.galloway, Mwaci99, Andygrove73, Monkbot, Sergejjurecko, Qid4475 and Anonymous: 18
XML database Source: http://en.wikipedia.org/wiki/XML%20database?oldid=657057272 Contributors: Stevertigo, Nichtich~enwiki,
Pedant17, Chowbok, Coldacid, Beland, Klingon, Xmlizer, Rich Farmbrough, John Vandenberg, Enric Naval, Pearle, Mdd, Arnabdotorg, Tbradford, Snodnipper, Bohumir Zamecnik, Qwertyus, Rjwilmsi, Hgkamath, Dmccreary, AJackl, Kmorozov, Bgwhite, Michael
Slone, Mehran, Gregburd, Nikkimaria, DoriSmith, Rayngwf, SmackBot, Barefootliam, Dizzzz, Brick Thrower, OlliX, TRosenbaum,
Abukaspar, Chris the speller, Thumperward, Colonies Chris, Happygirae, Mitchumch, Eedeebee, Kokotero, Slakr, Mauro Bieg, Glen
Pepicelli, Courcelles, Lamdk, Rastgoo, Edward C. Zimmermann, Xxanthippe, GVogeler, Juansempere, Doclabyrinth, Epbr123, Touko
vk, Gpallis, Cdicarlo, MiddleEarth, Radim Baca, Dilane, Metaperl, Kgeischmann, R'n'B, Xshezang, Belovedfreak, Andionita, Lamp90,
Signalhead, Philip Trueman, Q Chris, Linelor, Xmlchamp, Jzhang2007, Hobartimus, ClueBot, Adrianwn, Xpriori, PixelBot, Johndbritton, Libcub, Avoided, Ccouvrette, Addbot, Mabdul, Joerg84, Tide rolls, Lightbot, Themfromspace, Bunnyhop11, Terrictrid, Carleas,
Sykamoore, AnomieBOT, Materialscientist, CorcaighAbu, 16x9, ChristianGruen, Rtweed1955, Bernd vdB old, FrescoBot, Mark Renier, DickieRose, EmausBot, Playmobilonhishorse, EricBloch, Bxj, Amirfr, AManWithNoPlan, Americanpiggy, Donner60, Tags123,
Xafran~enwiki, Adamretter, Danim, BG19bot, Gonim, F331491, AlbertJB, Lugia2453, Vojtechtoman, Datadatadatadata and Anonymous: 207
Data denition language Source: http://en.wikipedia.org/wiki/Data%20definition%20language?oldid=653492219 Contributors: Nate
Silva, BL~enwiki, Modster, Wwwwolf, Zanimum, WeiNix, Andrewman327, Babbage, Academic Challenger, Jason Quinn, Decoy,
Eliazar, Abdull, KeyStroke, Goplat, Alansohn, Lectonar, Emvee~enwiki, Mindmatrix, RHaworth, WadeSimMiser, GregorB, Chupon,
Rjwilmsi, FlaBot, Tumble, Isotope23, Riki, Fresheneesz, UkPaolo, Roboto de Ajvol, YurikBot, RobotE, Zwobot, JLaTondre, Katieh5584,
Mhkay, Tom Morris, SmackBot, Elonka, Unyoyega, Gilliam, NickGarvey, MrRadioGuy, Heimstern, Aleenf1, 16@r, JoeB~enwiki, MrDolomite, Hu12, Iridescent, Gcdinsmore, SkyWalker, SqlPac, Dgw, Bposert, Juansempere, Tobias382, Thijs!bot, Marek69, Luna Santin,
CodeNaked, Eags, VoABot II, Skew-t, Rstinejr, Ftiercel, Cecilkorik, MartinBot, Tgeairn, Snay2, LordAnubisBOT, Entropy, Cometstyles, BioStu, Squids and Chips, WOSlinker, TXiKiBoT, Aymatth2, Anna Lincoln, Martin451, Kbrose, Bentogoa, Svick, ClueBot,
Cybersprocket~enwiki, C628, Aitias, DumZiBoT, WikHead, Vy0123, Addbot, Trevorbjork, AkhtaBot, SpBot, Ginosbot, JakobVoss,
TestEditBot, AnomieBOT, Sjgilbertz, Materialscientist, Xqbot, Thehelpfulbot, Mark Renier, Winterst, Vrenator, NerdyScienceDude,
Whywhenwhohow, Santoshijd, Elektrik Shoos, Caspertheghost, QEDK, Mayur, ClueBot NG, Muon, Widr, Danim, Roberticus, Boshomi,
Tomsimtim, Lugia2453, SFK2, Graphium, Epicgenius, Johnathan29, Navjagat, A Grammar-Robot, Byiringirobill, Gvcsm2230, Akshay
S. Jadhav and Anonymous: 136
Data manipulation language Source: http://en.wikipedia.org/wiki/Data%20manipulation%20language?oldid=642232138 Contributors: Booyabazooka, Jay, Frazzydee, Tobias Bergemann, KeyStroke, Discospinster, CanisRufus, Shanes, Minghong, Jcfried, RHaworth,
Chupon, OMouse, FlaBot, Isotope23, Vmenkov, YurikBot, Sikon, Zwobot, KnightRider~enwiki, SmackBot, Eskimbot, Gilliam, Markhobley, Tony Fox, Danlev, SqlPac, Chrisahn, Aneeshpu, Thijs!bot, AntiVandalBot, Nevcao, CodeNaked, Wikieditor06, TXiKiBoT, Andy
Dingley, Kbrose, SieBot, OKBot, ClueBot, Tavahom~enwiki, Angoca, DragonBot, PixelBot, Addbot, Mr. Wheely Guy, LaaknorBot,
Jasper Deng, Yobot, Rubinbot, Xqbot, DSisyphBot, LucienBOT, Viveksharma474, RedBot, Super48paul, Rcsprinter123, ClueBot NG,
Vacation9, Danim, Plavozont, Xbalca02 and Anonymous: 50
Query language Source: http://en.wikipedia.org/wiki/Query%20language?oldid=659802246 Contributors: MarXidad, Edward, Ahoerstemeier, Nikola Smolenski, Frieda, Robbot, Ojigiri~enwiki, Jonathan.mark.lingard, Bkonrad, SarekOfVulcan, Troels Arvin, Trevor
MacInnis, R, KeyStroke, Slipstream, Elwikipedista~enwiki, Danakil, TommyG, John Vandenberg, Grutness, RJFJR, Throbblefoot,
Mindmatrix, Davidfstr, Toussaint, Joerg Kurt Wegner, Chtirrell, Ahunt, Vmenkov, YurikBot, RobotE, Larsinio, ZygmuntKrynicki,
DEng, Mhkay, Mgreenbe, BenAveling, AndrewWarden, Markhobley, Wikiolap, Soumyasch, Manifestation, IvanLanin, Devourer09,
Msnicki, Thijs!bot, Peter Gulutzan, BCable, JAnDbot, Inverse.chi, Deepugn, Usien6, Steven Walling, VolkovBot, MichaelSpeer, ASHPvanRenssen, Synthebot, Pjoef, Honys, OsamaK, SieBot, Ehajiyev, Svick, Retireduser1111, Jay42, Vanished user qkqknjitkcse45u3, ClueBot, ERfan111, Mild Bill Hiccup, Ihenriksen, Techno.modus, MystBot, Addbot, Tassedethe, Srandrews, Jarble, Luckas-bot, Beaton1131,
HanielBarbosa, Groovenstein, CxQL, Amin Hashem, Valafar, Logiphile, Mark Renier, Kwiki, Albert688, RedBot, AmirMehri, Adarw,
Xodlop, EmausBot, John of Reading, GermanJoe, Diamondland, ClueBot NG, Danim, BG19bot, Bacchus123, Mark Arsten, SupernovaExplosion, Shekhardtu, Alex Ashdealer and Anonymous: 42

12.5.2

Images

File:Ambox_current_red.svg Source: http://upload.wikimedia.org/wikipedia/commons/9/98/Ambox_current_red.svg License: CC0


Contributors: self-made, inspired by Gnome globe current event.svg, using Information icon3.svg and Earth clip art.svg Original artist:
Vipersnake151, penubag, Tkgd2007 (clock)
File:Ambox_important.svg Source: http://upload.wikimedia.org/wikipedia/commons/b/b4/Ambox_important.svg License: Public domain Contributors: Own work, based o of Image:Ambox scales.svg Original artist: Dsmurat (talk contribs)
File:CodasylB.png Source: http://upload.wikimedia.org/wikipedia/commons/d/d6/CodasylB.png License: CC-BY-SA-3.0 Contributors:
CIM: Principles of Computer Integrated Manufacturing, Jean-Baptiste Waldner, John Wiley & Sons, 1992 Original artist: Jean-Baptiste
Waldner
File:Commons-logo.svg Source: http://upload.wikimedia.org/wikipedia/en/4/4a/Commons-logo.svg License: ? Contributors: ? Original artist: ?

12.5. TEXT AND IMAGE SOURCES, CONTRIBUTORS, AND LICENSES

97

File:Computer-aj_aj_ashton_01.svg Source: http://upload.wikimedia.org/wikipedia/commons/c/c1/Computer-aj_aj_ashton_01.svg


License: CC0 Contributors: ? Original artist: ?
File:Crystal_Clear_device_cdrom_unmount.png Source: http://upload.wikimedia.org/wikipedia/commons/1/10/Crystal_Clear_device_
cdrom_unmount.png License: LGPL Contributors: All Crystal Clear icons were posted by the author as LGPL on kde-look; Original artist:
Everaldo Coelho and YellowIcon;
File:Database_models.jpg Source: http://upload.wikimedia.org/wikipedia/commons/3/3b/Database_models.jpg License: CC BY-SA
3.0 Contributors: Own work Original artist: Marcel Douwe Dekker
File:Edit-clear.svg Source: http://upload.wikimedia.org/wikipedia/en/f/f2/Edit-clear.svg License: Public domain Contributors: The
Tango! Desktop Project. Original artist:
The people from the Tango! project. And according to the meta-data in the le, specically: Andreas Nilsson, and Jakub Steiner (although
minimally).
File:Folder_Hexagonal_Icon.svg Source: http://upload.wikimedia.org/wikipedia/en/4/48/Folder_Hexagonal_Icon.svg License: Cc-bysa-3.0 Contributors: ? Original artist: ?
File:Free_Software_Portal_Logo.svg Source: http://upload.wikimedia.org/wikipedia/commons/3/31/Free_and_open-source_software_
logo_%282009%29.svg License: Public domain Contributors: FOSS Logo.svg Original artist: Free Software Portal Logo.svg (FOSS
Logo.svg): ViperSnake151
File:LAMP_software_bundle.svg Source: http://upload.wikimedia.org/wikipedia/commons/8/82/LAMP_software_bundle.svg License:
CC BY-SA 3.0 Contributors: This image includes elements that have been taken or adapted from this: <a href='//commons.wikimedia.
org/wiki/File:Tux-shaded.svg' class='image'><img alt='Tux-shaded.svg' src='//upload.wikimedia.org/wikipedia/commons/thumb/0/0a/
Tux-shaded.svg/17px-Tux-shaded.svg.png' width='17' height='20' srcset='//upload.wikimedia.org/wikipedia/commons/thumb/0/0a/Tux-shaded.
svg/25px-Tux-shaded.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/0/0a/Tux-shaded.svg/33px-Tux-shaded.svg.png
2x' data-le-width='249' data-le-height='297' /></a> Tux-shaded.svg. Original artist: ScotXW
File:MySQL.svg Source: http://upload.wikimedia.org/wikipedia/en/6/62/MySQL.svg License: Fair use Contributors:
The logo may be obtained from MySQL.
Original artist: ?
File:Mysql-screenshot.PNG Source: http://upload.wikimedia.org/wikipedia/commons/d/dd/Mysql-screenshot.PNG License: Public
domain Contributors: ? Original artist: ?
File:Office-book.svg Source: http://upload.wikimedia.org/wikipedia/commons/a/a8/Office-book.svg License: Public domain Contributors: This and myself. Original artist: Chris Down/Tango project
File:People_icon.svg Source: http://upload.wikimedia.org/wikipedia/commons/3/37/People_icon.svg License: CC0 Contributors: OpenClipart Original artist: OpenClipart
File:Postgresql_elephant.svg Source: http://upload.wikimedia.org/wikipedia/commons/2/29/Postgresql_elephant.svg License: BSD Contributors: http://pgfoundry.org/docman/?group_id=1000089 Original artist: Je MacDonald
File:Question_book-new.svg Source: http://upload.wikimedia.org/wikipedia/en/9/99/Question_book-new.svg License: Cc-by-sa-3.0
Contributors:
Created from scratch in Adobe Illustrator. Based on Image:Question book.png created by User:Equazcion Original artist:
Tkgd2007
File:RDBMS_structure.png Source: http://upload.wikimedia.org/wikipedia/commons/5/57/RDBMS_structure.png License: CC BYSA 3.0 Contributors: Own work Original artist: Scipete
File:Relational_key_SVG.svg Source: http://upload.wikimedia.org/wikipedia/commons/4/4c/Relational_key_SVG.svg License: CC
BY-SA 3.0 Contributors: Own work Original artist: IkamusumeFan
File:SQL_ANATOMY_wiki.svg Source: http://upload.wikimedia.org/wikipedia/commons/a/aa/SQL_ANATOMY_wiki.svg License:
CC-BY-SA-3.0 Contributors: Transferred from en.wikipedia; transferred to Commons by User:MARKELLOS using CommonsHelper.
Original artist: :User:SqlPac, modied by Ferdna. Original uploader was Ferdna at en.wikipedia
File:Speakerlink-new.svg Source: http://upload.wikimedia.org/wikipedia/commons/3/3b/Speakerlink-new.svg License: CC0 Contributors: Own work Original artist: Kelvinsong
File:Symbol_book_class2.svg Source: http://upload.wikimedia.org/wikipedia/commons/8/89/Symbol_book_class2.svg License: CC
BY-SA 2.5 Contributors: Mad by Lokal_Prol by combining: Original artist: Lokal_Prol
File:The_MySQL_Workbench_startup_screen.png Source: http://upload.wikimedia.org/wikipedia/en/9/9c/The_MySQL_Workbench_
startup_screen.png License: Fair use Contributors: Home computer, MySQL Workbench 5.2.44 Original artist: Philip Olson
File:Traditional_View_of_Data_SVG.svg Source: http://upload.wikimedia.org/wikipedia/commons/4/4d/Traditional_View_of_Data_
SVG.svg License: CC BY-SA 3.0 Contributors: Own work Original artist: IkamusumeFan
File:Wiki_letter_w.svg Source: http://upload.wikimedia.org/wikipedia/en/6/6c/Wiki_letter_w.svg License: Cc-by-sa-3.0 Contributors:
? Original artist: ?
File:Wikibooks-logo-en-noslogan.svg Source: http://upload.wikimedia.org/wikipedia/commons/d/df/Wikibooks-logo-en-noslogan.svg
License: CC BY-SA 3.0 Contributors: Own work Original artist: User:Bastique, User:Ramac et al.
File:Wikibooks-logo.svg Source: http://upload.wikimedia.org/wikipedia/commons/f/fa/Wikibooks-logo.svg License: CC BY-SA 3.0
Contributors: Own work Original artist: User:Bastique, User:Ramac et al.
File:Wikinews-logo.svg Source: http://upload.wikimedia.org/wikipedia/commons/2/24/Wikinews-logo.svg License: CC BY-SA 3.0
Contributors: This is a cropped version of Image:Wikinews-logo-en.png. Original artist: Vectorized by Simon 01:05, 2 August 2006
(UTC) Updated by Time3000 17 April 2007 to use ocial Wikinews colours and appear correctly on dark backgrounds. Originally
uploaded by Simon.

98

CHAPTER 12. QUERY LANGUAGE

File:Wikiquote-logo.svg Source: http://upload.wikimedia.org/wikipedia/commons/f/fa/Wikiquote-logo.svg License: Public domain


Contributors: ? Original artist: ?
File:Wikisource-logo.svg Source: http://upload.wikimedia.org/wikipedia/commons/4/4c/Wikisource-logo.svg License: CC BY-SA 3.0
Contributors: Rei-artur Original artist: Nicholas Moreau
File:Wikiversity-logo-Snorky.svg Source: http://upload.wikimedia.org/wikipedia/commons/1/1b/Wikiversity-logo-en.svg License: CC
BY-SA 3.0 Contributors: Own work Original artist: Snorky
File:Wiktionary-logo-en.svg Source: http://upload.wikimedia.org/wikipedia/commons/f/f8/Wiktionary-logo-en.svg License: Public
domain Contributors: Vector version of Image:Wiktionary-logo-en.png. Original artist: Vectorized by Fvasconcellos (talk contribs),
based on original logo tossed together by Brion Vibber

12.5.3

Content license

Creative Commons Attribution-Share Alike 3.0