SQL基础
连接
SQL的引号
字符型需要单引号,数值型不需要单引号
逻辑运算符 与或非等于不等于空非空
与 AND
或 OR
非 NOT
空 IS NULL
非空 IS NOT NULL
等于 =
不等于 <>
GROUP BY
GROUP BY用于结合合计函数,对一个或多个列进行分组
t_order表
查询每个顾客的订单总额
SELECT
Customer,
sum( OrderPrice )
FROM
t_order
GROUP BY
Customer
结果
HAVING
WHERE不能和合计函数共用,故引入HAVING
t_order表
查找订单总金额少于 2000 的客户。
SELECT
Customer,
SUM( OrderPrice )
FROM
t_order
GROUP BY
Customer
HAVING
SUM( OrderPrice ) < 2000
结果
distinct
作用:筛选出没有重复的行
语法:
举例:
Course表
筛选出不重复的TId
SELECT DISTINCT
TId
FROM
course
结果
TOP(不是所有数据库都支持)
规定返回的行数
student表
返回3行数据
SELECT
TOP 3 *
FROM
student
Limit(MySQL)
规定返回的行数
student表
返回3行记录
SELECT
*
FROM
student
LIMIT 3
结果
ROWNUM(Oracle)
控制返回的行数
示例:返回3行数据
SELECT
*
FROM
student
WHERE
ROWNUM <= 3
LIKE
模糊匹配,如果不包含通配符,则等同于=
student表
查询名字开头为“赵”的学生名字
SELECT
Sname
FROM
student
WHERE
Sname LIKE '赵%'
结果
通配符
通配符 | 作用 |
---|---|
% | 匹配任意一个或多个字符 |
- | 匹配任意一个字符 |
[字符列表] | 匹配字符列表中的单一字符,例如[abc],则匹配a或b或c |
[^字符列表]或者 [!字符列表] | 匹配字符列表之外的单一字符,例如[abc],则匹配不为a或b或c的单一字符 |
IN
作用:在where子句中规定多个值
student表
查询名字为吴小兰或乌兰的学生名字
SELECT
Sname
FROM
student
WHERE
Sname in('吴小兰','吴兰')
结果
Between
作用:返回介于两个值之间的数据
sc表
查询分数在0到60之间的
SELECT
*
FROM
sc
WHERE
score
BETWEEN 0 AND 60
结果
AS
为表、列取别名
course表
teacher表
SELECT
Tname AS '教师名字',
Cname AS '课程名字'
FROM
course AS c
JOIN teacher AS t
ON c.TId = t.TId
结果
SQL函数
NULL函数
MySQL IFNULL()
sc表
如果分数为NULL,则输出0
SELECT
SID,
IFNULL( score, 0 ) as score
FROM
SC
结果
SQL Server ISNULL()
如果分数为NULL,则输出0
SELECT
SID,
ISNULL( score, 0 ) as score
FROM
SC
AVG()
取平均数
计算学生平均分数
SELECT
avg( score )
FROM
sc
count()
计算行数
示例:计算学生人数
SELECT
count( * )
FROM
student
first()(不是所有数据库都支持)
取第一个记录
SELECT
first( score )
FROM
sc
last()(不是所有数据库都支持)
取最后一个记录
SELECT
last( score )
FROM
sc
max()
取最大的记录
SELECT
max( score )
FROM
sc
min()
取最小的记录
SELECT
min( score )
FROM
sc
ucase()
转为大写
示例:将客户名字转为大写
SELECT DISTINCT
UCASE( Customer )
FROM
t_order
lcase()
转为小写
示例:将客户名字转为大写
SELECT DISTINCT
LCASE( Customer )
FROM
t_order
mid()
截取字符串
语法
SELECT MID(ColumnName, start [,length]) FROM TABLE_NAME
参数说明
参数 | 说明 |
---|---|
ColumnName | 必需,列名 |
start | 必需,规定开始位置(起始位置为1) |
length | 可选,截取的长度,若省略,则返回剩余字符串 |
截取客户名字的前3个字符
SELECT DISTINCT
MID(Customer,1,3)
FROM
t_order
结果
len()(不是所有数据库都支持)
获取长度
语法
SELECT LEN(column_name) FROM table_name
示例
SELECT LEN(City) as LengthOfCity FROM Persons
round()
保留小数
t_order表
订单金额保留1位小数
SELECT
ROUND( OrderPrice, 1 )
FROM
t_order
结果
now
当前时间
SELECT
now()
FROM
t_order
format()
格式化
SELECT
FORMAT(Now(),'YYYY-MM-DD')
FROM
t_order
MySQL DATE_FORMAT()格式化时间
SELECT
DATE_FORMAT(now() ,'%Y/%m/%d')
FROM
t_order
结果
如何写存储过程
-
打开navicat
-
点击函数-新建函数-选择“过程”-完成
-
模板如下:
CREATE OR REPLACE PROCEDURE "这里是存储过程名" AS BEGIN -- routine body goes here, e.g. -- DBMS_OUTPUT.PUT_LINE('Navicat for Oracle'); END;
-
在BEGIN和END之间写sql语句
CREATE OR REPLACE PROCEDURE "P_T02_0901_09_CLEARTABLE" AS BEGIN DELETE FROM T02_BUSI_090101_A04_CLEAR_TAB; DELETE FROM T02_BUSI_090101_A04_ORDER_TAB; END;
-
点击保存,为这个存储过程名为P_T02_0901_09_CLEARTABLE
-
调用:
call P_T02_0901_09_CLEARTABLE()
-
大功告成!