SELECT NAME, grade
FROM student
WHERE grade >80;
- 数据源student可以是表、视图等;select后列表用于确定选择哪些列(* 即所有列),where确定选择哪些行(无则选出所有行)。
- select语句中可使用算术运算符(+、-、*、/)形成算术表达式,用于数值型、日期型的数据列、变量、常量;运算符可在两列间进行运算。
- 运算符优先级同Java。
SELECT *
FROM student
WHERE age *3> grade;
SELECT CONCAT(NAME,'-', age) # -记得加单引号
FROM student
WHERE age *4> grade;
- 算术运算符使用null,将导致整个算术表达式的值为null
- 字符串连接运算使用null,导致连接后的结果也是null。(如将上面的连接语句中的age改为null,则返回的结果与之前行数依旧相同,但值全为null)
- 为数据列或表达式起别名时,别名紧跟数据列,中间以空格或关键字as隔开。
SELECT NAME AS alias
FROM student
WHERE age >20;
- 别名使用特殊字符(如空格),或需要强制大小写敏感,都可通过别名加双引号来实现。
SELECT NAME AS "My'Name" …… #别名中有单引号时必须使用双引号,其余可使用单引号。
- 为多列起别名
SELECT
NAME AS 'My Name',
age AS 年龄
- 为表其别名(语法相同)
- 连接符、别名共用
SELECT
NAME AS'My Name',
CONCAT(grade,'-',math) grade1
FROM student
WHERE age >20;
- selec、where子句可都不出现列名
- where总为true,selec仅仅选择了常量,SQL将其当成一列,student表中有多少条记录,该常量就出现多少次。
- 选择常量时,指定数据表没有太大的意义,so MySQL扩展语法,允许select后没有from子句
SELECT 1+2; # 此时,返回结果只有一列,而不是表中有多少记录返回多少列了。
- Oracle提供名为dual的虚表(没有任何意义,仅相当于from后的占位符),经测试(select version();)MySQL至少从5.1.58开始就已支持。
SELECT DISTINCT
NAME,
age
FROM student;
- distinct紧跟select;
- 上述语句选出name、age不同时相同的记录。
- 值相等 单等号=
- 不相等 <>
- 赋值 冒号等号:=
- ex1 between ex2 and ex3 表示ex2 =< ex1 <= ex2
- ex in(ex1,ex2)类似枚举,ex的值必须是括号里任一个表达式的值
- like 字符串匹配,like后的字符串支持通配符
- is null 要求指定值为null
使用注意:
ex1 between ex2 and ex3
- ex2必须小于等于ex3,否则返回值为null;
- ex2和ex3可以是常量、变量,甚至是列名。
SELECT *
FROM student
WHERE # 查询age小于等于20,grade大于等于20的数据。
20 BETWEEN age AND grade;
- in括号内的值亦可常量、变量、列名。
SELECT *
FROM student
WHERE # 查询grade或math为88的所有记录。
88IN(grade, math);
- SQL语句两个通配符:下划线_(一个任意字符)和百分号%(任意多个字符)
- 转义(查询条件需要下划线或百分号)
标准SQL没有提供反斜线的转义字符,而是使用关键字escape显示转义。
LIKE '\_%' ESCAPE '\'; # 但MySQL不支持这种用法
- 判断值为空,不要用=null,因为SQL中null=null返回null。
SELECT *
FROM student
WHERE # 查询id为空的记录
id ISNULL;
如将上面的is null改为=null,返回的结果将为空。
WHERE NAME LIKE'__'AND id >6; # name为两个字符且id>6的记录
WHERE NOT NAME LIKE'__'; # name不是两个字符的记录
所有比较运算符 > not > and> or
括号的优先级最高。
查询结果默认按照插入顺序排列。 可用order by按值大小排列。
order by默认升序(asc),desc可改为降序。
SELECT *
FROM student
ORDERBY #按age升序排列,当age相同时,按grade降序排列。
age,
grade DESC;
- 多列排序,则每列的asc、desc必须单独指定。
- 第一排序列为首排序列,仅当第一列值相同时,第二排序列才起作用。