SQL是一个结构化查询语言,用于处理关系型数据库。
SQL增删改查:CRUD是编程领域中常用的一个缩写,它指的是在软件系统中进行创建(Create)、读取(Retrieve)、更新(Update)和删除(Delete)操作。
SQL中增删改查的操作:
1. INSERT INTO:用于向表中插入新行。
- 语法:INSERT INTO 表名 (列1, 列2, 列3....) VALUES (值1, 值2, 值3....)
- 示例:INSERT INTO students (name, age, gender) VALUES ('张三', 18, '男');
- 说明:上述语句将在students表中插入一行数据,包括name为'张三',age为18,gender为'男'。
2. SELECT:用于从一个或多个表中选择数据。
- 语法:SELECT 列1, 列2, 列3... FROM 表名 WHERE 条件
- 示例:SELECT name, age FROM students WHERE gender = '男'
- 说明:上述语句将从students表中选择所有gender为'男'的行,并只输出name和age两列。
3. UPDATE:用于更新表中的数据。
- 语法:UPDATE 表名 SET 列1=值1, 列2=值2,.... WHERE 条件
- 示例:UPDATE students SET age = 19 WHERE name = '张三'
- 说明:上述语句将在students表中找到name为'张三'的行,并将其中的age字段更新为19。
4. DELETE FROM:用于删除表中的数据。
- 语法:DELETE FROM 表名 WHERE 条件
- 示例:DELETE FROM students WHERE name = '张三'
- 说明:上述语句将在students表中删除name为'张三'的行。
多表联合查询是SQL中一种常用的查询方法,可以通过连接多张表,一次性查询出多张表中的数据,为实现查询功能提供了更强大和灵活的支持。案例
在多表联合查询中,需要使用JOIN关键字来连接多张表。基本的语法如下:
```
SELECT A.id, B.name
FROM table1 as A
JOIN table2 as B ON A.id = B.aid
```
在SQL中,JOIN、INNER JOIN、LEFT JOIN和RIGHT JOIN都是用于连接多张表的关键字,它们之间的差异主要在连接方式以及查询结果的输出方面。
1. JOIN:是最基本的连接方式,它返回两个表中列名匹配的所有行。JOIN可以根据使用的条件将多个表连接在一起。
2. INNER JOIN:是在两个表中都存在匹配行的基础上连接表的方式。在INNER JOIN中,只有在两个表中都存在匹配行的情况下,才能输出结果。如果在其中一个表中没有匹配行,则不会显示此行。
3. LEFT JOIN:左连接是从左边表中选择所有行,并依据ON关键字后面的条件选取匹配的右边表中的行。如果右边表和左边表没有匹配的行,则输出NULL值。
4. RIGHT JOIN:右连接是从右表中选择所有行,并依据ON关键字后面的条件选取匹配的左边表中的行。如果左边表和右边表没有匹配的行,则输出NULL值。
综上所述,JOIN是基本的连接方式,而INNER JOIN、LEFT JOIN和RIGHT JOIN则是在保持基本连接的基础上做进一步的筛选和输出,不同方式的使用取决于查询的需求。
隐式内连接(也称为笛卡尔积)老旧的SQL代码
select A.id, B.name from table1 as A, table2 as B where A.id = B.bid order by T1.id desc
sql="select B.title,B.price,B.smallimage,B.increase,B.favoritecountrytype from " & db_PREFIX & "MemberBuy AS A left join " & db_PREFIX & "ArticleDetail as B on A.productid=B.id" & addsql & " order by B.sortrank"
GROUP BY 分组合并
select vsname from xy_table where vstype='test' and vsStat in('0','1','2','3') GROUP BY vsname
rs.open"select userip from ["& db_PREFIX &"iislog] GROUP BY userip",conn,1,1
for i=1 to 300
'总记录数'
rsx.open"select count(*) as tj from ["& db_PREFIX &"iislog] where userip='"& rs("userip") &"'",conn,1,1
nCount=IIF(isnull(rsx("tj"))=true,0,rsx("tj")):rsx.close
call echo(i,rs("userip") & " ==>> " & nCount)
rs.movenext:next
call echo("总数",rs.recordcount)
对Text字段内容在sql里比较时需要处理,如:cast(bodycontent as varchar(7999))='xiyueta'
'查询'
select * from [xy_articledetail] where cast(bodycontent as varchar(7999))=''
'搜索'
select * from [xy_articledetail] where cast(bodycontent as varchar(7999)) like '%xiyueta%'
或
rs.open"select * from ["& db_PREFIX &"articledetail] where "& sqlTextFieldEquation("bodycontent","xiyueta") & " ",conn,1,1
注意:在 LIKE 操作符中,有两个特殊的通配符:
%:代表零个、一个或多个字符。
_:代表一个字符。
找出或更新表里某字段为NULL,(Access与Sqlserver同样可用)
SELECT * FROM table WHERE zuid IS NULL;
UPDATE table SET zuid = -1 WHERE zuid IS NULL;
SELECT * FROM xy_admin WHERE zuid IS NULL;
sqlserver2008里翻页SQL与sqlserver2012里翻页的SQL语句不一样的sqlserver2008里翻页SQL
sql1="SELECT TOP (" & num & ") * FROM (SELECT ROW_NUMBER() OVER (ORDER BY id desc) AS RowNum, * FROM "& db_PREFIX &"test) AS SubQuery WHERE RowNum BETWEEN " & startIndex & " AND " & endIndex
或
sql1="WITH NumberedRows AS (SELECT *, ROW_NUMBER() OVER (ORDER BY id desc) AS RowNum FROM xy_test ) SELECT * FROM NumberedRows "
sql1=sql1&"WHERE RowNum BETWEEN " & startIndex & " AND " & endIndex
sqlserver2012里翻页SQL
'sqlserver2012版本'
if sqlServerVersion="2012" or sqlServerVersion="2014" then
if sql<>"" then sql=" where " & mid(sql,5)
mysql= "select * from ["& db_PREFIX &"test] " & sql & " ORDER BY id desc OFFSET "& (pageSize*(currentPage-1)) &" ROWS FETCH NEXT "& pageSize &" ROWS ONLY"
' SELECT *
' FROM Employees
' ORDER BY EmployeeID
' OFFSET 90 ROWS -- 跳过前9页的记录
' FETCH NEXT 10 ROWS ONLY; -- 取接下来的10条记录
end if
select * from [xy_text] where datediff(day,createtime,'2024/01/01')<=0 and datediff(day,createtime,'2024/01/27')>=0 and ([title] like '%1461793%' or [httpurl] like '%1461793%' or [bodycontent] like '%1461793%' ) ORDER BY id desc OFFSET 0 ROWS FETCH NEXT 20 ROWS ONLY
显示 今日 | 昨天 | 前天 | 本周 | 上周 | 本月 | 上月 | 全部 的sql
'获得时间比较sql'
function getSql(sType)
dim nDay,addSql,sql,nUpMonthDay,nUpWeekDay
'超往前越是正数'
'默认为今天'
nDay=0
addSql=" where (DATEDIFF("& sqlAorS("d") &",addDateTime,"& sqlAorS("now()") &")="& nDay &")"
If sType="昨天" or sType="昨日" Then
nDay=1
addSql=" where (DATEDIFF("& sqlAorS("d") &",addDateTime,"& sqlAorS("now()") &")="& nDay &")"
elseif sType="前天" then
nDay=2
addSql=" where (DATEDIFF("& sqlAorS("d") &",addDateTime,"& sqlAorS("now()") &")="& nDay &")"
elseif sType="本周" then
nDay=0
nUpWeekDay=getWeekDayNumber(now())
addSql=" where (DATEDIFF("& sqlAorS("d") &",addDateTime,"& sqlAorS("now()") &")>="& nDay &" and DATEDIFF("& sqlAorS("d") &",addDateTime,"& sqlAorS("now()") &")<"& nUpWeekDay &")"
elseif sType="上周" then
nDay=getWeekDayNumber(now())
nUpWeekDay=getWeekDayNumber(now())+7
addSql=" where (DATEDIFF("& sqlAorS("d") &",addDateTime,"& sqlAorS("now()") &")>="& nDay &" and DATEDIFF("& sqlAorS("d") &",addDateTime,"& sqlAorS("now()") &")<"& nUpWeekDay &")"
elseif sType="本月" then
nDay=day(date())
addSql=" where ( DATEDIFF("& sqlAorS("d") &",addDateTime,"& sqlAorS("now()") &")>=0 and DATEDIFF("& sqlAorS("d") &",addDateTime,"& sqlAorS("now()") &")<"& nDay &")"
elseif sType="上月" then
nDay=day(date())
nUpMonthDay=day(date())+getDaysInMonth( DateAdd("m", -1, now()) )
addSql=" where (DATEDIFF("& sqlAorS("d") &",addDateTime,"& sqlAorS("now()") &")>="& nDay &" and DATEDIFF("& sqlAorS("d") &",addDateTime,"& sqlAorS("now()") &")<"& nUpMonthDay &")"
elseif sType="全部" then
addSql=" where addDateTime<"& sqlAorS("now()")
end if
getSql=addsql
end function
'第二种方法,比第一种方法快'
function getSql2(sType)
dim startDate,endDate
'昨天
If sType="昨天" or sType="昨日" Then
startDate = DateAdd("d", -1, Date())
endDate = DateAdd("d", -1, Date())
'前天
elseIf sType="前天" Then
startDate = DateAdd("d", -2, Date())
endDate = DateAdd("d", -2, Date())
'本周
elseIf sType="本周" Then
startDate = DateAdd("d", 1 - Weekday(Date(), 2), Date())
endDate = Date()
'上周
elseIf sType="上周" Then
startDate = DateAdd("d", -7 - (Weekday(Date(), 2) - 1), Date())
endDate = DateAdd("d", -1 - Weekday(Date(), 2), Date())
'本月
elseIf sType="本月" Then
startDate = DateSerial(Year(Date()), Month(Date()), 1)
endDate = Date()
'上月
elseIf sType="上月" Then
startDate = DateSerial(Year(Date()), Month(Date()) - 1, 1)
endDate = DateSerial(Year(Date()), Month(Date()), 0)
elseIf sType="今天" Then
startDate = Date()
endDate = Date()
else
getSql2=""
exit function
End If
getSql2=" where addDateTime BETWEEN '" & startDate & " 00:00:00" & "' AND '" & endDate & " 23:59:59" & "'"
end function
'昨日
If Request("act") = "zuotian" Then
addsql=getSql("昨日")
'本周
ElseIf Request("act") = "benzhou" Then
addsql=getSql("本周")
'上周
ElseIf Request("act") = "shangzhou" Then
addsql=getSql("上周")
'本月
ElseIf Request("act") = "benyue" Then
addsql=getSql("本月")
'上月
ElseIf Request("act") = "shangyue" Then
addsql=getSql("上月")
else '今天'
addsql=getSql("今天")
End If
设置null字段值为指定值
UPDATE tablename SET isStopCai = CASE WHEN isStopCai IS NULL THEN 0 ELSE isStopCai END;