SQL error while using LIMIT - sql

I am a beginner with SQL and I'm following the tutorial at W3 Schools SQL Exercises. I tried to run the following query but I am getting error:
SELECT * FROM Customers LIMIT 5, 5
ERROR:
Syntax error in FROM clause.

Your problem is that you are using MySql syntax instead of SqlServer syntax.
You should use:
SELECT TOP 5 * FROM Customers

If you're following the example in the link you provided...
We will use the Customers table in the Northwind database:
Northwind is a sample database in MS SQL products. And MS SQL does not have support using LIMIT queries. So that website is probably using some version of that RDBMS.
Try running:
SELECT TOP 5 * FROM customers;
This gets you the first 5 records in the result set (unordered). It does not skip any records, though, as your LIMIT 5, 5 clause would have.

You can see that they use ADODB, so you should use TOP clause:
SELECT TOP 5 * FROM Customers

I suspect you need to use offset:
select * from Customers limit 5 offset 5;
Not all RDBMSs support the limit m,n syntax (I believe MySQL does, but PostgreSQL doesn't). Also, you'll probably want to use an order by clause to help ensure that you get consistent results with your query (because databases, in general, don't care about the order of rows or columns unless you specify):
select * from Customers order by col limit 5 offset 5;

I had the same problem. You can use rownum:
select * from Customers where rownum < 6;

Related

Gupta SQL Base limit number of rows returned

I've been looking for hours on how to return a limited set of rows similar to SELECT TOP 100 * FROM CUSTOMERor SELECT * FROM CUSTOMER LIMIT 100 or SELECT * FROM CUSTOMER WHERE ROWNUM <= 100 and for the life of me I cannot find a way to do this with this particular database.
The database version is 10.1.46 and I've found documentation for a later version of SQLBase that says the Limit keyword is what should be used, but nothing has worked when attempting to limit the amount of rows returned using isql. SQL Prepare errors get thrown. I'm at a loss as to how to do this and I'm beginning to think the database just doesn't support limiting the amount of rows returned.
I'm hoping someone knows how I can limit the number of records returned.
As far as concerns, limit is implemented in Base SQL using session parameters:
SET LIMIT 100
SELECT * FROM CUSTOMER;
SET LIMIT OFF
Alternatively to 'LIMIT', you can use 'PERFORM' then 'FETCH' in SQLTalk:
PREPARE SELECT * from CUSTOMER ORDER BY <column1> DESC;
PERFORM;
FETCH 100;
or if you are using TeamDeveloper,
Simply:
SqlPrepareAndExecute( hSql, 'SELECT * from CUSTOMER ORDER BY <column1> DESC')
While nPtr < 101
Call SqlFetchNext(hSql,nReturn)
After v11.7 you can use the following syntax:
SELECT * FROM CUSTOMER LIMIT 100
p.s. If you need SQLBase manuals for any version v8 through v12.2 go here:
SQLBase Manuals ( all versions )

limited record accessing using SQL

How can I get limited no.of records from database into a web page using SQL query?
How to limit the number of result rows depends on the database software you are using; see the appropriate documentation. Microsoft products allow this via the keyword TOP, like so:
SELECT TOP 10
*
FROM
table_name;
MySQL, for instance, use LIMIT instead:
SELECT
*
FROM
table_name
LIMIT
10;
In Oracle Database, use ROWNUM:
SELECT
*
FROM
table_name
WHERE
ROWNUM <= 10;
See http://www.w3schools.com/sql/sql_top.asp

How to restrict oracle LIKE clause results

I have an Oracle table with 20 million users,
I would like to query the table for users with first name Like "Patel" or "Pat" performance when querying using "like clause" is very bad.
select * from users where first name like '%Patel%'
Or
select * from users where first name like '%Pat%'
And as far as I know if I will restrict the results by rownum - it will happen only after the LIKE - so I have a full table scan...
I don't want to scan the entire 20 Million records
select * from users where first name like '%Pat%' where rownum<100
Is it possible to tell oracle to stop after finding 100 rows?
Oracle 12c (finally) introduced the fetch first syntax, which should perform a bit better:
SELECT *
FROM users
WHERE first_name LIKE '%Pat%'
FETCH FIRST 100 ROWS ONLY
select * from users where first name like '%Pat%' where rownum<100
Oracle is smart enough to do everything for You. Execution plan for this query is:
SELECT STATEMENT, GOAL = ALL_ROWS
COUNT STOPKEY
TABLE ACCESS FULL
COUNT STOPKEY means that full scan will be stopped when Oracle will find enough records to satisfy the condition.
Since the question is tagged Oracle 11g, I'll give an answer that works in 11g.
Use the optimizer hint for first_rows_100 and wrap it into an inline view.
Example:
select *
from (select /*+ opt_param('optimizer_mode','first_rows_100') */
u.*, rownum as rn
from users u
where instr (name, 'Pat') > 0 or instr (name, 'Patel') > 0) inlineview
where rn <= 100
Regards
Olafur

Oracle 11g and SQL TOP query

While using SELECT TOP 5 * FROM SOMETABLE gives me an error
ORA-00923: FROM keyword not found where expected
I am using Oracle 11g . I am aware of using rownum for doing the same thing but just wondering SQL TOP usage is not at all supported in Oracle ? Anything need to do extra to make SQL TOP working in Oracle ??
Oracle does not support TOP. Use ROWNUM
SELECT * FROM your_table
WHERE ROWNUM <= 5
SQLFiddle example
No, Oracle does not support TOP.
As you point out, the best approach is to use rownum. Another option is the analytical function ROW_NUMBER.
The rownum keyword, while it gets you the said no. of records, does so only after applying the order by clause if you have one.
So if the SQL server query is as below, it will give you 10 most recently created records.
Select TOP 10 * from mytable order by created_date desc
But to fit Oracle, when you write this, it gets you the 10 records (that may not be the most recent ones) and arranges them in descending order, which is not what you wanted.
Select * from mytable where rownum < 10 order by created_date desc
So writing with an additional select like this would help:
SELECT * FROM (Select * from mytable order by created_date desc) where rownum < 10
SQL TOP does NOT work for Oracle.

Show only the first N lines of output of a SQL query

Is there a way to only show the first N lines of output from an SQL query? Bonus points, if the query stops running once the N lines are outputted.
I am most interested in finding something which works in Oracle.
It would be helpful if you specify what database you are targetting. Different databases have different syntax and techniques to achieve this:
For example in Oracle you can ahieve this by putting condition on RowNum (select ... from ... where ... rownum < 11 -> would result in outputting first 10 records)
In MySQL you can use you can use limit clause.
Microsoft SQL Server => SELECT TOP 10 column FROM table
PostgreSQL and MySQL => SELECT column FROM table LIMIT 10
Oracle => select * from (SELECT column FROM table ) WHERE ROWNUM <= 10 (thanks to stili)
Sybase => SET rowcount 10 SELECT column FROM table
Firebird => SELECT FIRST 10 column FROM table
NOTE: Modern ORM tools such as Hibernate give high level API (Query, Restriction, Condition interfaces) that abstract the logic of top n rows based on the dialect you choose.
For Oracle the suggested and accepted solution is wrong. Try using an order clause, and the results will be unpredictable. The SQL will need to be nested to accomplish this in Oracle.
select name, price
from (
select name, price, row_number() over (order by price) r
from items
)
where r between 1 and 5;
The example above was borrowed from http://www.adp-gmbh.ch/ora/sql/examples/first_rows.html which has a good discussion on this topic.
I know it with MySQL but I don't know if it's standard SQL :
end you Query with 'limit X', X = n. of lines you want to get.
Example :
SELECT NAME FROM EMPLOYEES ORDER BY SALARY DESC LIMIT 10;
For Oracle, you can try this
select /*+ FIRST_ROWS(10) */ * from table;