用户表:users
用户权限表:user_power查询所有未被授过权的用户,以下是本人写的两条sql,不知道那种更好。
如果大家又更好的方法就贴出来把。:
SELECT *
FROM users
WHERE username
not in(
SELECT distinct username FROM user_power)SELECT u.*
FROM users u
WHERE NOT EXISTS (SELECT up.username FROM user_power up WHERE up.username=u.username)
用户权限表:user_power查询所有未被授过权的用户,以下是本人写的两条sql,不知道那种更好。
如果大家又更好的方法就贴出来把。:
SELECT *
FROM users
WHERE username
not in(
SELECT distinct username FROM user_power)SELECT u.*
FROM users u
WHERE NOT EXISTS (SELECT up.username FROM user_power up WHERE up.username=u.username)
我们写sql最好避免在索引字段上使用not,<>,!=
所以第二条要好于第一条.
在子查询中,NOT IN子句将执行一个内部的排序和合并。 无论在哪种情况下,NOT IN都是最低效的 (因为它对子查询中的表执行了一个全表遍历)。 为了避免使用NOT IN ,我们可以把它改写成外连接(Outer Joins)或NOT EXISTS.
例如:
SELECT …
FROM EMP
WHERE DEPT_NO NOT IN (SELECT DEPT_NO
FROM DEPT
WHERE DEPT_CAT=’A’);
为了提高效率。改写为:
(方法一: 高效)
SELECT ….
FROM EMP A,DEPT B
WHERE A.DEPT_NO = B.DEPT(+)
AND B.DEPT_NO IS NULL
AND B.DEPT_CAT(+) = 'A’
(方法二: 最高效)
SELECT ….
FROM EMP E
WHERE NOT EXISTS (SELECT 'X’
FROM DEPT D
WHERE D.DEPT_NO = E.DEPT_NO
AND DEPT_CAT = 'A’);
SELECT *
FROM users 能不用*号最好就不要用星号,写清楚用哪个字段比较好.