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";
By continuing to use this website you are giving consent to cookies being used in accordance with the MarkLogic Privacy Statement.