Here are some helpful analogies for those coming to MarkLogic from an RDBMS world.

SQL term MarkLogic term
database database
partition forest
table collection (or directory )
index index
row document
column element or attribute
join embedding or linking
primary key document URI
SQL statement MarkLogic XQuery expression *
CREATE TABLE USERS (a 
            Number
            , b 
            Number
            )
Not necessary
ALTER TABLE users ADD ...
Not necessary
INSERT INTO USERS VALUES(3,5)
document-insert("/foo.xml", 
  <user>
    <a>3</a>
    <b>5</b>
  </user>
)
SELECT a,b FROM users
/user/(a|b)
SELECT * FROM users
/user
SELECT * FROM users WHERE age=33
/user[age = 33]
SELECT a,b FROM users WHERE age=33
/user[age = 33]/(a|b)
SELECT * FROM users WHERE age=33 
 ORDER BY name
for $user in /user[age = 33]
order by $user/name
return $user
SELECT * FROM users WHERE age>33
/user[age > 33]
SELECT * FROM users WHERE age!=33
/user[age != 33]
SELECT * FROM users 
 WHERE name LIKE 
            "%Joe%"
(: text substring, matches "Joey" :)/user[fn:contains(name, "Joe")]

(: full word match :)
/user[cts:contains(name, "Joe")]
SELECT * FROM users 
 WHERE name LIKE 
            "Joe%"
/user[cts:contains(name, "Joe*")]
SELECT * FROM users 
 WHERE age>33 AND 
       age<=40
/user[age > 33 and age <= 40]
SELECT * FROM users 
 ORDER BY name DESC
for $user in /user
order by $user/name descending
return $user
SELECT * FROM users 
 WHERE a=1 AND 
       b='q'
/user[a = 1][b = 'q']
SELECT * FROM users 
 LIMIT 10 SKIP 20
/user[21 to 30]
SELECT * FROM users WHERE a=1 or b=2
/user[a = 1 or b = 2]
SELECT * FROM users LIMIT 1
(/user)[1]
SELECT order_id FROM 
 orders o, order_line_items li 
 WHERE li.order_id=o.order_id 
 AND   li.sku=12345
/items[sku = 12345]/order_id
SELECT customer.name FROM customers,orders 
 WHERE orders.id=
            "q179"
            AND   orders.custid=customer.id
/customer
 [id = fn:doc("/order/q179")/custid]/name
SELECT DISTINCT last_name FROM users
(: standard :)
fn:distinct-values(/user/last_name)          

(: optimized :)
cts:element-values(xs:QName("last_name"))
SELECT COUNT(*y) FROM users
estimate(/user)
SELECT COUNT(*y) FROM users 
 WHERE AGE > 30
estimate(/user[age > 30])
SELECT COUNT(AGE) from users
estimate(/user/age)
CREATE INDEX myindexname ON users(name)
Not necessary
CREATE INDEX myindexname 
 ON users(name, ts DESC)
Not necessary
EXPLAIN SELECT * FROM users WHERE z=3
plan(/user[z = 3])
UPDATE users SET a=1 WHERE b='q'
node-replace(/user[b = 'q']/a, <a>1</a>)
UPDATE users SET a=a+2 WHERE b='q'
for $a in /user[b = 'q']/a
return node-replace($a, <a>{$a + 2}</a>)
DELETE FROM users WHERE z=
            "abc"
(: auto iterates :)
document-delete(/user[z = "abc"])


* The expression must be prefaced by the following:

xquery version "1.0-ml"; 
declare default function namespace "https://marklogic.com/xdmp";

Learn More

Application Developer's Guide

Read the methodologies, concepts, and use cases related to application development in MarkLogic Server, with additional resources.

MarkLogic Developer Learning Track

Want to build that awesome app? Get off the ground quickly with the developer track, with instructor-led and self-paced courses.

Getting Started Video Tutorials for Developers

This series of short videos tutorials takes developers who are new to MarkLogic from download to data hub, fast.

This website uses cookies.

By continuing to use this website you are giving consent to cookies being used in accordance with the MarkLogic Privacy Statement.