-

SQL语法(图文教程)

SQL是一个结构化查询语言,用于处理关系型数据库。

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联合查询
多表联合查询是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 分组合并
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)

 
sqlserver相关知识
对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;
sqlserver翻页
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字段值
设置null字段值为指定值

UPDATE tablename  SET isStopCai = CASE WHEN isStopCai IS NULL THEN 0 ELSE isStopCai END;