HTMLandMySQLandVFP

发布时间 2023-10-03 15:41:25作者: 無敗の草

HTML and CSS

  1. 默认标签解释

    <!DOCTYPE html>    <!--规定用这个规则-->
    <html lang="en">
    <head>  <!--hai de 就是定义你一些内在的东西-->
        <!--charset \cha sai te-->
        <meta charset="UTF-8">  <!--mai te 自闭标签-->
        <!--标签的属性-->
        <title name="alex">你好</title><!--tai tou 是头部的意思-->
    </head>
        <body>  <!--bao dei 网页体-->
            gdfg
        </body>
    </html>
    <!--xxx-->  <!--注释-->

HTML head

  1. set head

    <!--页面编码-->
    <meta http-equiv="content-type" content="text/html.charest=utf-8">
    #######################################
    <meta charset="UTF-8">
    <!--跳转-->
    <meta http-equiv="Refresh" Content="5;Url=http://www.autohome.com.cn"/>
    <!--刷新-->
    <meta http-equiv="Refresh" Content="30">
    <!--关键词-->
    <meta name="keywords" content="星际老男孩">
    <!--X-UA-Compatible,只对ie有用这段代码是然ie用最新的版本来处理它-->
    <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
    <!--Link引入css-->
    <link rel="stylesheet" type="text/css" href="css/common.min.css" >
    <!--Link图标-->
    <link rel="shortcut icon" href="image/favicon.ico">
    <!---->

HTML body

  1. 标签分为行内标签和块级标签,span,a,select 等,行内标签有多少占多少;div, h1,p 等块级标签 ,没有一行也要占满一行。

  2. 有一些符号会冲突,随意需要字符码字符网站

  3. p表示段落,默认段落之间是有间距的<p></p>;dr 是换行符 <br />

  4. a标签

    <!--这是html的注释信息-->
    <!--直接跳转-->
    <a href="http://www.baidu.com">跳转</a>
    <!--新建在跳转-->
    <a href="http://www.baidu.com" target="_blank">跳转</a>
  5. 锚,寻找页面中id相等的标签,将其标签放置再顶部

    <a href="#i1">第一章</a>
    <a href="#i2">第二章</a>
    <a href="#i3">第三章</a>
    <!--id不能重复-->
    <div id="i1" style="height: 500px";>第一章内容</div>
    <div id="i2" style="height: 500px";>第二章内容</div>
    <div id="i3" style="height: 500px";>第三章内容</div>
  6. H标签

    <!--h标签只有六个,分别是,以次排序字体大小-->
    <h1></h1>
    <h2></h2>
    <h3></h3>
    <h4></h4>
    <h5></h5>
    <h6></h6>
    <h6 style="font-size: 65px"></h6>
  7. 标签使用方法

    <form><!--fou mu 表单-->
    <div style="border: 1px solid red;">     
        <!--样式边框1px纯红色-->
        <p>用户名<input type="text" /></p>    
        <!--输入文字-->
        <p>密码<input type="password" /></p>
        <!--电子邮件-->
        <p>邮箱<input type="email" /></p>
        <!--输入类型密码-->
        <p>性别<br />男<input type="radio" name="gender" />
                <!--男输入类型单选名性别-->
              <br />女<input type="radio" name="gender" checked="checked" />     <!--checked是设置默认选中的-->
        </p>    <!--女输入类型单选名性别-->
        <p>爱好
             <!--1输入类型复选框-->
           <dr />1<input type="checkbox" checked="checked"/>                    <!--checked是设置默认选中的-->
           <dr />2<input type="checkbox" />
           <dr />3<input type="checkbox" />
           <dr />4<input type="checkbox" />
           <dr />5<input type="checkbox" />
        </p>
        <p>城市
            <select>    <!--选择-->
                <option>上海</option>   
                <!--选择选项-->
                <option>武汉</option>
                <option>甘肃</option>
            </select>
            <!--选择多个尺寸10-->
            <select multiple size="10">    
                <option>上海</option>   
                <option>武汉</option>
                <option>甘肃</option>
            </select>
            <select>
                <!--选择组 标签-->
                <optgroup label="一线">
                    <option>上海</option>   
                    <option>武汉</option>
                    <option>甘肃</option>
            </select>
        </p>
        <!--输入类型文件-->
        <p>文件 <input type="file"/></p>
        <p>备注 <textarea></textarea>
            <!--输入类型提交值提交-->
        <input type="submit" value="提交" />
            <!--输入类型按钮值按钮-->
        <input type="button" value="按钮" />
            <!--输入类型复位值复位-->
        <input type="reset" value="复位" />
        </div>
    </form>
  8. checkbox

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>Title</title>
    </head>
    <body>
        <input type="text" placeholder="用户名" />
        <!--placeholder是输入框中的提示符>
    <!--<form action="https://www.sogou.com/web" method="get">--> 
    <!--以get的方法提交-->
    <!--    <form action="https://www.sogou.com/web" method="post">-->
    <!--以post的方法提交-->
    <!--以get的方法提交-->
    <!--你要上传文件必须在 form 属性中加上enctype="multipart/form-data"-->
    <!--enctype="multipart/form-data"    编码多部分表单数据-->
    <form action="https://www.sogou.com/web" method="post" enctype="multipart/form-data">    
    <!--&lt;!&ndash;action里面填写什么http就提交到哪的http&ndash;&gt;-->
    <input type="text" name="query"/>       <!--name 是键-->
    男<input type="radio" name="gender" value="1"/>   
    <!--男输入类型单选名称性别值1-->
    女<input type="radio" name="gender" value="0"/>   
    <!--女输入类型单选名称性别值0-->
    <p>文件:
    <!--文件-->
    <input type="file" name="fafafa" />
    </p>
    <p>
    <select name="city">        
    <!--发送的时候不许要有标签-->
    <option value="1">上海</option>
    <option selected="selected" value="2">北京</option>   <!--selected是默认选中-->
    <option value="3">广州</option>
    </select>
    </p>
    <p>
    备注:<textarea name="extra"></textarea>
    </p>
    <input type="submit" value="提交" />
    </form>
    <hr/>    <!--横线-->
    <form>
    <input type="text"/>
    <input type="submit" value="提交" />
    </form>
    </body>
    </html>
  9. ul and table

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <ul>
            <!--ul方点-->
            <li>asldsdjfl</li>
            <li>asldsd ccl</li>
        </ul>
        <ol>
            <!--ul数字-->
            <li>asldsdjfl</li>
            <li>asldsd ccl</li>
        </ol>
        <dl>
            <dt>用于标题</dt>
            <dd>用于文章</dd>
            <dd>用于文章</dd>
        </dl>
        <table border="1">   <!--边境1-->          <!--表格-->
            <thead>        <!--表題-->
                <tr>       <!--代表一行-->
    <!--                <td>第一列</td>    &lt;!&ndash;代表一列&ndash;&gt;-->
    <!--                <td>第二列</td>-->
    <!--                <td>第三列</td>-->
    <!--                <td>第四列</td>-->
    <!--                <th>第一列</th>    &lt;!&ndash;代表一列&ndash;&gt;-->
    <!--                <th>第二列</th>    &lt;!&ndash;th加粗&ndash;&gt;-->
    <!--                <th>第三列</th>-->
    <!--                <th>第四列</th>-->
                <th>第1列</th>    
                    <!--代表一列-->
                <th>第2列</th>    
                    <!--th加粗-->
                <th colspan="2">第3列</th>    <!--合并左右單元格-->
            </tr>
        </thead>
        <tbody>
            <tr>       <!--代表一行-->
                <td>第一列</td>    
                <!--代表一列-->
                <td>第二列</td>
                <td>第三列</td>
                <td>第四列</td>
            </tr>
            <tr>       <!--代表一行-->
                <td>第一列</td>    
                <!--代表一列-->
                <td rowspan="2">第二列</td>    <!--合并上下單元格-->
                <td>第三列</td>
                <td>第四列</td>
            </tr>
            <tr>       <!--代表一行-->
                <td>第一列</td>    
                <!--代表一列-->
                <td>第三列</td>
            <td>第四列</td>
        </tr>
    </tbody>
    </table>
    </body>
    </html>
  10. fieldset

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <div>
        <fieldset>
        <legend>登录</legend>
        <p>用户名:<input type="text" /></p>
        <p>密码:<input type="password" /></p>
        </fieldset>
        </div>
        <h1>人才辈出</h1>
        <iframe style ="width:100%;height: 2000px;" src="http://autohome.com.cn"></iframe>
        <img src="a.jpg" alt="图片"></img>            <!--alt是在你图片无法查看的时候,在旁边提示他是什么什么图片-->
    </body>
    </html>

CSS based

  1. css文件可以储存为文件但是优先级最低,写在头部优先级高于文件形式,写在标签中是最高的。

  <!DOCTYPE html>
  <html lang="en">
  <head>
      <meta charset="UTF-8">
      <title>Title</title>
      <!--si dai ao 是当前页面都使用-->
      <!--在这里写上div以后使用div就可以不用写了-->
      <!--风格背景色红色白色-->
      <style>
      div{
          background-color: red;
          color: white;
      }
      </style>
  </head>
  <body>
      <!--风格背景色红色白色-->
      <div style="background-color: red;color: white;">88</div>
      <div>116+</div>
      <div>116+</div>
      <div>116+</div>
      <div>116+</div>
  </body>
  </html>
  1. 导入css文件

    /* 导入css文件就这么写*/
    <link rel="stylesheet" href="filename.css" />
  2. 简单使用

    <html>
        <head>
            <meta charset="UTF-8">
            <title></title>
            <style>
                /*标签选择器*/
                /*颜色红色*/
                /*找到所有的div使用*/
                div{
                    color:green;
                }
                /*id选择器*/
                /*字体32像素*/
                /*只找到有id="il"使用*/
                #il{
                    font-size: 32px;
                }
                /*ke la se class选择器*/
                /*找到所有有class="c1"使用*/
                .c1{
                    background-color:red;
                }
            </style>
        </head>
        <body>
            <span class="c1">1</span>
            <div class="c1">2</div>
            <a class="c1">3</a>
            <a id="il">jjjj</a>
            <div>nini</div>
            <div>nini</div>
            <div>nini</div>
        </body>
    </html>

CSS selector

/*div selector*/
div{                        /*Find all divs*/
    color:green;            /*Font color is green*/
}
/*id selector*/
#il{                        /*Find id equals il*/
    font-size: 32px;        /*FontSize32*/
}
/*class selector*/
.c1{                        /*Find all class equals c1*/
     background-color:red;
}
/*层级选择器*/
.c2 div p .c3{              /*找到class="c2"下div下p下class="c3"来使用*/
    dackground-color:rcd;
}
/*组合选择器*/
.c4,.c5,.c6{                /*找到class="c4"and class="c5" and class="c6"*/
    background-color:aqua;
}
​
<style>
    .c1[alex="a"]{
        color:red;
    }
</style>
​
<div class="c1" alex="a">1</div>    /*做筛选把有c1和a的加上样式*/

CSS style

color:red;                          /*Fnot color*/
​
background-color:rgb(1,2,3);        /*背景颜色,也可以按照rgb的方式显示颜色*/
background-color:#ffdab9;           /*背景颜色,也可以按照rgb的十六进制显示颜色*/
background-color: aqua;             /*背景颜色*/
​
font-size:36px;                     /*字体大小是以像素做的*/
​
height:150px;                       /*定义高度为150像素 ,高度没有百分百怎么个说法*/
width:100%;                         /*自定义宽度为100%,宽度可以百分百显示,按照父级相对占比*/
​
background-image:url("image.png")   /*按照url里的图片设置为背景图片 重复图片*/
background-repeat:none;             /*按照url里的图片设置为背景图片 不重复图片*/
background-position:0px,0px;        /*图片坐标*/
​
border-top-color: red;              /*top上、right右、bottom下、left左*/
border-top-style: solid;            /*solid 实体,dotted 虚线,dashed 跟虚了*/
border-top-width: 4px;              /*设置边线4像素红色实体线*/
​
display:none;                       /*隐藏并且不留位置*/
visibility : hidden;                /*隐藏但是保留位置*/
display:block;                      /*将行内标签变成块级标签*/
display:inline;                     /*将行块级标签变成行内标签*/
display:inline-block;               /*他是块级标签也是行内标签*/
​
cursor:printer;
    url                             /*需使用的自定义光标的 URL。请在此列表的末端始终定义一种普通的光标,以防没有由 URL 定义的可用光标。*/
    default                         /*默认光标(通常是一个箭头)*/
    auto                            /*默认。浏览器设置的光标。*/
    crosshair                       /*光标呈现为十字线。*/
    pointer                         /*光标呈现为指示链接的指针(一只手)*/
    move                            /*此光标指示某对象可被移动。*/
    e-resize                        /*此光标指示矩形框的边缘可被向右(东)移动。*/
    ne-resize                       /*此光标指示矩形框的边缘可被向上及向右移动(北/东)。*/
    nw-resize                       /*此光标指示矩形框的边缘可被向上及向左移动(北/西)。*/
    n-resize                        /*此光标指示矩形框的边缘可被向上(北)移动。*/
    se-resize                       /*此光标指示矩形框的边缘可被向下及向右移动(南/东)。*/
    sw-resize                       /*此光标指示矩形框的边缘可被向下及向左移动(南/西)。*/
    s-resize                        /*此光标指示矩形框的边缘可被向下移动(南)。*/
    w-resize                        /*此光标指示矩形框的边缘可被向左移动(西)。*/
    text                            /*此光标指示文本。*/
    wait                            /*此光标指示程序正忙(通常是一只表或沙漏)。*/
    help                            /*此光标指示可用的帮助(通常是一个问号或一个气球)*/
​
margin:12px;                        /*外边距 (本身不增加)*/
margin:0 auto;                      /*居中*/
padding:12px;                       /*内边距 (本身增加)*/
​
float:left;                         /*左飘*/
float:right;                        /*右飘*/
​
clear:both;                         /*如果div没有输入值,又想加上样式,就可以用这个*/
​
position:absolute;
    relative                        /*是设置定位类型为相对定位*/
    absolute                        /*是设置定位类型为绝对定位*/
    fixed                           /*固定在一个位置滚动时也不动*/
​
opacity:0.5;                        /*透明度,1是不透明*/
opacity:rgba(0,0,0,0.6);            /*可以把颜色和透明度一起设置*/
​
z-index:9;                          /*设置优先级,数字可以随便设置只要大于就可以*/
!important;                         /*不管你的优先级多高,只要见到!important都得先使用他的内容*/
​
text-align:center;                  /*让他在文本样式中居中*/
​
ul li:hover{                        /*当鼠标换到标签上时自动执行*/
    background-color: blueviolet;
}
.c2:before{                         /*在调用的标签前面打印666*/
    content:"666";
}
.c2:after{                          /*在调用的标签后面打印777*/
    content:"777";
}
​
.c1{                                /*想要三角形可以用边宽*/
    border-top-color: transparent solid 4px;
    border-right-color: transparent solid 4px
    border-bottom-color: transparent solid 4px;
    border-left-color: red solid 4px;
}
​
.c1{
    color:red;                          /*字体颜色*/
    background-color:rgb(1,2,3);        /*背景颜色,也可以按照rgb的方式显示颜色*/
    background-color:#ffdab9;           /*背景颜色,也可以按照rgb的十六进制显示颜色*/
    background-color:red;               /*也可以用英文颜色来显示*/
    background-color: aqua;             /*背景颜色*/
    font-size:36px;                     /*字体大小是以像素做的*/
    height:150px;                       /*定义高度为150像素 ,高度没有百分百怎么个说法*/
    width:100%;                         /*自定义宽度为100%,宽度可以百分百显示,按照父级相对占比*/
}
<body>
  <div class="c1">asdlj</div>
  <div style="width: 500px;">
  <div style="width: 20%;background-color:antiquewhite;float: left">adjs</div>
  <div style="width: 80%;background-color:palegoldenrod;float: left">adjs</div>
</body>
​
[随机图片](https://www.dmoe.cc/random.php)

specification

<html>
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>标题栏</title>
    <style>
        body{
            margin:0;                               /*它的边宽为0*/
        }
        ul{
            margin:0;
            list-style-type:none;                   /*不显示小标*/
        }
            ul li{
            float:left;                             /*左飘*/
            padding:0 8px 0 8px;                    /*左边和右边的宽度为8px*/
            color: while;                           /*加上字体颜色为白色*/
            cursor:pointer;
        }
        ul li:hover{                                /*当鼠标移动到li标签上时,自动执行里面的样式*/
            background-color: blueviolet;
        }
        .pg-header{
            height:44px;                            /*他的大小为44px*/
            background-color:#2459a2;               /*它的颜色为十六进制的#2459a2*/
            line-height:44px;                       /*lai hai te ,按照44放置里面的内容*/
        }
        .w{
            width:980px;                            /*它的宽度为980px*/
            margin:0 auto;                          /*它的边宽为0*/
            background-color:red;                   /*它的颜色为红色*/
        }
​
    </style>    
    </head>
        <body>
        <div class="pg-header">
            <div class="w">
            <ul>
                <li>sadf</li>
                <li>sadf</li>
                <li>sadf</li>
                <li>sadf</li>
                <li>sadf</li>
                <li>sadf</li>
            </ul>
            </div>
        </div> 
            
        <div class="pg-body"></div>
        <div class="pg-footer"></div>
    </body>
</html>                 

JavaScript

  1. JavaScript编程语言,由浏览器编译并运行

    /*头部写上也可以写在下面他就可以写JavaScript代码了*/
    <script>
        var a="123";                        /*创建局部变量 var wan*/
        a="hello world";                    /*创建全局变量*/
        function f1(){                      /*创建函数*/
            var i=123;
        }
        alert(123);                         /*弹出框*/
        // 单行注释
        /*多行注释*/ 
    </script>
    <script src="commons.js"></script>      //导入JavaScript文件
  2. 特殊的值null什么都不是、undefined未定义、NaN非数字。

  3. 对于简单的代码可以在浏览器中的console里面写

DataType

Number

// JavaScript中不区分整数和浮点数值,JavaScript中所有数字均用浮点数值表示。
parselnt()    			// 将某值转成数字,不成工则NaN
parseFloat()    		// 将某值转成浮点数,不成功则NaN

// NaN,非数字。可使用isNaN(num)来判断。
// Infinity,无穷大。可使用isFinite(num)来判断。

Srting

obj.length()    //长度
obj.trim()	//移除空白
obj.trimleft()	//移除右空格
obj.trimright()	//移除左空格
obj.charAt(n)	//返回字符串中的第N个字符
obj.concat(value,)	//拼接
obj.indexOf()	//从前往后子序列位置
obj.lastlndexof()	//从后往前子序列位置
obj.substring()	//根据索引获取子序列
obj.slice()    //切片
obj.tolowercase()	//大写
obj.touppercase()	//小写
obj.split()    //分割
obj.search()    //从头开始匹配,返回匹配成功的第一个位置(g无效)


// 跑马灯实例

<div id=i1 style="background-color:green;color:white">欢迎你的到来</div>

<script>
    //是每一秒钟执行一次f1函数
	setlnterval("f1()",1000);
	//创建函数
	funcction f1(){
        //js获取某一个标签 id=i1
        var tag = document.getElementByld("i1");
        //获取标签的内容
        var text = tag.innerText;
        //获取第零位置的值
        var a = text.charAt(0);
        //获取第一项以后的所有值
        var sub = text.substring(1,text.length);
        var new_str = sub + a;
        //将其赋给标签
        tag.innerText = new_str;
    }
</script>

Boolean

  1. 布尔类型只包含真假,与Python不同的是其首字母小写。

  2. == 比较值相等、!= 不等于、=== 比较值和类型相等、!=== 不等于、|| 或、&& 且。

数组

obj.length										// 数组的大小
obj.push(ele)									// 尾部追加元素
obj.pop()										// 尾部获取一个元素
obj.UNshift(ele)								// 头部插入元素
obj.splice(start,deletecount,value,...)			// 插入,删除或替换数组的元素
	obj.splice(n,0,val)							// 指定位置插入元素
	obj.splice(n,1,val)							// 指定位置替换元素
  	obj.splice(n,1)								// 指定位置删除元素
obj.slice()										// 切片
obj.reverse()									// 反转
obj.join(sep)									// 将数组元素链接起来以构建一个字符串
obj.concat(val,...)								// 链接数组
obj.sort()										// 对数组元素进行排序

Command

Operational data

// 序列化
json.stringify(obj)								// 序列化
json.parse(str)									// 反序列化 
// 转义
encodeURL()    									// URL中的转义字符
decodeURL()    									// URL中未转义的字符
encodeURLComponent()    						// 转义URL组件中的字符串(全部)
decodeURLCompoent()    							// URL组件中的未转义字符
escape()    									// 对字符串转义
unescape()    									// 给转义字符串解码
URLError()    									// 由URL的编码和解码方法抛出

// eval,JavaScript中的eval是Python中eval和exec的合集,即可以编译也可以获取返回值。
eval()
EvalError    									// 执行字符串中的JavaScript代码

// 时间处理
d = new Date()    								// 获取当前时间
d.getfullyear()   								//  获取年份
d.gethours()    								// 获取小时
d.setminutes(45)								// 修改秒 

语句和异常

  1. 条件语句

    if(条件){
        
    }
    else if (条件){
        
    }
    else {
        
    }
    
    switch(name){ //name等于谁就执行谁 
        case "1":
            age = 123;
            break
        case "2":
            age = 456;
            break
        default:
            age = 777;
    }
  2. 循环语句

    var names = {"alex","tony","rain"};
    //i是一个变量,nmaes.length是长度,i++是自加
    for(var i=0;i<nmaes.length;i++){
        pass
    }
    //这个for循环,循环的是索引的值
    for (var item in li){
        console.log(item,li[item]);
    }
    while(条件){}
  3. 异常处理

    try {
        //这段代码从上往下执行,其中任何一个语句抛出异常该代码块就结束执行
    }
    catch (e){
        //如果try代码块中抛出了异常,catch代码块中的代码就会被执行。
        //额是一个局部变量,用来指向error对象或者其他抛出的对象
    }
    finally{
        //无论try中代码是否抛出异常都会执行finally里面的命令
    } 
    //主动抛出异常
    Python
    	raise Exception (xxx)
    JavaScript
    	throw new Error("asdfasdf")
  4. 函数

    //普通函数
    	function func(arg){
            return true;
        }
    //匿名函数
    	var func = function(arg){
            return "tony";
        }
    //自执行函数
        (function(arg){
            console.log(arg);
        })("123")

作用域的操作

  1. JavaScript中无块级作用域

    function Main{
        if (1==1){
            var name = "seven0";
        }
        console.log(name);
    }
  2. JavaScript采用函数作用域

    function Main{
        var innerValue = "seven";
    }
    
    Main();
    
    console.log(innerValue);
  3. javaScript的作用域链

    xo = "alex";
    
    function Func(){
        var xo = "liang";
        function inner(){
            var xo = "asdf";
            console.log(xo);
        }
        inner();
    }
    Func();
  4. javaScrip的作用域链执行前已创建

    xo = "alex";
    
    function Func(){
        var xo = "liang";
        function inner(){
            console.log(xo);
        }
        return inner;
    }
    var ret = Func();
    ret();

面向对象

function Foo (name,age){
    this.Name = name;
    this.Age = age;
    this.Func = function(arg){
        return this.Name +arg;
    }
}
var obj = new Foo("alex",18); //想要创建对象必须加上new
var ret = obj.Func("sb");
console.log(ret)

DOM

Find Elements

  1. 直接查找

    document.getElementById							// 根据ID获取一个标签
    document.getElementsByName						// 根据name属性获取标签集合
    document.getElementsByClassName					// 根据class属性获取标签集合
    document.getElementsByTagName					// 根据标签签名获取标签集合
  2. 间接查找

    // 既包含元素有包含文本内容
    parentNode        								// 父节点
    childNodes        								// 所有子节点
    firstChild        								// 第一个子节点
    lastChild         								// 最后一个子节点
    nextSibling       								// 下一个兄弟节点
    previousSibling   								// 上一个兄弟节点
    // 只包含元素
    parentElement     								// 父节点标签元素
    children          								// 所有子标签
    firstElementChild 								// 第一个子标签元素
    lastElementChild  								// 最后一个子标签元素
    nextElementtSidling 							// 下一个兄弟标签元素
    previousElementSibling 							// 上一个兄弟标签元素

Operate

  1. 内容

    immerText										// 获取标签文本
    outerText
    innerHTML    									// HTML内容
    value        									// 获取值
    
    onfocus="focuns();"								// 获取焦点,执行函数
    onblur="Blur();"								// 失去焦点,执行函数
    onclick="Modal();"								// 点击后执行函数
    
    attributes										// 获取所有标签属性
    setAttribute(key,value)							// 设置标签属性
    getAttribute(key) 								// 获取指定标签属性 
    t.removeAttribute()    							// 移除指定的值
    
    className        								// 获取所有类
    classList.remove(cls) 							// 删除指定类
    classLIst.add(cls)   							// 添加类
    
    tag.style.font-size = 40px						// 修改样式
    
    // ****************** 创建标签 ****************** 
    // 方式1对象方式
    var tag = document.createElement("a")			// 创建标签
    tag.innerText = "wupeiqi"						// 添加内容
    tag.className = "c1"							// 添加类
    tag.href = "http://www.baidu.com"				// 添加链接
    //方式2字符串方式 
    var tag = '<a class = "c1" href = "http://www.cnblogs.com">wupeiqi</a>'
    
    // ****************** 操作标签 ****************** 
    // 方式1
    var obj = "<input type = 'text' />";
    xxx.insertAdjacentHTML("beforeEnd",obj);
    // xxx.insertAdjacentText("beforeEnd",obj);		// 把标签当做文本显示
    // 注意:第一个参数只能是“beforeBegin”是放到内部的上面“afterBegin”外部的最上面,beforeEnd内部的最下面“afterEnd”外部的最下面
    
    // 方式2
    var tag = document.createElement("a")
    xxx.appendChild(tag)
    xxx.insertBefore(tag,xxx[1])
    
    this											// 当前触发事件标签
    createElement
    appendChild
    
    // ****************** 定时器 *******************
    setInterval    									// 多次定时器
    clearInterval    								// 清除多次定时器
    setTimeoutsetTimeout(function(){},5000);   		// 单次定时器
    clearTimeout    								// 清除单次定时器
    
    // ****************** 高度 *********************
    clientHeight    								// 可见区域 height + padding
    clientTop    									// border高度
    offsetHeight   									// 可见区域:height+ padding+ border
    offsetTop    									// 上级定位标签高度
    scrollHeight    								// 全文高:height+ padding
    // 特别的:document.documentElement代指文档根节点
    document.body.scrollTop = 0						// 页面上自带的滚动条获取滚动条位置
    
    // ****************** 其他 **********************
    comsole.log()									// 输出框
    alert()											// 弹出框
    confirm()										// 确定框
    
    // ****************** URL和刷新 ******************
    location.href									// 获取URL
    location.href = "url"							// 重定向
    location.reload()								// 重新加载
  2. 事件

    onabort											// 图像的加载别中断。
    onblur         									// 元素失去焦点。
    onchange	  									// 域的内容被改变。
    onclick 	  									// 当用户点击某个对象时调用的事件句柄。
    ondblclick 	  									// 当用户双击某个对象时调用的事件句柄。
    onerror		 									// 在加载文档或图像是发生错误。
    onfocus	 	 									// 元素获取焦点。
    onkeydown 	 									// 某个键盘按键被按下。
    onkeypress	 									// 某个键盘按键被按下并松开。
    onkeyup 	 									// 某个键盘按键被松开。
    onload 		 									// 一张页面或图像完成加载。
    onmousedown  									// 鼠标按钮被按下。
    onmousemove  									// 鼠标被移动。
    onmouseout   									// 鼠标从某元素移开。
    onmouseover  									// 鼠标移到某元素之上。
    onmouseup    									// 鼠标按键被松开。
    onreset 										// 重置按钮被点击。
    onresize    									// 窗口或框架被重新调整大小。
    onselect    									// 文本被选中。
    onsubmit    									// 确定按钮被点击
    onunload    									// 用户退出页面
  3. 搜索框

    <!DOCTYPE html>
    <html>
    	<head>
    		<meta charset="utf-8">
    		<title>菜鸟教程(runoob.com)</title>
    	</head>	
    	<body>
    		<input ID ="v1" type="text" value="请输入关键字" onfocus="Focus();" onblur="Blur();"/>
    		<Script>
    			function Focus(){
    				var tag = document.getElementById("v1");
    				if(tag.value == "请输入关键字"){
    					tag.value = ""
    				}
    			}
    			function Blur(){
    				var tag = document.getElementById("v1");
    				var val = tag.value;
    				if(val.trim().length == 0){
    					tag.value = "请输入关键字"
    				}
    			}
    		</Script>
    	</body>
    </html>
  4. 小例子

    <style>
    .hide{
        display:none !important;
        }
    .shade{
    	position:fixed;
        top:0;
        bottom:0;
        left:0;
        right:0;
        background-color:rgba(0,0,0,.6);
        z-index:1000;
    }
        .modal{
            height:200px;
            width:400px;
            background-color:white;
            position:fixed;
            top:50%;
            left:50%;
            margin-left:-200px;
            margin-top: -100px;
            z-index:1001;
        }
    </style>
    <boody>
        <div style="height:2000px;backgrownd-color:#dddddd;">
            <input type="button" value="点我" onclick="ShowModal();">
            <div>
                <div id ="shade" class="shade hide"></div>
                <div id = "modal" class="modal hide">
                	/*javascript:void(0);什么也不做*/
                    <a href="javascript:void(0);" onclick="HideModal();">取消</a>
                </div>
    		<script>
    		function ShowModal(){
                var t1 = document.getElementById("shade")
                var t2 = document.getElementById("shade")            t1.classList.remove("hide")
             t2.classList.remove("hide")            
            }
             function HideModal(){
                    var t1 = document.getElementById("shade")
                var t2 = document.getElementById("shade")            t1.classList.add("hide")
             t2.classList.add("hide")
             }
                
                </script>
    </boody>
  5. 全选,取消,反选

    <!DOCTYPE html>
    <html>
    	<head>
    		<meta charset="utf-8">
    		<title>菜鸟教程(runoob.com)</title>
    	</head>	
    	<body>
    		<input type="button" value="全选" onclick = "CheckAll();"  />
    		<input type="button" value="取消" onclick = "ReverseAll();" />
    		<input type="button" value="反选" onclick = "c();"/>
    		
    		<table border="1" >
    			<tbody id = "ba">
    				<tr>
    					<td><input type="checkbox" /></td>    
    					<td>第二列</td>
    					<td>第三列</td>
    				</tr>
    				<tr> 
    					<td><input type="checkbox"  /></td>    
    					<td>第二列</td> 
    					<td>第三列</td>
    				</tr>
    				<tr>   
    					<td><input type="checkbox" /></td>    
    					<td>第二列</td> 
    					<td>第三列</td>
    				</tr>
    			</tbody>
    		</table>
    		<Script>
    		
    			function CheckAll(){
    				var tb = document.getElementById("ba")
    				var trs = tb.children;
    				for (var i=0;i<trs.length;i++){
    					var current_tr = trs[i];
    					var ck = current_tr.firstElementChild.firstElementChild
    					ck.checked = true
    					
    				}
    				
    			}
    			
    			function ReverseAll(){
    				var tb = document.getElementById("ba")
    				var trs = tb.children;
    				for (var i=0;i<trs.length;i++){
    					var current_tr = trs[i];
    					var ck = current_tr.firstElementChild.firstElementChild
    					ck.checked = false
    					
    				}
    			}
    			
    			function c(){
    				var tb = document.getElementById("ba")
    				var trs = tb.children;
    				for (var i=0;i<trs.length;i++){
    					var current_tr = trs[i];
    					var ck = current_tr.firstElementChild.firstElementChild
    					if (ck.checked){
    						ck.checked = false
    					}
    					else{
    						ck.checked = true
    					
    					}
    					
    					
    				}
    			}
    		</Script>
    	</body>
    </html>
  6. 点赞

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title></title>
    	<style>
    		.item{
    			padding:50px; 
    			position:relative;
    		}
    	</style>
    </head>
    <body>
        <div class="item">
    		<a onclick="Favor(this)";>赞</a>
    		<!--this 是当前触发事件的标签-->
    	</div>
    	<div class="item">
    		<a onclick="Favor(this)";>赞</a>
    	</div>
    	<div class="item">
    		<a onclick="Favor(this)";>赞</a>
    	</div>
    	<script>
    		function Favor(ths){
    			var top = 49;
    			var left = 71;
    			var op = 1;
    			var fontSize = 18;
    			var tag = document.createElement("span");
    			tag.innerText = "+1";
    			tag.style.color="red";
    			tag.style.position = "absolute";
    			tag.style.top=top + "px";
    			tag.style.left = left +"px";
    			tag.style.opacity = op;
    			tag.style.fontSize = fontSize + "px";
    			ths.parentElement.appendChild(tag);
    			var interval = setInterval(function(){
    				top -= 10;
    				left += 10;
    				fontSize += 5;
    				op -= 0.1;
    				tag.style.color="red";
    				tag.style.top=top + "px";
    				tag.style.left = left +"px";
    				tag.style.opacity = op;
    				tag.style.fontSize = fontSize + "px";
    				if(op <=0.1){
    					clearInterval(interval);
    					ths.parentElement.removeChild(tag);
    				}
    			},50);
    		}
    	</script>
    </body>
    </html>
  7. 定时器的使用

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title></title>
    	<style>
    	</style>
    </head>
    <body>
        <div id="status" style="color:red;"></div>
        <input type="submit"onclick="DeleteStatus();"value="删除" />
    	<script>
    		function DeleteStatus(){
                var s = document.getElementById("status");
                s.innerText = "删除成功";
                setTimeout(function(){
                    s.innerText = "";
                },5000);
    			
    		}
    	</script>
    </body>
    </html>
  8. 回到顶点

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title></title>
    	<style>
    	</style>
    	.back{
            position:fixed;
            right:20px;
            bottom:20px;
            color:red;
        }
    	.hide{
            display:none;
        }
    </head>
    <body>
        <div style="height:2000px;background-color:#dddddd;"></div>
    	<div id="back" class="back hide" onclick="BackTop();">返回顶部</div>
    <script>
            function BackTop(){
            	document.body.scrollTop = 0;
        }
    	function BodyScroll(){
            var s= document.body.scrollTop;
            var t = document.getElementById("back");
            if (s>=100){
                t.classlist.remove("hide");
            }
            else{
                t.classlist.add("hide");
            }
        }
            </script>
    </body>
    </html>
  9. 提交表单

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <form id="f1">
            <input type="text"/>
            <input type="submit" value="提交"/>
            <a onclick="Submit()">提交</a>
    	</form>
    <script>
            function Submit(){
            	var form = document.getElementById("f1");
                form.submit();
        }
    	
        </script>
    </body>
    </html>
  10. 监听键盘

    <style>
    .hide{
        display:none !important;
        }
    .shade{
    	position:fixed;
        top:0;
        bottom:0;
        left:0;
        right:0;
        background-color:rgba(0,0,0,.6);
        z-index:1000;
    }
        .modal{
            height:200px;
            width:400px;
            background-color:white;
            position:fixed;
            top:50%;
            left:50%;
            margin-left:-200px;
            margin-top: -100px;
            z-index:1001;
        }
    </style>
    <boody>
        <div style="height:2000px;backgrownd-color:#dddddd;">
            <input type="button" value="点我" onclick="ShowModal();">
            <div>
                <div id ="shade" class="shade hide"></div>
                <div id = "modal" class="modal hide">
                	/*javascript:void(0);什么也不做*/
                    <a href="javascript:void(0);" onclick="HideModal();">取消</a>
                </div>
    		<script>
    		function ShowModal(){
                var t1 = document.getElementById("shade")
                var t2 = document.getElementById("shade")            t1.classList.remove("hide")
             t2.classList.remove("hide")            
            }
             function HideModal(){
                    var t1 = document.getElementById("shade")
                var t2 = document.getElementById("shade")            t1.classList.add("hide")
             t2.classList.add("hide")
             }
               window.onkeydown = function(event){
                   comsole.log(event);
                   if(event.keyCode == 27){
                       HideModal();
                   }
               }
                </script>
    </boody>
  11. 用户验证

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <form action="http://www.baidu.com">
            <input type="text" id="username"/>
            <input type="submit" value="提交"onclik="return SubmitForm();">
        </form>
    	<script>
    		function SubmitForm(){
                var user = documcnt.getElementById("username");
                if(user.value.length>0){
                    return true;
                }
                else{
                    alert("用户名输入不能为空")
                    return false;
                }
            }
        </script>
    </body>
    </html>

JQuery

<script src="jquery-1.12.4.js"></script>				// 引入文件
$(ths)    												// 转换为jquery对象
$(ths)[0]    											// jquery对象转换为dom

Find

Selector

  1. #代表id选择器,标签名代表标签选择器,.代表class类选择器,*代表所有。

  2. #i1,#i2,#i3是组合,#i1 .c1按层级找i1的子子孙孙,#i1>.c1在儿子里面找

    $(this).hide()										// 隐藏当前元素
    $("p").hide()										// 隐藏所有 <p> 元素
    $("p.test").hide()									// 隐藏所有 class="test" 的 <p> 元素
    $("#test").hide()									// 隐藏 id="test" 的元素
    $("input:eq(1)")
    
    // **********************筛选******************************
    :first												// 获取匹配的第一个元素
    :not(selectos)										// 不是内个
    :even												// 偶数
    :odd												// 奇数
    :eq(index) 											// 第几个索引
    :gt(index)											// 大于
    :lt(index) 											// 小于
    $("input:eq(1)")
    
    // **********************属性******************************
    [attribute]
    [attribute=value]
    [attribute!=value]
    [attribute^=value]
    [attribute$=value]
    [attribute*=value]
    [attrSei1][attrSei2][attrSei3]
    $("[attribute]")
    
    // **********************表单******************************
    :input
    :text
    :password
    :radio
    // **********************表单对象属性************************
    :enabled    										// 所有可以操作
    :disabled   										// 所有不可以操作
    :checked    										// 选中
    :selected    										// 选中
  3. 小例子

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <div id="i1">
            <div class="item"></div>
            <div class="item">
                <div class="c1"></div>
    		   <a>百度</a>
            </div>
            <div class="item"></div>
        </div>
        <script src="jquery-1.12.0.js">
    	<script>
    removeClass
        </script>
    </body> 
    </html>

筛选器

eq(1)													// 索引这里的都是方法
first()													// 第一个
last()													// 最后一个
hasClass(class)											// 是否有某个样式
filter()												// 某个里面筛选
is()													// 判断返回的是不是指定的标签
map()
has()
// **********************查找************************
children()												// 所有的孩子
find()													// 所有的子子孙孙
parent()												// 父亲的
parentAll()												// 父亲所有
parentUnti()											// 父亲一个的父亲一个知道找到
next()													// 下一个
nextAll()												// 下边所有
nextUnti()												// 下一个的下一个知道找到
pcev()													// 上一个
pcevAll()												// 上边所有
pcevUnti()												// 上一个的上一个知道找到
siblings()												// 找兄弟
  1. 菜单

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        
    </boody>
    </html>
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title></title>
    	<style>
    		.hide{
    			display:none;
    		}
    		.menu{
    			width:200px;
    			height:600px;
    			border:1px solid #dddddd;
    			overflow:auto;
    		}
    		.menu .item .title{
    			height: 40px;
    			line-height:40px;
    			background-color:#2459a2;
    			color:white;
    		
    		} 
    		
    	</style>
    
    </head>
    <body>
        <div class="menu" >
    		<div class="item">
    			<div class="title" onclick="ShowMenu(this);">菜单一</div>
    			<div class="body">
    			<p>内容一</p>
    			<p>内容一</p>
    			<p>内容一</p>
    			<p>内容一</p>
    			<p>内容一</p>
    			<p>内容一</p>
    			</div>
    		</div>
    		<div class="item">
    			<div class="title" onclick="ShowMenu(this)";>菜单二</div>
    			<div class="body hide">
    			<p>内容一</p>
    			<p>内容一</p>
    			<p>内容一</p>
    			<p>内容一</p>
    			<p>内容一</p>
    			<p>内容一</p>
    			</div>
    		</div>
    		<div class="item">
    			<div class="title" onclick="ShowMenu(this)";>菜单三</div>
    			<div class="body hide">
    			<p>内容一</p>
    			<p>内容一</p>
    			<p>内容一</p>
    			<p>内容一</p>
    			<p>内容一</p>
    			<p>内容一</p>
    			</div>
    		</div>
        </div>
    	<script src="jquery-3.6.0.min.js"></script>
        <script>
    		function ShowMenu(ths){
    			$(ths).next().removeClass("hide") ;
    			$(ths).parent().siblings().find(".body").addClass("hide");
    		}
    	</script>
    </boody>
    </html>

JQuery CSS

 

// ************************属性*****************************
attr()													// 设置属性
removeAttr()											// 删除属性
prop()													// 写一个参数是获取值,写两个是赋值
removeProp()											// 删除
// ************************css类*****************************
addClass()												// 添加样式
removeClass()											// 删除样式
toggleClass()											// 单击一次添加,再点击一下删除
// ************************HTML代码/文本/值*****************************
HTML()													// 没有参数是获取内容,有参数是赋值,下面的都一样
TEXT()
VAL()
// ************************css*****************************
css()													// 一个参数是获取,两个是赋值 
// ************************位置*****************************
offset()												// 获取标签的高度,宽度
position()												// 获取当前标签与父标签的距离
scrollTop()												// 与顶部的距离
scrollLeft()											// 与右边的距离
// ************************尺寸*****************************

height()												// 高度
width()													// 宽度
innerHeight()											// 包括边距不带边宽    
innerWdth()
outerHeight()											// 包括边距带边宽
outerWdth()
  1. 全选,反选,取消(jquery版)

    <!DOCTYPE html>
    <html>
    	<head>
    		<meta charset="utf-8">
    		<title>菜鸟教程(runoob.com)</title>
    	</head>	
    	<body>
    		<input type="button" value="全选" onclick = "CheckAll();"  />
    		<input type="button" value="取消" onclick = "ReverseAll();" />
    		<input type="button" value="反选" onclick = "c();"/>
    		
    		<table border="1" >
    			<tbody id = "ba">
    				<tr>
    					<td><input type="checkbox" /></td>    
    					<td>第二列</td>
    					<td>第三列</td>
    				</tr>
    				<tr> 
    					<td><input type="checkbox"  /></td>    
    					<td>第二列</td> 
    					<td>第三列</td>
    				</tr>
    				<tr>   
    					<td><input type="checkbox" /></td>    
    					<td>第二列</td> 
    					<td>第三列</td>
    				</tr>
    			</tbody>
    		</table>
    		<script src="jquery-3.6.0.min.js"><script>
    		<Script>
    		
    			function CheckAll(){
    				$("#tb input[type="checkbox"]").prop("checked",true);
    			}
    			
    			function ReverseAll(){
    				$("#tb input[type="checkbox"]").prop("checked",false);
    			}
    			
    			function c(){
    				$("#tb input[type="checkbox"]").each(function(i)){
    					if($(this).prop("checked")){
    						$(this).prop("checked",false);
    					}
    					else{
    						$(this).prop("checked",true);
    					}
    				});
    			}
    		</Script>
    	</body>
    </html>

文档处理

// ************************内部插入**************************
append()    最后边添加 
appendTo()    把什么翻到什么里面 
prepend()    子元素的最前边
prependTo()
// ************************外部插入**************************
after()    当前标签的后边
before()    当前标签的前边
insertAfter()    把什么放到什么后边
insertBefore()    
// ************************删除*****************************
empty()    清空所提供标签的内部
remove()    清除所有提供的标签
// ************************复制*****************************
clone    复制
// ************************示例*****************************
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
	<body>
		<div>
			<a>
				<a onclick="Add(this);">+</a>
				<input type="text" />
			</a>
		</div>
		<script src=""></script>
		<script>
			function Add(ths){
				var p= $(ths).parent().clone();
				p.find("a").text("-");
				p.find("a").attr("onclick","Remove(this)")
				$(ths).parent().parent().append(p); 

			}
			function Remove(ths){
				$(ths).parent().remove();
			}
        </script>
	</boody>
</html>

事件

  1. jquery菜单

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        
    </boody>
    </html>
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title></title>
    	<style>
    		.hide{
    			display:none;
    		}
    		.menu{
    			width:200px;
    			height:600px;
    			border:1px solid #dddddd;
    			overflow:auto;
    		}
    		.menu .item .title{
    			height: 40px;
    			line-height:40px;
    			background-color:#2459a2;
    			color:white;
    		
    		} 
    		
    	</style>
    
    </head>
    <body>
        <div class="menu" >
    		<div class="item">
    			<div class="title"">菜单一</div>
    			<div class="body">
    			<p>内容一</p>
    			<p>内容一</p>
    			<p>内容一</p>
    			<p>内容一</p>
    			<p>内容一</p>
    			<p>内容一</p>
    			</div>
    		</div>
    		<div class="item">
    			<div class="title" ;>菜单二</div>
    			<div class="body hide">
    			<p>内容一</p>
    			<p>内容一</p>
    			<p>内容一</p>
    			<p>内容一</p>
    			<p>内容一</p>
    			<p>内容一</p>
    			</div>
    		</div>
    		<div class="item">
    			<div class="title";>菜单三</div>
    			<div class="body hide">
    			<p>内容一</p>
    			<p>内容一</p>
    			<p>内容一</p>
    			<p>内容一</p>
    			<p>内容一</p>
    			<p>内容一</p>
    			</div>
    		</div>
        </div>
    	<script src="jquery-3.6.0.min.js"></script>
        <script>
    		$(".item .title").click(function(){
            //这里的this就是被点击的标签	
            $(this).next().removeClass("hide") ;
            $(this).parent().siblings().find(".body").addClass("hide");
        })
    		
    	</script>
    </boody>
    </html>
    
    
    //绑定事件
    		$(".item .title").bind("click",function(){
            //这里的this就是被点击的标签	
            $(this).next().removeClass("hide") ;
            $(this).parent().siblings().find(".body").addClass("hide");
        })
    //当文档数加载完毕后,自动执行
    $(function(){})
    
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <input type="text" onclick="Add();" />
        <ul>
            <li>123</li>
    	<ul>
        <script src="xxx"></script>
    	<script>
            $(function(){
            	$("li").click(function(){
                    alert($(this).text());
                //先找到ul在找到li,在给li绑定事件,叫做延迟加载
                $("ul").delegate("li","click",function(){
                    alert($(this).text());
        })
            function Add(){
                var tag = document.createElement("li");
                tag.innerText = "666";
                $("ul").append(tag);
            }
            
            </script>
    </boody>
    </html>
  2. jquery的循环

    each(function(i){    each是循环中间是函数,i是索引的第0 ,第1个,第2个自动给你加上
    					this是当前正在循环的元素
                          $(this)当前标签的jquery对象
        
    });

jQuery示例

  1. 表单验证,jQuery扩展

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title></title>
    	<style>
            .item{
                width:250px;
                height:60px;
                position:relative;
            }
    		.item input{
                width:200px;
            }
    		.item span{
                position:absolute;
                top:20px;
                left:20px;
                font-size:8px;
                background-color:indianred;
                color:while;
                display:inline-block;
                width:200px;
            }
        </style>
    </head>
    <body>
        <div>
        	<form>
            	<div class="item">
            		<input class="c1" type="text" name="username" label="用户名" />
            	</div>
    		    <div class="item">
                    <input class="c1" type="password" name="pwd" label="密码">
                </div>
    			<input type="submit"value="提交" onclick="CheckValid();"/>
    		</form>
        </div>
    	<script>
    	    function CheckValid(){
                $("form.item span").remove();
    			var flag = true;
                $("form .c1").each(function(){
                    var val = $(this).attr("label");
                    var tag = document.createElement("span");
                    tag.innerText = label+"不能为空";
                    $(this).after(tag);
                    flag = false;
                })
                    return flag;
                }
        </script>
    </body>
    </html>
  2. jquery版本的绑定

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title></title>
    	<style>
            .item{
                width:250px;
                height:60px;
                position:relative;
            }
    		.item input{
                width:200px;
            }
    		.item span{
                position:absolute;
                top:20px;
                left:20px;
                font-size:8px;
                background-color:indianred;
                color:while;
                display:inline-block;
                width:200px;
            }
        </style>
    </head>
    <body>
        <div>
        	<form>
            	<div class="item">
            		<input class="c1" type="text" name="username" label="用户名" />
            	</div>
    		    <div class="item">
                    <input class="c1" type="password" name="pwd" label="密码">
                </div>
    			<input type="submit"value="提交" onclick="CheckValid();"/>
    		</form>
        </div>
    	<script>
    		function BindCheckValid(){
    			$("form :submit").click(function(){
    				var flag = true;
    				$("form.item span").remove();
    					
    				$("form .c1").each(function(){
    					var val = $(this).val();
    					if(val.length<=0){
    						var label = $(this).attr("label");
    						var tag = document.createElement("span");
    						tag.innerText = label + "不能为空";
    						$(this).after(tag);
    						flag = false;
    					}
    				})
    				return flag;
    						
    			});
    		
    		}
    	    
        </script>
    </body>
    </html>
  3. jquery的for循环

    function f1(){
        $.each([11,22,33,44],function(k,v){
            if(k==2){    //这里的k是索引的数v是值
                return; //这里的return只会返回里面的函数,就和Python中的继续一样,如果你想停止循环可以用“return false”
            }
        })
    }
  4. jquery扩展方法

    jquery.fn.extend(object)
    $.extend({
        "dalong":function(arg){
            console.log(arg);
        }
    });
    $("form").dalong("1234")    必须是用标签,这个里面有一个this代指这个标签
    
    jquery.extend(object)    给jquery添加函数永久存在
    $.extend({
        "dalong":function(arg){
            console.log(arg);
        }
    });
    $.dalong("1234")
  5. 文件

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title></title>
    	<style>
            .item{
                width:250px;
                height:60px;
                position:relative;
            }
    		.item input{
                width:200px;
            }
    		.item span{
                position:absolute;
                top:20px;
                left:20px;
                font-size:8px;
                background-color:indianred;
                color:while;
                display:inline-block;
                width:200px;
            }
        </style>
    </head>
    <body>
        <div>
        	<form>
            	<div class="item">
            		<input class="c1" type="text" name="username" label="用户名" require="true" min-len="6" />
            	</div>
    		    <div class="item">
                    <input class="c1" type="password" name="pwd" label="密码" require="true" phone="true">
                </div>
    			<input type="submit"value="提交" onclick="CheckValid();"/>
    		</form>
        </div>
    	<script src="jquery-xxx.js"</script>	
    	<script>
            $(function(){
            	$.valid("#form1");
        })
         </script>
    </body>
    </html>
  6. 文件jquery1

    (function(iq){
     	jq.extend({
        	valid:function(form){
                jq(form).find(":submit").click(function(){
                    jq(form).find(".item span").remove();
                    var flag = true;
                    jq(form).find(":text,:password").each(function(){
                        var require = $(this).attr("tequire");
                        if (require){
                        	var val = $(this).val();
    
                            if (val.length<=0){
                                var lavel = $(this).attr("label");
                                ErrorMessage($(this),label + "不能为空");
                                flag= false;
                                return false;
                            }
                        var minLen = $(this).attr("min-len");\
                        if (minLen){
                            var minLenInt = parseInt(minLen);
                            if(val.lenth<minLenInt){
                                var label = $(this).attr("label");
                                ErrorMessage($(this),label + "长度最小为"+minLen);
                                flag = false;
                                return false;
                            }
                        }
                        }
                        }
                        var phone = $(this).attr("phone");
                        if(phone){
                            var phoneReg = /^[3|5|8]\d{9}$/;
                            if(!phoneReg.test(val)){
                                var lavel = $(this).attr("label");
                                ErrorMessage($(this),label + "格式错误");
                                flag = false;
                                return false;
                            }
                        }
                        })
                    
                        return flag;
                    }
                })
            }
            )}        
     })(jQuery);

Js的正则表达式

定义正则表达式
/.../ 用于定义正则表达式
/.../g 表示全局匹配
/.../i 表示不区分大小写
/.../m 表示多行匹配
js正则匹配时本身就是支持多行,此处行匹配只是影响正则表达式^$来匹配换行的内容
var pattern = /^Java\w*/gm;
var text = "JavaScript is more fun than \nJavaEE or JavaBeans!";
result = pattern.exec(text)
result = pattern.exec(text)
匹配
JavaScript中支持正则表达式,其主要提供了连个功能:
text(string)   检查字符串中是否和正则匹配
exec(string)    获取正则表达式匹配的内容,如果未匹配,值为null,否则,获取匹配成功的数组。
字符串中相关方法
obj.search(regexp)    获取索引位置,搜索整个字符串,返回匹配成功的第一个位置(g模式无效)
obj.match(regexp)    获取匹配内容,搜索整个字符串,获取找到第一个匹配内容,如果正则是g模式找到全部
obj.replace(regexp,replacement)   替换匹配替换,正则中有g则替换所有,否则只替换第一个匹配项,
$数字:匹配的第n个组内容;
$&: 当前匹配的内容;
$`:位于匹配子串左侧的文本;
$':位于匹配子串右侧的文本
$$:直接量$符号
非全局模式
	获取匹配结果数组,注意:第一个元素是第一个匹配的结果,后面元素使正则子匹配(正则内容分组匹配)
	var pattern = /\bJava\w*\b/;
	var text = "JavaScript is more fun than Java or JavaBeans!";
	result = pattern.exec(text)
	
	var pattern = /\b(Java)\w*\b/;
	var text = "JavaScript is more fun than Java or JavaBeans!";
	result = pattern.exec(text)

全局模式
	需要反复调用exec方法,来一个一个获取结果,直到匹配获取结果为null表示获取完毕
	var pattern = /\bJava\w*\b/g;
	var text = "JavaScript is more fun than Java or JavaBeans!";
	result = pattern.exec(text)

	var pattern = /\b(Java)\w*\b/g;
	var text = "JavaScript is more fun than Java or JavaBeans!"
	result = pattern.exec(text)

Fundamentals of MySQL

  1. MySQL:是用于管理文件的一个软件

    1. 服务端软件:socket服务端、本地文件操作、解析指令(SQL语句)

    2. 客户端软件(各种各样):socket客户端、发送指令、解析指令(SQL语句)

  2. ps:DBMS数据库管理系统、SQL语句

  3. 技能:安装 服务端和客户端

  4. 学习SQL语句规则;指示服务端做任意操作

Install

  1. 安装SQL:https://dev.mysql.com/downloads/mysql/。MySQL分为:mysql.exe (客户端)、mysqld.exe (服务端)。

  2. 给MySQLServer添加环境变量PATH=path\mysql-8.0.11-winx64\bin;

  3. 在“mysql-8.0.11-winx64”目录下创建名为“my.ini”的文件。

    [mysqld]
    # 设置3306端口
    port=3306
    # 设置mysql的安装目录
    basedir=E:\\software\\mysql\\mysql-8.0.11-winx64   # 切记此处一定要用双斜杠\\,单斜杠我这里会出错,不过看别人的教程,有的是单斜杠。自己尝试吧
    # 设置mysql数据库的数据的存放目录
    datadir=E:\\software\\mysql\\mysql-8.0.11-winx64\\Data   # 此处同上
    # 允许最大连接数
    max_connections=200
    # 允许连接失败的次数。这是为了防止有人从该主机试图攻击数据库系统
    max_connect_errors=10
    # 服务端使用的字符集默认为UTF8
    character-set-server=utf8
    # 创建新表时将使用的默认存储引擎
    default-storage-engine=INNODB
    # 默认使用“mysql_native_password”插件认证
    default_authentication_plugin=mysql_native_password
    [mysql]
    # 设置mysql客户端默认字符集
    default-character-set=utf8
    [client]
    # 设置mysql客户端连接服务端时默认使用的端口
    port=3306
    default-character-set=utf8
  4. 以管理员身份打开cmd、输入“mysqld --initialize --console”。记得root@localhost: rI5rvf5x5G,其中rI5rvf5x5G,E”就是初始密码(不含首位空格)。

  5. 为了不每次使用都打开mysqldServer可以添加系统服务。

    1. 在服务器路径后面加上--install就可以在后台创建mysqld服务端了

    2. 在服务器路径后面加上--remove就可以删除后台服务mysqld服务端了

    3. 执行net start MySQL命令就可以启动服务

    4. 执行net stop MySQL命令就可以停止服务

  6. 在终端写入mysql -u root -p,就是登录mysql了。

  7. 修改密码ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密码';

用户和权限

  1. Add Users

    show databases;											# 查看目录下的文件夹
    create database bas;									# 创建数据库
    use mysql;												# 进入文件
    show tadles;    										# 看文件夹
    select user from user;    								# 查看表,在某个表里面查看某列数据
    create user “alex”@“192.168.1.1” identified by "123"    # 创建用户在那个电脑上登录并设置密码,如果在ip后两位写成%,就是只要前缀是的都可以登录。
  2. 用户管理

    create user 'user'@'IP' identified by 'password';		# 创建用户
    drop user 'user'@'IP';									# 删除用户
    rename user 'user'@'IP'; to 'new user'@'IP';			# 修改用户
    set password for 'user'@'IP' = Password('new password')	# 修改密码
    # PS:用户权限相关数据保存在mysql数据库的user表中,所以也可以直接对其进行操作(不建议)
  3. 权限管理

    show grants for 'user'@'IP'                  			# 查看权限
    grant  <purview> on <database.table> to   'user'@'IP'   # 授权
    revoke <purview> on <database.table> from 'user'@'IP'   # 取消权限
  4. 权限

    all privileges											# 除grant外的所有权限
    	select          									# 仅查权限
    	select,insert   									# 查和插入权限
    	usage                   							# 无访问权限
        alter                   							# 使用alter table
        alter routine           							# 使用alter procedure和drop procedure
        create                  							# 使用create table
        create routine          							# 使用create procedure
        create temporary tables 							# 使用create temporary tables
        create user             							# 使用create user、drop user、rename user和revoke  all privileges
        create view             							# 使用create view
        delete                  							# 使用delete
        drop                    							# 使用drop table
        execute                 							# 使用call和存储过程
        file                    							# 使用select into outfile 和 load data infile
        grant option            							# 使用grant 和 revoke
        index                   							# 使用index
        insert                  							# 使用insert
        lock tables             							# 使用lock table
        process                 							# 使用show full processlist
        select                  							# 使用select
        show databases          							# 使用show databases
        show view               							# 使用show view
        update                  							# 使用update
        reload                  							# 使用flush
        shutdown                							# 使用mysqladmin shutdown(关闭MySQL)
        super                   							# 使用change master、kill、logs、purge、master和set global。还允许mysqladmin调试登陆
        replication client      							# 服务器位置的访问
        replication slave       							# 由复制从属使用
  5. 用户ip

    # 用户名@IP地址         用户只能在改IP下才能访问
    # 用户名@192.168.1.%   用户只能在改IP段下才能访问(通配符%表示任意)
    # 用户名@%             用户可以再任意IP下访问(默认IP地址为%)
    
    grant all privileges on db1.tb1 TO '用户名'@'IP'
    grant select on db1.* TO '用户名'@'IP'
    grant select,insert on *.* TO '用户名'@'IP'
    revoke select on db1.tb1 from '用户名'@'IP'
    
    flush privileges										# 将数据读取到内存中,从而立即生效。

数据库和表

  1. 数据库

    create database db2;          							# 创建数据库
    create database db2; default charset utf8;          	# 创建数据库将编码设置为utf8
    show databases;               							# 查看数据库
    drop database db2;            							# 删除数据库
    use db2;                      							# 打开数据库
  2. show tables;
    create table t1 (id int,name char(10))    				# int是数值型,char是字符型 
    create table t1 (id int,name char(10)) default charset = utf8;    # 创建表的时候也需要将他设置成utf8
    create table t1 (id int,name char(10)) engine=innodb default charset = utf8;    # 创建表编码是utf8加上引擎
    		# innodb是有回滚的数据遭到问题,会自动返回,支持事务
    		# myisam没有回滚但是有全局索引,速度要比innodb快
    		
    create table t1 (
        列名 类型 null(可以为空)
        列名 类型 not null(不可以为空)
        列名 类型 not null auto_increment primary key 这条数据可以自加一你可以不用自己添加数据,它在sql上有约束需要加上 primary key    表示约束(不能重复且不能为空);加速查找,一个表里面只能有一个自增列和约束
        id int null auto_increment primary key ,
        name char(10)
    ) engine=innodb default charset = utf8; 
    
    delete from t1;        									# 清空表
    truncate table t1;     									# 清空表直接
    drop table t1;         									# 删除表 
    
    select * from t1;             							# 查看数据
    insert into t1 (id,name) values (1,"alex");  			# 添加数据 
    delete from t1 where id<6     							# 清空
    update t1 set age=18;         							# 修改

数据类型

bit[(M)]
	#二进制位(101001),m表示二进制位的长度(1-64),默认m=1

tinyint[(m)] [unsigned] [zerofill]

	#小整数,数据类型用于保存一些范围的整数数值范围:
    #有符号:
    	-128 ~ 127.
    #无符号:
         0 ~ 255
    #特别的: MySQL中无布尔值,使用tinyint(1)构造。

int[(m)][unsigned][zerofill]

	#整数,数据类型用于保存一些范围的整数数值范围:
    #有符号:
         -2147483648 ~ 2147483647
    #无符号:
         0 ~ 4294967295

    #特别的:整数类型中的m仅用于显示,对存储范围无限制。例如: int(5),当插入数据2时,select 时数据显示为: 00002

bigint[(m)][unsigned][zerofill]
    #大整数,数据类型用于保存一些范围的整数数值范围:
    #有符号:
         -9223372036854775808 ~ 9223372036854775807
    #无符号:
         0  ~  18446744073709551615

decimal[(m[,d])] [unsigned] [zerofill]
    #准确的小数值,m是数字总个数(负号不算),d是小数点后个数。 m最大值为65,d最大值为30。
    #特别的:对于精确数值计算时需要用此类型
    #decaimal能够存储精确值的原因在于其内部按照字符串存储。

FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]
	#单精度浮点数(非准确小数值),m是数字总个数,d是小数点后个数。
	#无符号:
         -3.402823466E+38 to -1.175494351E-38,
         0
         1.175494351E-38 to 3.402823466E+38
     #有符号:
         0
         1.175494351E-38 to 3.402823466E+38

            **** 数值越大,越不准确 ****

DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]
	#双精度浮点数(非准确小数值),m是数字总个数,d是小数点后个数。

     #无符号:
          -1.7976931348623157E+308 to -2.2250738585072014E-308
          0
          2.2250738585072014E-308 to 1.7976931348623157E+308
     #有符号:
          0
          2.2250738585072014E-308 to 1.7976931348623157E+308
            **** 数值越大,越不准确 ****


char (m)
	#char数据类型用于表示固定长度的字符串,可以包含最多达255个字符。其中m代表字符串的长度。
    #PS: 即使数据小于m长度,也会占用m长度
varchar(m)
	#varchars数据类型用于变长的字符串,可以包含最多达255个字符。其中m代表该数据类型所允许保存的字符串的最大长度,只要长度小于该最大值的字符串都可以被保存在该数据类型中。

	#注:虽然varchar使用起来较为灵活,但是从整个系统的性能角度来说,char数据类型的处理速度更快,有时甚至可以超出varchar处理速度的50%。因此,用户在设计数据库时应当综合考虑各方面的因素,以求达到最佳的平衡

text
	#text数据类型用于保存变长的大字符串,可以组多到65535 (2**16 − 1)个字符。

mediumtext
	A TEXT column with a maximum length of 16,777,215 (2**24 − 1) characters.

longtext
	A TEXT column with a maximum length of 4,294,967,295 or 4GB (2**32 − 1) characters.


enum
	枚举类型,
    An ENUM column can have a maximum of 65,535 distinct elements. (The practical limit is less than 3000.)
            示例:
                CREATE TABLE shirts (
                    name VARCHAR(40),
                    size ENUM('x-small', 'small', 'medium', 'large', 'x-large')
                );
                INSERT INTO shirts (name, size) VALUES ('dress shirt','large'), ('t-shirt','medium'),('polo shirt','small');

set
	集合类型
    A SET column can have a maximum of 64 distinct members.
    示例:
    CREATE TABLE myset (col SET('a', 'b', 'c', 'd'));
    INSERT INTO myset (col) VALUES ('a,d'), ('d,a'), ('a,d,a'), ('a,d,d'), ('d,a,d');

DATE
    YYYY-MM-DD(1000-01-01/9999-12-31)

TIME
   	HH:MM:SS('-838:59:59'/'838:59:59')

YEAR
	YYYY(1901/2155)

DATETIME
     YYYY-MM-DD HH:MM:SS(1000-01-01 00:00:00/9999-12-31 23:59:59    Y)

TIMESTAMP
      YYYYMMDD HHMMSS(1970-01-01 00:00:00/2037 年某时)

外键与练习

  1. 外键

    create table userinfo(
    	uid bigint auto_increment primary key,
        name varchar(32),
        department_id int,
        constraint fK_user_depar foreign key ("department_id",) references department("id")    
        # 这就是外键 foreign key后面加上要外键的字段名称,regerences后面加上被外键的表名括号字段名
    )engine=innodb default charset=utf8;
    
    create table department(
    	id bigint auto_increment primary key,
        title char(15),
    )engine=innodb default charset=utf8;
    
    create table student(
        sid bigint auto_increment primary key,
        sname varchar(8),
        gender varchar(2),
        class_id int,
        constraint fk_student_class foreign key (class_id) references class(cid)
    )engine=innodb default charset=utf8;
    
    ############################################################
    create table t1(
    	nid int(11) not null auto_increment,
        pid int(11) not null,
        num int(11) null,
        primary key (nid,pid)
    ) engine=innodb default charset=utf8;
    #一个表只能有一个主键,但是一个主键可以写在两行
    create table t2(
        id int auto_increment primary key,
        name char(10),
        id1 int,
        id2 int,
        constraint fk_t1_t2 foreign key (id1,id2) references t1 (nid,pid)
    )engine=innodb default charset=utf8;
  2. 练习

    create table class(
        cid bigint auto_increment primary key,
        caption varchar(8)
    )engine=innodb default charset=utf8;
    
    insert into class (caption) values ("三年二班");
    insert into class (caption) values ("一年三班");
    insert into class (caption) values ("三年一班");
    mysql> select * from class;
    +-----+--------------+
    | cid | caption      |
    +-----+--------------+
    |   1 | 三年二班     |
    |   2 | 一年三班     |
    |   3 | 三年一班     |
    +-----+--------------+
    
    
    create table teacher(
        tid bigint auto_increment primary key,
        tname varchar(8)
    )engine=innodb default charset=utf8;
    insert into teacher (tname) values ("波特");
    insert into teacher (tname) values ("比特");
    insert into teacher (tname) values ("菲斯特");
    mysql> select * from teacher;
    +-----+-----------+
    | tid | tname     |
    +-----+-----------+
    |   1 | 波特      |
    |   2 | 比特      |
    |   3 | 菲斯特    |
    +-----+-----------+
    
    
    create table student(
    	sid bigint auto_increment primary key,
    	sname varchar(8),
    	gender varchar(2),
    	class_id bigint,
    	constraint fk_student_class foreign key (class_id) references class(cid)
    )engine=innodb default charset=utf8;
    
    mysql> insert into student (sname,gender,class_id) values ("李永强","男",1);
    
    mysql> insert into student (sname,gender,class_id) values ("魏景奇","男",2);
    
    mysql> insert into student (sname,gender,class_id) values ("张栋亮","男",3);
    
    mysql> select * from student;
    +-----+-----------+--------+----------+
    | sid | sname     | gender | class_id |
    +-----+-----------+--------+----------+
    |   1 | 李永强    | 男     |        1 |
    |   3 | 魏景奇    | 男     |        2 |
    |   4 | 张栋亮    | 男     |        3 |
    +-----+-----------+--------+----------+
    
    create table course(
    	cid bigint auto_increment primary key,
    	cname varchar(8),
    	tearch_id bigint(2),
    	constraint fk_course_teacher foreign key (tearch_id) references teacher(tid)
    )engine=innodb default charset=utf8;
    
    insert into course (cname,tearch_id) values ("生物",1);
    
    insert into course (cname,tearch_id) values ("体育",1);
    
    insert into course (cname,tearch_id) values ("物理",2);
    
    mysql> select * from course;
    +-----+--------+-----------+
    | cid | cname  | tearch_id |
    +-----+--------+-----------+
    |   1 | 生物   |         1 |
    |   2 | 体育   |         1 |
    |   3 | 物理   |         2 |
    +-----+--------+-----------+
    
    create table score(
         sid bigint auto_increment primary key,
         student_id bigint,
         constraint fk_teacher_score foreign key (student_id) references student(sid),
         corse_id bigint,
         constraint fk_course_score foreign key (corse_id) references course(cid),
         number int
    )engine=innodb default charset=utf8;
    
    mysql> insert into score (student_id,corse_id,number) values (1,1,60);
    
    mysql> insert into score (student_id,corse_id,number) values (1,2,59);
    
    mysql> insert into score (student_id,corse_id,number) values (2,2,100);
    
    mysql> select * from score;
    +-----+------------+----------+--------+
    | sid | student_id | corse_id | number |
    +-----+------------+----------+--------+
    |   1 |          1 |        1 |     60 |
    |   2 |          1 |        2 |     59 |
    |   3 |          2 |        2 |    100 |
    +-----+------------+----------+--------+

基本认识

# 自增
desc t1;        											# 查看数据类型
show create table t1;        								# 显示表的创建过程  后面加上/g 是竖着看、
alter table t1  auto_increment-12;    						# 设置自排序的序号

# 基于会话级别
show session variables like "auto_inc%";    				# 查看全局变量
set session auto_increment_increment=2;     				# 设置会话步长
set session auto_increment_offset=10;       				# 起始值

# 基于全局级别
show global variables like "auto_inc%";    					# 查看全局变量
set global auto_increment_increment=2;     					# 设置全局会话步长
set global auto_increment_offset=10;       					# 起始值

# 唯一索引
create table t1(
	id int...,
    num int,
    unique uq1 (num)    # 把num设置唯一性,联合唯一
)
1 1 1  # 约束不能重复,主键不能重复(不能为空),加速查找
1 1 2  # 联合唯一是一组变化

# 转储
mysql dunp -u root  -d db1 > db2.sql -p						# mysql dunp是一个可执行程序,db1是你要存储的数据库,db2是你要存储的表名和位置,注意加了-d只备份表结构,不加数据也会被备份,把大于号换成小于号就是导入

数据行操作

# 增
insert into tb11(name,age) values ("alex",12);				# 单行插入
insert into tb11(name,age) values ("alex",12),("root",18)	# 多行插入
insert into tb12(name,age) values name,age from tb11;		# 将其他表的某行数据放到tb12中

# 查
select * from tb12;											# 查询表
select id,name as cname form tb12 vhere id >10 or name ="xxx"; # 设置别名
select name,age ,11 from tb12;

# 条件
select * from tb12 where id !=1
select * from tb12 where id in(1,5,12);
select * from tb12 where id not in (1,5,12);
select * from tb12 where id between 5 and 12; 				# 两个都显示,显示两个数中间的所有数据
select * from tb12 where id in (select id from tb11)

# 通配符
select * from tb12 where name like "a%"    					# 显示以a开头的,百分号是所有,下划线是一个
select * from tb12 where name like "a_"    					# 显示以a开头的,百分号是所有,下划线是一个

# 范围
select *from tb12 limit 10;									# 拿十条数据
select *from tb12 limit 0,12;								# 第一个只是起始位置,第二个是在起始位置的后面拿几条数据
select *from tb12 limit 0 offset 20;						# offset是起始位置,limit 取几条数据功能一样

# 排序
select * form tb12 order by id desc; 						# 降序
select * form tb12 order by id asc;  						# 升序
select * from tb12 order by id desc,age asc;				# 根据id 从大到小排序,如果相同则按列age从大到小排序

# 分组
select count(id),part_id from userinfo group by part_id;
# 计数 分组
select tearch_id,count(cname) from course group by tearch_id;
tearch_id count(cname)    # tearch_id 1 的老师教了2门课,count(是几门课的数量)
		1			2	  # tearch_id 2 的老师教了1门课
		2			1
#################################################
# 如果你的条件中需要你做一些求和,平均值,取余等操作,必须要加上 group by 不写的话就没有办法用那些函数,想要做两次操作必须加上having,不加也不行,下面是实例
select student_id,avg(number)  from score GROUP BY student_id HAVING avg(number) > 60
###################################################
select count(id),part_id from userinfo group by part_id having count(id) >1;
# 入股对于聚合函数结果进行二次筛选时?必须使用having

# 链表查询
select * from a,b where a.id = b.did						# 链接显示
select * from a left join b on a.id=b.did					# 功能一样推荐你用这个,a左边全部显示
select*from a right join b on a.id=b.did					# b右边全部显示
select*from a innder join b on a.id=b.did					# 隐藏带有null的那行数据
select score.sid,studet.sid from score
	left join student on score.student_id =student.sid
	left join course on score.course_id = course.cid
	left join class on student.class_id = class.cid
	left join teacher on course.teacher_id =id = teacher.tid
	
# 临时表
(select * from score where num>60;) as B;
# 查看临时表
select sid from(select * from score where num>60;) as B;

# 条件语句
select
    case when min (number)<10								# 条件开始和条件
            then 0 											# 语句组
        else min(num) 										# 条件不满足执行这里
    end														# 关闭条件
from t1

select
    if (isnull (score.number),      						# 条件开始和条件 insnull 是判断是否为空为空就执行0,不为空就执行score.number
        0,
        score.number) 	
from t1

# 表的数据叠加
select * from a as a1,a as a2;    							# 表里的文件会叠加
a1-1    a2-1												# a1表数据第1条会和a2表里的第1条
a1-2    a2-1												# a1表数据第2条会和a2表里的第1条
a1-1    a2-2												# a1表数据第1条会和a2表里的第2条

练习题

-- 1、自行创建测试数据 (留着)
-- 
-- 2、查询“生物”课程比“物理”课程成绩高的所有学生的学号;
-- SELECT
-- 	* 
-- FROM
-- 	(
-- 	SELECT
-- 		score.sid,
-- 		score.student_id,
-- 		score.number,
-- 		course.cname 
-- 	FROM
-- 		score
-- 		LEFT JOIN course ON score.corse_id = course.cid 
-- 	WHERE
-- 		course.cname = "生物" 
-- 	) AS A
-- 	INNER JOIN (
-- 	SELECT
-- 		score.sid,
-- 		score.student_id,
-- 		score.number,
-- 		course.cname 
-- 	FROM
-- 		score
-- 		LEFT JOIN course ON score.corse_id = course.cid 
-- 	WHERE
-- 		course.cname = "物理" 
-- 	) AS B ON A.STUDENT_ID = B.STUDENT_ID where A.number > B.number;
	
-- 3、查询平均成绩大于60分的同学的学号和平均成绩;
-- SELECT
-- 	student_id,
-- 	avg( number ) 
-- FROM
-- 	score 
-- GROUP BY
-- 	student_id 
-- HAVING
-- 	avg( number ) > 60
-- 
-- 4、查询所有同学的学号、姓名、选课数、总成绩;
-- SELECT
-- 	student.sid,
-- 	student.sname,
-- 	count(corse_id),
-- 	sum(number) 
-- FROM
-- 	score
-- 	LEFT JOIN student ON score.student_id = student.sid 
-- GROUP BY 
-- 	student.sid
-- order by 
-- 	student.sid 
-- 
-- 5、查询姓“李”的老师的个数;
-- SELECT
-- 	count( tname ) 
-- FROM
-- 	teacher 
-- WHERE
-- 	tname LIKE "李%" 
-- GROUP BY
-- 	tname > 1
-- 
-- 6、查询没学过“叶平”老师课的同学的学号、姓名;
-- SELECT
-- 	sid,
-- 	sname 
-- FROM
-- 	student 
-- WHERE
-- 	student.sid IN (
-- 	SELECT
-- 		score.student_id 
-- 	FROM
-- 		score 
-- 	WHERE
-- 	corse_id NOT IN ( SELECT course.cid FROM course LEFT JOIN teacher ON course.tearch_id = teacher.tid WHERE tname = "李和" ) 
-- 	)
-- 
-- 7、查询学过“001”并且也学过编号“002”课程的同学的学号、姓名;
-- SELECT
-- 	sid,
-- 	sname 
-- FROM
-- 	student 
-- WHERE
-- 	sid IN ( SELECT student_id FROM score WHERE corse_id = "1" OR corse_id = "2" GROUP BY student_id HAVING count( student_id ) > 1 )
-- 	) 
-- 
-- 8、查询学过“叶平”老师所教的所有课的同学的学号、姓名;
-- SELECT
-- 	sid,
-- 	sname 
-- FROM
-- 	student 
-- WHERE
-- 	sid IN (
-- 	SELECT
-- 		student_id 
-- 	FROM
-- 		score 
-- 	WHERE
-- 		corse_id IN ( SELECT cid FROM teacher LEFT JOIN course ON teacher.tid = course.tearch_id WHERE tname = "李和" ) 
-- 	) 
-- 
-- 9、查询课程编号“002”的成绩比课程编号“001”课程低的所有同学的学号、姓名;
-- SELECT
-- 	sid,
-- 	sname 
-- FROM
-- 	student 
-- WHERE
-- 	sid IN (
-- 	SELECT
-- 		B.student_id 
-- 	FROM
-- 		( SELECT student_id, number, corse_id FROM score LEFT JOIN course ON score.corse_id = course.cid WHERE cid = 2 ) AS A
-- 		LEFT JOIN ( SELECT student_id, number, corse_id FROM score LEFT JOIN course ON score.corse_id = course.cid WHERE cid = 1 ) AS B ON A.number < B.number 
-- 
-- 10、查询有课程成绩小于60分的同学的学号、姓名;
-- SELECT
-- 	student.sid,
-- 	sname 
-- FROM
-- 	score
-- 	LEFT JOIN student ON student.sid = score.student_id 
-- WHERE
-- 	number < 60;
-- 
-- 11、查询没有学全所有课的同学的学号、姓名;
-- SELECT
-- 	sid,
-- 	sname 
-- FROM
-- 	student 
-- WHERE
-- 	sid IN ( SELECT student_id FROM score GROUP BY student_id HAVING count( 1 ) < ( SELECT count( cid ) FROM course ) )
-- 
-- 12、查询至少有一门课与学号为“001”的同学所学相同的同学的学号和姓名;
-- SELECT
-- 	student.sid,
-- 	sname 
-- FROM
-- 	score
-- 	LEFT JOIN student ON score.student_id = student.sid 
-- WHERE
-- 	corse_id IN ( SELECT corse_id FROM score WHERE student_id =1 ) 
-- GROUP BY
-- 	student.sid
-- 
-- 13、查询至少学过学号为“001”同学所选课程中任意一门课的其他同学学号和姓名;
-- SELECT
-- 	student.sid,
-- 	sname 
-- FROM
-- 	score
-- 	LEFT JOIN student ON score.student_id = student.sid 
-- WHERE
-- 	corse_id IN ( SELECT corse_id FROM score WHERE student_id =1 ) 
-- GROUP BY
-- 	student.sid
-- 
-- 14、查询和“002”号的同学学习的课程完全相同的其他同学学号和姓名;
-- SELECT
-- student.sid,
-- student.sname 
-- FROM
-- 	score
-- 	LEFT JOIN student ON score.student_id = student.sid 
-- GROUP BY
-- 	sid 
-- HAVING
-- 	count( corse_id ) = ( SELECT count( corse_id ) FROM score WHERE student_id = 2 ) 
-- 
-- 15、删除学习“叶平”老师课的SC表记录;
-- DELETE 
-- FROM
-- 	score 
-- WHERE
-- 	corse_id IN ( SELECT cid FROM course LEFT JOIN teacher ON course.tearch_id = teacher.tid WHERE tname = "李和" )
-- 
-- 16、向SC表中插入一些记录,这些记录要求符合以下条件:①没有上过编号“002”课程的同学学号;②插入“002”号课程的平均成绩;
-- INSERT INTO db1.score ( student_id, corse_id, number ) ( SELECT student_id, 2, ( SELECT avg( number ) FROM score WHERE corse_id = 2 ) FROM score GROUP BY student_id );
-- 
-- 17、按平均成绩从低到高显示所有学生的“语文”、“数学”、“英语”三门的课程成绩,按如下形式显示: 学生ID,语文,数学,英语,有效课程数,有效平均分;
-- SELECT
-- 	student_id,
-- 	( SELECT number FROM score AS B WHERE B.student_id = A.student_id AND corse_id = 1 ) AS 生物,
-- 	( SELECT number FROM score AS B WHERE B.student_id = A.student_id AND corse_id = 2 ) AS 体育,
-- 	( SELECT number FROM score AS B WHERE B.student_id = A.student_id AND corse_id = 3 ) AS 物理,
-- 	count( corse_id ),
-- 	avg( number ) 
-- FROM
-- 	score AS A 
-- GROUP BY
-- 	student_id 
-- ORDER BY
-- 	avg( number ) ASC;
-- 
-- 18、查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分;
-- SELECT
-- 	corse_id,
-- 	max( number ),
-- 	min( number ) 
-- FROM
-- 	score 
-- GROUP BY
-- 	corse_id
-- 
-- 19、按各科平均成绩从低到高和及格率的百分数从高到低顺序;
-- SELECT
-- 	corse_id,
-- 	avg( number ),
-- 	sum( CASE WHEN number > 60 THEN 0 ELSE 1 END ) AS A,
-- 	sum( 1 ),
-- 	sum( CASE WHEN number > 60 THEN 0 ELSE 1 END ) / sum( 1 ) AS cj 
-- FROM
-- 	score 
-- GROUP BY
-- 	corse_id 
-- ORDER BY
-- 	avg( number ) ASC,
-- 	cj DESCs
-- 
-- 20、课程平均分从高到低显示(现实任课老师);
-- SELECT
-- 	avg( IF ( isnull( score.number ), 0, score.number ) ),
-- 	teacher.tname 
-- FROM
-- 	score
-- 	LEFT JOIN course ON score.corse_id = course.cid
-- 	LEFT JOIN teacher ON course.tearch_id = tid 
-- GROUP BY
-- 	score.corse_id;
-- 
-- 21、查询各科成绩前三名的记录:(不考虑成绩并列情况) 
-- SELECT
-- 	* 
-- FROM
-- 	(
-- 	SELECT
-- 		student_id,corse_id,number,
-- 		( SELECT number FROM score AS s1 WHERE s1.corse_id = s2.corse_id group by s1.number ORDER BY s1.number DESC LIMIT 0, 1 ),
-- 		( SELECT number FROM score AS s1 WHERE s1.corse_id = s2.corse_id group by s1.number ORDER BY s1.number DESC LIMIT 2, 1 ) AS ss 
-- 	FROM score AS s2 ) AS B WHERE B.number > B.ss
-- 
-- 22、查询每门课程被选修的学生数;
-- SELECT
-- 	cname,
-- 	count( student_id ) 
-- FROM
-- 	score
-- 	LEFT JOIN course ON score.corse_id = course.cid 
-- GROUP BY
-- 	cname
-- 
-- 23、查询出只选修了一门课程的全部学生的学号和姓名;
-- SELECT
-- 	student.sid,
-- 	sname,
-- 	count( corse_id ) 
-- FROM
-- 	score
-- 	LEFT JOIN student ON score.student_id = student.sid 
-- GROUP BY
-- 	student.sid 
-- HAVING
-- 	count( corse_id ) =1
-- 
-- 24、查询男生、女生的人数;
-- SELECT
-- 	gender,
-- 	count( gender ) 
-- FROM
-- 	student 
-- GROUP BY
-- 	gender
-- 
-- 25、查询姓“张”的学生名单;
-- SELECT
-- 	* 
-- FROM
-- 	student 
-- WHERE
-- 	sname LIKE "张%"
-- 
-- 26、查询同名同姓学生名单,并统计同名人数;
-- SELECT
-- 	sname,
-- 	count( sname ) 
-- FROM
-- 	student 
-- GROUP BY
-- 	sname
-- 
-- 27、查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列;
-- SELECT
-- 	cid,
-- 	course.cname,
-- 	avg( number ) 
-- FROM
-- 	score
-- 	LEFT JOIN course ON score.corse_id = course.cid 
-- GROUP BY
-- 	corse_id 
-- ORDER BY
-- 	avg( number ) ASC,course_id desc;
-- 
-- 28、查询平均成绩大于85的所有学生的学号、姓名和平均成绩;
-- SELECT
-- 	student.sid,
-- 	sname,
-- 	sum( number ) 
-- FROM
-- 	score
-- 	LEFT JOIN student ON score.student_id = student.sid 
-- GROUP BY
-- 	student.sid 
-- HAVING
-- 	sum( number ) > 85
-- 
-- 29、查询课程名称为“数学”,且分数低于60的学生姓名和分数;
-- SELECT
-- 	student_id,sname,number 
-- FROM
-- 	course
-- 	LEFT JOIN SCORE ON corse_id = course.cid
-- 	LEFT JOIN student ON student.sid = SCORE.student_id 
-- WHERE
-- 	number <= 60 AND cname = "生物"
-- 
-- 30、查询课程编号为003且课程成绩在80分以上的学生的学号和姓名;
--  SELECT
-- 		student.sid,student.sname
-- 	FROM
-- 		score
-- 		LEFT JOIN student ON score.student_id = student.sid 
-- 	WHERE
-- 		number > 80 AND CORSE_ID = 3 
-- 
-- 31、求选了课程的学生人数
-- SELECT
-- 	sum( IF ( isnull( corse_id ), 0, 1 ) ) AS 人数 
-- FROM
-- 	score
-- 
-- 32、查询选修“杨艳”老师所授课程的学生中,成绩最高的学生姓名及其成绩;
-- SELECT
-- 	sname,
-- 	number 
-- FROM
-- 	score
-- 	LEFT JOIN student ON score.student_id = student.sid 
-- WHERE
-- 	corse_id IN ( SELECT cid FROM course LEFT JOIN teacher ON course.tearch_id = teacher.tid WHERE teacher.tname = "李和" ) 
-- ORDER BY
-- 	number DESC 
-- 	LIMIT 0,1
-- 
-- 33、查询各个课程及相应的选修人数;
-- SELECT
-- 	course.cname,
-- 	count( score.corse_id ) 
-- FROM
-- 	score
-- 	LEFT JOIN course ON score.corse_id = course.cid 
-- GROUP BY
-- 	course.cname
-- 
-- 34、查询不同课程但成绩相同的学生的学号、课程号、学生成绩;
-- SELECT
-- 	a1.student_id,a1.corse_id,a2.number 
-- FROM
-- 	score AS a1,score AS a2 
-- WHERE
-- 	a1.sid != a2.sid AND a1.corse_id != a2.corse_id and a1.number = a2.number
-- 
-- 35、查询每门课程成绩最好的前两名;
-- SELECT
-- 	* 
-- FROM
-- 	(
-- 	SELECT
-- 		student_id,
-- 		corse_id,
-- 		number,
-- 		( SELECT number FROM score AS b WHERE b.corse_id = a.corse_id ORDER BY number DESC LIMIT 2, 1 ) AS cc 
-- 	FROM
-- 		score AS a 
-- 	) AS A 
-- WHERE
-- 	A.number > A.cc
-- 
-- 36、检索至少选修两门课程的学生学号;
-- SELECT
-- 	student_id 
-- FROM
-- 	score 
-- GROUP BY
-- 	student_id 
-- HAVING
-- 	count(corse_id) >=2
-- 
-- 
-- 37、查询全部学生都选修的课程的课程号和课程名;
-- SELECT
-- 	corse_id,
-- 	cname 
-- FROM
-- 	SCORE
-- 	LEFT JOIN course ON score.corse_id = course.cid 
-- GROUP BY
-- 	corse_id 
-- HAVING
-- 	( SELECT sid FROM student ORDER BY sid DESC LIMIT 0, 1 ) <= count( corse_id )
-- 
-- 38、查询没学过“叶平”老师讲授的任一门课程的学生姓名;
-- SELECT
-- 	sname 
-- FROM
-- 	student 
-- WHERE
-- 	sname NOT IN (
-- 	SELECT
-- 		student.sname 
-- 	FROM
-- 		score
-- 		LEFT JOIN student ON score.student_id = student.sid 
-- 	WHERE
-- 		corse_id IN ( SELECT cid FROM teacher LEFT JOIN course ON teacher.tid = course.tearch_id WHERE tname = "李和" ) 
-- 	GROUP BY
-- 	student.sid 
-- 	)
-- 17.33 1451964253
-- 39、查询两门以上不及格课程的同学的学号及其平均成绩;
-- select student_id,sum((if (number>60,0,1))) as 不及格 from score group by student_id having 不及格>=2
-- 
-- 40、检索“004”课程分数小于60,按分数降序排列的同学学号;
-- select student_id from score where corse_id = 3 and number < 60 order by number desc
-- 
-- 41、删除“002”同学的“001”课程的成绩;
--  delete from score where student_id = 2 and corse_id = 1; 

# distinct 有去重复的效果 (效率不高能不用就不用)

MySQL Advanced

pymysql

  1. python模块:对数据库进行操作(sql语句)

  2. pip3 install pymysql -i https://pypi.douban.com/simple

  3. 打开和关闭

    import pymysql   
    
    user = input ("username:")
    pwd = input ("password:")
    													# 链接mysql
    conn = pymysql.connect(host="localhost",   			# host是链接的服务器名称
                           user="root",	  				# 账号
                           password="1451964253",		# 密码
                           database="db1")				# 数据库名称
    													# 游标就是你要用来操作的手,有他帮你完成,你的做的事情
    cursor = conn.cursor()								# 创建游标
    sql = "select* from userinfo where name='%s' and password='%s'" %(user,pwd)
    cursor.execute(sql)    								# cursor.execute()这里面是写mysql代码的
    result = cursor.fetchone()    						# 拿到一条数据,储存到result
    cursor.close()    									# 关闭游标
    conn.close()    									# 关闭链接
    if result:
        print("登录成功")
    else:
        print("登录失败")
  4. 防止mysql注入

    # 注入方式 
    # 它们会用注释法注入例如
    # alex' or 1=1 -- 这个命令会把name后面的给注释掉就只用输入用户名登录
    sql = "select* from userinfo where name='%s' and password='%s'" %(user,pwd) 
    cursor.execute(sql)    								# cursor.execute()这里面是写mysql代码的
    # 预防
    sql = "select* from userinfo where name=%s and password=%s" 
    cursor.execute(sql,user,pwd)  						# 防止注入mysql模块可以直接写用户名和密码
    # 列表
    sql = "select* from userinfo where name=%s and password=%s" 
    cursor.execute(sql,[user,pwd])  					# 可以放列表
    # 字典
    sql = "select* from userinfo where name=%(u)s and password=%(p)s"  #u和p是键
    cursor.execute(sql,{u:user,p:pwd})  				# 可以放列表
  5. 插入要加的命令

    user = liyonghao 
    pwd = 222
    conn = pymysql.connect(host="localhost",   
    user="root",password="1451964253",
    database="db1")	
    cursor = conn.cursor()	
    sql = "insert into userinfo(user,password) values('%s','%s')" 
    cursor.execute(sql,name,pwd) 
    conn.commit()  										# 进行提交如果没有就无法最表做操作
    # result = cursor.fetchone()只有在查的时候用  
    cursor.close()    									# 关闭游标
    conn.close()    									# 关闭链接
  6. 批量插入

    conn = pymysql.connect(host="localhost",   
    user="root",password="1451964253",
    database="db1")	
    cursor = conn.cursor()	
    sql = "insert into userinfo(user,password) values('%s','%s')"
    # 命令返回给r,r就代表受影响的行数,现在受影响的行数为二
    r = cursor.executemany(sql,[('nihao','ss'),('tahao','33')])
    # 只要在列表中包含元祖再把命令改成executemany就可以了
    conn.commit()  										# 进行提交如果没有就无法修改
    # result = cursor.fetchone()只有在查的时候用  
    cursor.close()
    conn.close()
  7. 查的操作

    user = input ("username:")
    pwd = input ("password:")
    conn = pymysql.connect(host="localhost",user="root",    password="1451964253",database="db1")
    cursor = conn.cursor()	
    # cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)  他默认是等于null的,在括号中加上这条命令就可以,以字典的方式显示	
    sql = "select* from userinfo where name='%s' and password='%s'" %(user,pwd)
    cursor.execute(sql)   
    # cursor.scroll(1,mode="relative")
    # 相对当前位置移动,再当前位置移动一位
    # cursor.scroll(2,mode="absolute")
    # 相对绝对位置移动,直接移动到第二条的位置
    result = cursor.fetchone()    
    # result = cursor.fetchmany(2)
    # 以指定为数去取指定的几条记录
    # result = cursor.fetchall()
    # 拿到所有记录
    # 默认拿到的是元祖
    cursor.close()  
    conn.close()  
  8. 新插入数据的自增id

    user = liyonghao 
    pwd = 222
    conn = pymysql.connect(host="localhost",   
    user="root",password="1451964253",
    database="db1")	
    cursor = conn.cursor()	
    sql = "insert into userinfo(user,password) values('%s','%s')" 
    cursor.execute(sql,name,pwd) 
    print(cursor.lastrowid)# 那到你插入了数据的自增的id,插入多条数据只能拿到最后一条数据id
    conn.commit()  
    cursor.close() 
    conn.close() 
  9. 练习(mysql)

    -- create database db2 default charset utf8;
    -- use db2
    -- CREATE TABLE competence ( 
    -- cid BIGINT auto_increment PRIMARY KEY,
    -- cname VARCHAR ( 20 ) ) engine=innodb 
    -- DEFAULT charset = utf8;
    -- constraint fk_course_teacher foreign key (tearch_id) references teacher(tid)
    -- insert into competence(cname) values("订单管理"),("用户管理"),("菜单管理"),("权限分配"),("Bug管理");
    -- CREATE TABLE usertable( 
    -- uid BIGINT auto_increment PRIMARY KEY,
    -- username VARCHAR ( 10 ),
    -- competence_id bigint 
    -- ) engine=innodb 
    -- DEFAULT charset = utf8;
    -- CREATE TABLE competenceuser( 
    -- cuid BIGINT auto_increment PRIMARY KEY,
    -- user_id bigint,
    -- constraint competence_user1 foreign key (user_id) references usertable(uid),
    -- competence_id bigint,
    -- constraint competence_user2 foreign key (competence_id) references competence(cid)
    -- ) engine=innodb 
    -- DEFAULT charset = utf8;
    -- insert into usertable(username,passwordn) values ("1451964253",123456),("1536945995",12345),("18993538183",1234),("xiaogan",123),("xiaoming ",12);
    -- insert into competenceuser(user_id,competence_id) values (1,1),(1,2),(2,1),(4,5),(2,2),(2,5),(3,1),(2,2),(2,3)
  10. mysql(python)

    import pymysql   
    
    user = input ("username:")
    pwd = input ("password:")
    conn = pymysql.connect(host="localhost",user="root",password="1451964253",database="db2")
    cursor = conn.cursor()
    
    def mysqlfunction (sql,*arge):
        cursor.execute(sql,[*arge])
        return cursor.fetchall()
    
    sql = "select uid from usertable where username=%s and passwordn=%s"
    result = mysqlfunction(sql,user,pwd)
    if result:
        print("登录成功")
        sql = "select competence.cname from competenceuser left join competence on competenceuser.competence_id = competence.cid where user_id=%s"
        competence= [i[0] for i in mysqlfunction(sql,result)]
        print("%s用户的所有权限:%s"%(user,",".join(competence)))
    else:
        print("登录失败")
        
    cursor.close()   
    conn.close()
  11. 再补

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    import pymysql
      
    # 创建连接
    conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', db='t1')
    # 创建游标
    cursor = conn.cursor()
      
    # 执行SQL,并返回收影响行数
    effect_row = cursor.execute("update hosts set host = '1.1.1.2'")
      
    # 执行SQL,并返回受影响行数
    #effect_row = cursor.execute("update hosts set host = '1.1.1.2' where nid > %s", (1,))
      
    # 执行SQL,并返回受影响行数
    #effect_row = cursor.executemany("insert into hosts(host,color_id)values(%s,%s)", [("1.1.1.11",1),("1.1.1.11",2)])
      
      
    # 提交,不然无法保存新建或者修改的数据
    conn.commit()
      
    # 关闭游标
    cursor.close()
    # 关闭连接
    conn.close()
    # 获取最新自增ID
    new_id = cursor.lastrowid
    注:在fetch数据时按照顺序进行,可以使用cursor.scroll(num,mode)来移动游标位置,如:
    
    cursor.scroll(1,mode='relative')  # 相对当前位置移动
    cursor.scroll(2,mode='absolute') # 相对绝对位置移动

视图和触发器

  1. 视图是一张物理表的映射,它只存在于内存,他无法自己修个数据,必须在屋里表中修个

    create view "name" as sql "command";						# 创建
    alter view "name" as sql "command";							# 修改
    drop view "name";											# 删除
    
    create view v1 as select * from coret where sid > 10;		# 示例
  2. 触发器

    # 创建
    # 创建触发器before insert插入之前做操作,ROM each row 你在tb1插一条数据就会执行一次下面的语句组
    create trigger 触发器名称 before insert on tb1 ROM each row				
    begin
    	。。。。
    end
    # 创建触发器,before insert插入之后做操作,ROM each row 你在tb1插一条数据就会执行一次下面的语句组
    create trigger 触发器名称 after insert on tb1 ROM each row				
    begin
    	。。。。
    end
    # before insert bi fou | ying se te    插入前
    # after insert a fu te | ying se te    插入后
    # before delete bi fou|di lei te       删除前
    # after delete a fu te | di lei te     删除后
    # berore update bi fou | a buo dei te  更新前
    # after update a fu te | a buo dei te  更新后
    
    
    # 修改终止符
    delimiter <符号>     											# 你要修改的符号
    delimiter //
    
    # 删除触发器
    drop trigger 触发器名称;
    
    # 获得数据
    nen															# 获得新数据,比如插入一条数据,nen.xx得到插入的某一个列值。
    old															# 获得老数据,比如你要删除一条数据加上old就可以得到你要删的那行数据的某个值。用法一样
    # 示例
    create trigger t1 before insert on xx for each row
    begin 
      insert into teacher(tname) values (new.name)
    end

函数

  1. 使用函数select "function"

  2. 内置函数

    CHAR_LENGTH(str)   #计算字符串的长度,CHAR_LENGTH()返回值为5
    LENGTH()    #对于一个包含五个二字节字符集, 返回值为 10, 
    CONCAT(str1,str2,...)#字符串拼接,参数中有null就返回null。
        CONCAT_WS(separator,str1,str2,...)
            字符串拼接(自定义连接符)
            CONCAT_WS()不会忽略任何空字符串。 (然而会忽略所有的 NULL)。
    
        CONV(N,from_base,to_base)
            进制转换
            例如:
                SELECT CONV('a',16,2); 表示将 a 由16进制转换为2进制字符串表示
    
        FORMAT(X,D)
            将数字X 的格式写为'#,###,###.##',以四舍五入的方式保留小数点后 D 位, 并将结果以字符串的形式返回。若  D 为 0, 则返回结果不带有小数点,或不含小数部分。
            例如:
                SELECT FORMAT(12332.1,4); 结果为: '12,332.1000'
        INSERT(str,pos,len,newstr)
            在str的指定位置插入字符串
                pos:要替换位置其实位置
                len:替换的长度
                newstr:新字符串
            特别的:
                如果pos超过原字符串长度,则返回原字符串
                如果len超过原字符串长度,则由新字符串完全替换
        INSTR(str,substr)
            返回字符串 str 中子字符串的第一个出现位置。
    
        LEFT(str,len)
            返回字符串str 从开始的len位置的子序列字符。
    
        LOWER(str)
            变小写
    
        UPPER(str)
            变大写
    
        LTRIM(str)
            返回字符串 str ,其引导空格字符被删除。
        RTRIM(str)
            返回字符串 str ,结尾空格字符被删去。
        SUBSTRING(str,pos,len)
            获取字符串子序列
    
        LOCATE(substr,str,pos)
            获取子序列索引位置
    
        REPEAT(str,count)
            返回一个由重复的字符串str 组成的字符串,字符串str的数目等于count 。
            若 count <= 0,则返回一个空字符串。
            若str 或 count 为 NULL,则返回 NULL 。
        REPLACE(str,from_str,to_str)
            返回字符串str 以及所有被字符串to_str替代的字符串from_str 。
        REVERSE(str)
            返回字符串 str ,顺序和字符顺序相反。
        RIGHT(str,len)
            从字符串str 开始,返回从后边开始len个字符组成的子序列
    
        SPACE(N)
            返回一个由N空格组成的字符串。
    
        SUBSTRING(str,pos) , SUBSTRING(str FROM pos) SUBSTRING(str,pos,len) , SUBSTRING(str FROM pos FOR len)
            不带有len 参数的格式从字符串str返回一个子字符串,起始于位置 pos。带有len参数的格式从字符串str返回一个长度同len字符相同的子字符串,起始于位置 pos。 使用 FROM的格式为标准 SQL 语法。也可能对pos使用一个负值。假若这样,则子字符串的位置起始于字符串结尾的pos 字符,而不是字符串的开头位置。在以下格式的函数中可以对pos 使用一个负值。
    
            mysql> SELECT SUBSTRING('Quadratically',5);
                -> 'ratically'
    
            mysql> SELECT SUBSTRING('foobarbar' FROM 4);
                -> 'barbar'
    
            mysql> SELECT SUBSTRING('Quadratically',5,6);
                -> 'ratica'
    
            mysql> SELECT SUBSTRING('Sakila', -3);
                -> 'ila'
    
            mysql> SELECT SUBSTRING('Sakila', -5, 3);
                -> 'aki'
    
            mysql> SELECT SUBSTRING('Sakila' FROM -4 FOR 2);
                -> 'ki'
    
        TRIM([{BOTH | LEADING | TRAILING} [remstr] FROM] str) TRIM(remstr FROM] str)
            返回字符串 str , 其中所有remstr 前缀和/或后缀都已被删除。若分类符BOTH、LEADIN或TRAILING中没有一个是给定的,则假设为BOTH 。 remstr 为可选项,在未指定情况下,可删除空格。
    
            mysql> SELECT TRIM('  bar   ');
                    -> 'bar'
    
            mysql> SELECT TRIM(LEADING 'x' FROM 'xxxbarxxx');
                    -> 'barxxx'
    
            mysql> SELECT TRIM(BOTH 'x' FROM 'xxxbarxxx');
                    -> 'bar'
    
            mysql> SELECT TRIM(TRAILING 'xyz' FROM 'barxxyz');
                    -> 'barx'
    
    部分内置函数
    DATE_FORMAT(段名,"%Y")    #时间格式化,取想要的值
  3. 自定义函数

    delimiter \\				 					# 定义终止程序符号为\\
    create function f1(			  					# 定义函数传两个值都是数值型
    	i1 int,
    	i2 int)
    returns int					 					# 定义返回值为数值型
    begin						 					# 开始执行体
    	declare num int default 0; 					# 定义变量为数值型初始值为0
    	set num = i1 + i2;		  					# 给变量赋值
    	return(num);			  					# 返回变量
    end \\						 					# 结束定义的执行体
    delimiter ;					 					# 定义终止程序符号为;
    # 警告:函数中不能写select * from tb;
    
    drop function "func_name";						# 删除函数

储存过程

  1. 过程文件就是在mysql上的一个别名 => 一坨sql代码,用于替代程序员写sql语句。

  2. 创建过程

    delimiter //
    create procedure p1()
    begin
    	select * from student;
    	insert into teacher(tname) values("ct");
    end //
    delimiter ;
    
    call 过程名();									# mysql里面
  3. pymysql里面调用

    conn = pymysql.connect(host="localhost",user="root",password="1451964253",database="db1",charset="utf8") # 在这里需要加上charset="utf8",不然中文显示不了 
    cursor = conn.cursor()  
    cursor.callproc("p1")    # 如果要调用存储过程的话,就要加上callproc(xx)
    idconn.commit()  
    cursor.close() 
    conn.close() 
  4. 传参

    #传参数的存储过程,定义参数必须要加(in,out,inout)
    in  ying    #传入
    create procedure p3(
    	in n1 int,
        in n2 int
    )
    begin 
    	select * from student where sid>n1;
    end
    
    call p3(12,3)
    cursor.callproc("p3",(12,2))
    ###############################
    out ao te    #传出 内部的一个值传到外部,内部也可以用
    
    create procedure p3(
    	in n1 int,
        out n2 int
    )
    begin 
    	set n2 = 1234123;
    	select * from student where sid>n1;
    end
    set @v1 = 0;    #就和Python中的全局变量一样
    call p3(12,@v1)
    ########################################
    #pymysql
    conn = pymysql.connect(host="localhost",user="root",password="1451964253",database="db1",charset="utf8") 
    cursor = conn.cursor()  
    cursor.callproc("p3",(12,2))    #
    result = cursor.fetchall()
    print(result)
    
    cursor.execute("select @_p3_0,@_p3_1")    #@_p3_0代表第一个参数,@_p3_1代表第二个
    result1 = cursor.fetchall()
    print(result1)
    cursor.close() 
    conn.close() 
    ##################################
    #可以外传也可以传入
    inout ying ao te
  5. 为什么有结果集又有out伪造的返回值?uot用于标识存储过程的执行结果

  6. 事务

    delimiter \\
        create PROCEDURE p1(
            OUT p_return_code tinyint
        )
        BEGIN 
            DECLARE exit handler for sqlexception  #出现异常自动执行这块代码
            BEGIN 
                -- ERROR 
                set p_return_code = 1; 
                rollback;     #ru bai ke 会到原始状态
            END; 
                            
            DECLARE exit handler for sqlwarning 
            BEGIN 
                -- WARNING 
                set p_return_code = 2; 
                rollback; 
            END; 
                             
            START TRANSACTION;     #si da te|chuan si kei sheng 开始事务
                 DELETE from tb1;
                 insert into tb2(name)values('seven');
            COMMIT;     #kan mi te 提交
                             
            -- SUCCESS     sai te 
            set p_return_code = 0; 
                             
            END\\
    delimiter ;
  7. 游标

    delimiter //
    create procedure p6()
    begin
    #定义声明
    	declare row_id int;   
    	declare row_num int;
    	declare done int default FALSE;#done=false
    	#my_cursor=游标
    	declare temp int;
    	declare my_cursor cursor for select id,num from student;
        #判断表没有织的时候,这样写游标自动判断是否有数据。
    	declare continue handler for not found set done = TRUE;   
    	open my_cursor;    #打开游标
    		xxoo:loop    #开始循环
    			#获取my_cursor中的一条数据赋给变量
    			fetch my_cursor into row_id,row_num;
    			if done then   #如果done = then
    				leave xxoo;    #跳出循环
    			end if;
    			set temp = row_id + row_num;
    			insert into teacher(num) values(temp);
    		end loop xxoo;    #结束循环
    	close my_cursor;    #关闭游标
    end //
    delimiter ;
    
    call p6();
  8. 动态执行sql(防sql注入)

    delimiter //
    create procedure p7 (
    	in nid int 
    )
    begin
    	#1.预检测某个东西sql语句合法性
    	#2.sql = 格式化 tpl + arg
    	#3.执行sql语句
    	set @nid = nid;
    	prepare prod from "select * from student where id>?"; #pu rui pei er 准备 
    	execute prod using @nid;
    	#yi kei you te 执行,you rei,@arg 替换?号,这里的arg不能直接加,需要重新的以才能加
    	deallocate prepare prod;
    	#dai ao lao kei te ,pu rui pai,执行sql语句
    end //
    delimiter ;

索引

  1. 链接别人的mysqlamysql -u root -h 10.10.100.3 -p

  2. 作用:约束、加速查找。

  3. 索引

    1. 普通索引:加速查找

    2. 主键索引:加速查找、不能为空、不能重复

    3. 唯一索引:加速查找、不能重复

    4. 联合索引(多列):联合主键索引、联合唯一索引、联合普通索引

  4. hash索引

    1. hash索引是建立一个索引表,把数据转化成指定的个是储存,后面加上硬盘地址,hash保存是没有顺序的。你查文件时它会把硬盘地址直接给你。范围查找速度会慢

  5. btree索引

    1. btree是以中值分为金字塔排的,小于中值左边,大于中值右边,依次往下排。

    2. 例如:100*2=50,小于50左,大于50右。50 *2=25,小于25左,大于25右。

    3. 寻找次数 2**10,寻找次数10次

  6. 建立索引

    1. 额外的文件保存特殊的数据结构

索引使用

1.普通索引

  1. 普通索引仅有一个功能:加速查询

  2. 创建表 + 索引

    create table in1(
        nid int not null auto_increment primary key,
        name varchar(32) not null,
        email varchar(64) not null,
        extra text,
        index ix_name (name)
    )
  3. 使用

    create index "name" on "table_name(field)"							# 创建索引
    drop index "name" on "table_name"									# 删除索引
    show index from "table_name";										# 查看索引
    create index ix_extra on in1(extra(32));							
  4. 注意:对于创建索引时如果是blob和text 类型,必须指定length

2.唯一索引

  1. 唯一索引有两个功能:加速查找 和 唯一约束(可含null)

  2. 创建表 + 唯一索引

    create table in1(
        nid int not null auto_increment primary key,
        name varchar(32) not null,
        email varchar(64) not null,
        extra text,
        unique ix_name (name)
    )
  3. 使用

    create unique index "name" on "table_name(field)"					# 创建索引
    drop unique index "name" on "table_name"							# 删除索引						

3.组合索引

  1. 组合索引是将n个列组合成一个索引,其应用场景为:频繁的同时使用n列来进行查询。例如:where n2 = "alex" and n3 = 666。

  2. 创建表

    create table in3(
        nid int not null auto_increment primary key,
        name varchar(32) not null,
        email varchar(64) not null,
        extra text
    )
  3. 使用

    create index "name" on "table_name(field,field)"					# 创建索引
    drop index "name" on "table_name"									# 删除索引						
  4. 注意:对于同时搜索n个条件时,组合索引的性能好与多个单一索引合并。

  5. 组合索引遵循最左前缀匹配

    create index ix_name_email on wserinfo3(name,email,ex)
    select * from userinfo3 where name="alex" 
    select * from userinfo3 where name="alex"and email="a" 
    select * from userinfo3 where email="xxx"
    # 1和2可以三不可以,因为三没有遵循最左前缀匹配,最左前缀是name开头,name没有开头就不行
  6. 索引合并没有组合索引效率高

  7. 索引组合是把有索引的数据行组合进行索引

4.主键索引

  1. 创建表+创建主键

    create table in1(
        nid int not null auto_increment primary key,
        name varchar(32) not null,
        email varchar(64) not null,
        extra text,
        index ix_name (name)
    )
    
    OR
    
    create table in1(
        nid int not null auto_increment,
        name varchar(32) not null,
        email varchar(64) not null,
        extra text,
        primary key(ni1),
        index ix_name (name)
    )
  2. 使用

    alter table "tableName" add primary key(field);						# 创建主键
    alter table "tableName" drop primary key;							# 删除主键
    alter table "tableName"  modify "field" int, drop primary key;

5.覆盖索引

  1. 名词:不是真实的索引

  2. 覆盖索引就是创建一个email索引,显示时只显示email它就不会去数据表里找,在索引文件中直接获取数据select email from tb1 where email = "alex@qq.com111"

6.索引合并

  1. 名词:不存在,把多个单列索引合并使用select * from tb1 where a1 = "1" and a2 = "2"

正确使用索引

  • 数据库表中添加索引后确实会让查询速度起飞,但前提必须是正确的使用索引来查询,如果以错误的方式使用,则即使建立索引也会不奏效。 即使建立索引,索引也不会生效:

    like '%xx'
        select * from tb1 where name like '%cn';
     使用函数
        select * from tb1 where reverse(name) = 'wupeiqi';
     or
        select * from tb1 where nid = 1 or email = 'seven@live.com';
        特别的:当or条件中有未建立索引的列才失效,以下会走索引
                select * from tb1 where nid = 1 or name = 'seven';
                select * from tb1 where nid = 1 or email = 'seven@live.com' and name = 'alex'
     类型不一致
        如果列是字符串类型,传入条件是必须用引号引起来,不然...
        select * from tb1 where name = 999;
     !=
        select * from tb1 where name != 'alex'
        特别的:如果是主键,则还是会走索引
            select * from tb1 where nid != 123
     >
        select * from tb1 where name > 'alex'
        特别的:如果是主键或索引是整数类型,则还是会走索引
            select * from tb1 where nid > 123
            select * from tb1 where num > 123
     order by
        select email from tb1 order by name desc;
        当根据索引排序时候,选择的映射如果不是索引,则不走索引
        特别的:如果对主键排序,则还是走索引:
            select * from tb1 order by nid desc;
     
     组合索引最左前缀
        如果组合索引为:(name,email)
        name and email       -- 使用索引
        name                 -- 使用索引
        email                -- 不使用索引

其他注意事项

避免使用select *
count(1)或count(列) 代替 count(*)
创建表时尽量时 char 代替 varchar
表的字段顺序固定长度的字段优先
组合索引代替多个单列索引(经常使用多个条件查询时)
尽量使用短索引
使用连接(JOIN)来代替子查询(Sub-Queries)
连表时注意条件类型需一致
索引散列值(重复少)不适合建索引,例:性别不适合

其他

条件语句

delimiter \\
CREATE PROCEDURE proc_if ()
BEGIN
    
    declare i int default 0;
    if i = 1 THEN
        SELECT 1;
    ELSEIF i = 2 THEN
        SELECT 2;
    ELSE
        SELECT 7;
    END IF;

END\\
delimiter ;

循环语句

  1. while循环

    delimiter \\
    CREATE PROCEDURE proc_while ()
    BEGIN
    
        DECLARE num INT ;
        SET num = 0 ;
        WHILE num < 10 DO
            SELECT
                num ;
            SET num = num + 1 ;
        END WHILE ;
    
    END\\
    delimiter ;
  2. repeat循环

    delimiter \\
    CREATE PROCEDURE proc_repeat ()
    BEGIN
    
        DECLARE i INT ;
        SET i = 0 ;
        repeat
            select i;
            set i = i + 1;
            until i >= 5
        end repeat;
    
    END\\
    delimiter ;
  3. loop

    BEGIN
        
        declare i int default 0;
        loop_label: loop
            
            set i=i+1;
            if i<8 then
                iterate loop_label;
            end if;
            if i>=10 then
                leave loop_label;
            end if;
            select i;
        end loop loop_label;
    
    END

动态执行sql语句

delimiter \\
DROP PROCEDURE IF EXISTS proc_sql \\
CREATE PROCEDURE proc_sql ()
BEGIN
    declare p1 int;
    set p1 = 11;
    set @p1 = p1;

    PREPARE prod FROM 'select * from tb2 where nid > ?';
    EXECUTE prod USING @p1;
    DEALLOCATE prepare prod; 

END\\
delimiter ;

时间

  1. 大概判断一条sql命令所需的时间,创建预测,explain mysql命令。

  2. type = all 是全表扫描,id不是唯一表示,只是代指这个表,type = ref是走了索引的

    id
    查询顺序标识
    如:mysql> explain select * from (select nid,name from tb1 where nid < 10) as B;
        +----+-------------+------------+-------+---------------+---------+---------+------+------+-------------+
        | id | select_type | table      | type  | possible_keys | key     | key_len | ref  | rows | Extra       |
        +----+-------------+------------+-------+---------------+---------+---------+------+------+-------------+
        |  1 | PRIMARY     | <derived2> | ALL   | NULL          | NULL    | NULL    | NULL |    9 | NULL        |
        |  2 | DERIVED     | tb1        | range | PRIMARY       | PRIMARY | 8       | NULL |    9 | Using where |
        +----+-------------+------------+-------+---------------+---------+---------+------+------+-------------+
    特别的:如果使用union连接气值可能为null
    
    select_type
    查询类型
        SIMPLE          简单查询
        PRIMARY         最外层查询
        SUBQUERY        映射为子查询
        DERIVED         子查询
        UNION           联合
        UNION RESULT    使用联合的结果
    
    table
    	正在访问的表名
  3. type

      type
          查询时的访问方式,性能:all < index < range < index_merge < ref_or_null < ref < eq_ref < system/const
              ALL             全表扫描,对于数据表从头到尾找一遍
                              select * from tb1;
                              特别的:如果有limit限制,则找到之后就不在继续向下扫描
                                     select * from tb1 where email = 'seven@live.com'
                                     select * from tb1 where email = 'seven@live.com' limit 1;
                                     select * from tb1 where email = 'seven@live.com' limit 1,10;#显示前十条
                                     虽然上述两个语句都会进行全表扫描,第二句使用了limit,则找到一个后就不再继续扫描。
      
              INDEX           全索引扫描,对索引从头到尾找一遍
                              select nid from tb1;
      
              RANGE          对索引列进行范围查找
                              select *  from tb1 where name < 'alex';
                              PS:
                                  between and
                                  in
                                  >   >=  <   <=  操作
                                  注意:!= 和 > 符号
              INDEX_MERGE     合并索引,使用多个单列索引搜索
                              select *  from tb1 where name = 'alex' or nid in (11,22,33);
      
              REF             根据索引查找一个或多个值
                              select *  from tb1 where name = 'seven';
      
              EQ_REF          连接时使用primary key 或 unique类型
                              select tb2.nid,tb1.name from tb2 left join tb1 on tb2.nid = tb1.nid;
              CONST           常量
                              表最多有一个匹配行,因为仅有一行,在这行的列值可被优化器剩余部分认为是常数,const表很快,因为它们只读取一次。
                              select nid from tb1 where nid = 2 ;
      
              SYSTEM          系统
                              表仅有一行(=系统表)。这是const联接类型的一个特例。
                              select * from (select nid from tb1 where nid = 1) as A;
      possible_keys
          可能使用的索引
      
      key
          真实使用的
      
      key_len
          MySQL中使用索引字节长度
      
      rows
          mysql估计为了找到所需的行而要读取的行数 ------ 只是预估值
      
      extra
          该列包含MySQL解决查询的详细信息
          “Using index”
              此值表示mysql将使用覆盖索引,以避免访问表。不要把覆盖索引和index访问类型弄混了。
          “Using where”
              这意味着mysql服务器将在存储引擎检索行后再进行过滤,许多where条件里涉及索引中的列,当(并且如果)它读取索引时,就能被存储引擎检验,因此不是所有带where子句的查询都会显示“Using where”。有时“Using where”的出现就是一个暗示:查询可受益于不同的索引。
          “Using temporary”
              这意味着mysql在对查询结果排序时会使用一个临时表。
          “Using filesort”
              这意味着mysql会对结果使用一个外部索引排序,而不是按索引次序从表里读取行。mysql有两种文件排序算法,这两种排序方式都可以在内存或者磁盘上完成,explain不会告诉你mysql将使用哪一种文件排序,也不会告诉你排序会在内存里还是磁盘上完成。
          “Range checked for each record(index map: N)”
              这个意味着没有好用的索引,新的索引将在联接的每一行上重新估算,N是显示在possible_keys列中索引的位图,并且是冗余的。
  4. 慢日志查询,需要:条件,路径

    # 配置MySQL自动记录慢日志
    
    # 内存中配置
    slow_query_log = OFF|ON										# 是否开启慢日志记录
    long_query_time = 2											# 时间限制,超过此时间,则记录
    slow_query_log_file = /usr/slow.log							# 日志文件
    log_queries_not_using_indexes = OFF							# 为使用索引的搜索是否记录
    
    *注:查看当前配置信息:*
         *show variables like '%query%'*
       *修改当前配置:*
        *set global 变量名 = 值*
    配置文件中配置
    	mysqld --defaults-file="D:my.conf"						# 启动配置文件
    	my.conf内容:						 					  # 配置文件
    		slow_query_log = on
    		slow_query_log_file = D:/...
    #你可以把配置文件放在其他位置需要写这条命令my.ini
    	datadir = 配置文件路径
    	#然后再打开就可以应用这个配置文件了
    	#注意:修改配置文件之后,需要重启服务
    		#现将原本的配置备份,防止修改的配置文件出现问题,修改不回来
  5. 查看MySQL慢日志

    mysqldumpslow -s at -a  /usr/local/var/mysql/MacBook-Pro-3-slow.log
    """
        --verbose 		版本
        --debug   		调试
        --help    		帮助
        -v      		版本
        -d      		调试模式
        -s ORDER   		排序方式
    what to sort by (al, at, ar, c, l, r, t), 'at' is default
    al: average lock time
    ar: average rows sent
    at: average query time
    c: count
    l: lock time
    r: rows sent
    t: query time
        -r      		反转顺序,默认文件倒序拍。reverse the sort order (largest last instead of first)
        -t NUM    		显示前N条just show the top n queries
        -a      		不要将SQL中数字转换成N,字符串转换成S。don't abstract all numbers to N and strings to 'S'
        -n NUM    		abstract numbers with at least n digits within names
        -g PATTERN  	正则匹配;grep: only consider stmts that include this string
        -h HOSTNAME 	mysql机器名或者IP;hostname of db server for *-slow.log filename (can be wildcard),
    default is '*', i.e. match all
        -i NAME   		name of server instance (if using mysql.server startup script)
        -l      		总时间中不减去锁定时间;don't subtract lock time from total time
    """

分页

  1. 方案:

    1. 记录当前页的最大值和最小值id

    2. 往下翻:

      select*from yonghu > 124(得到的最大id) limit 10(往下十条数据)
      在多个页面中翻找如11,往14上找就可以用这个代码
      
      select * from user where id in(
      	select id from (select id from user where id > max_id limit 30 ) as n order by n,id desc limit 10
      )
    3. 往上翻:

      select*from yonghu < 124(得到的最小id) order by id desc(从大到小排序就可以拿到上面的10条数据) limit 10(往下十条数据)
      在多个页面中翻找如11,往14上找就可以用这个代码
      
      select * from user where id in(
      	select id from (select id from user where id < max_id limit 30 ) as n order by n,id desc limit 10
      )
    4. 注意:id不连续,所以无法直接使用id进行范围查找

ORM框架

  1. SQLAlchemy本身无法操作数据库,其必须以来pymsql等第三方插件,Dialect用于和数据API进行交流,根据配置文件的不同调用不同的数据库API,从而实现对数据库的操作pip3 install SQLAlchemy

  2. 作用:提供简单的规则、自动转换成sql语句。

  3. 两类ORM框架

    1. DB first:手动创建数据库以及表然后ORM框架和自动生成类

    2. code first:手动创建类和数据库然后ORM框架和自动生成表

  4. 功能

    1. 创建数据库表:连接数据库(非做的SQLAlchemy,是做的pymysql,mysqldb,)、类转换成sql语句。

    2. 工作流程

      1. SQLAlchemy ORM:Object Relatlonal Mapper(ORM) #可以看作类、类和2.1,2.2配合起来将其转换为sql语句。

      2. SQLAlchemy Core

        1. Schema/types

        2. SQL Expression Language

        3. Engine #引擎(配置文件会给引擎):Connection Pooling #连接池(保持多少个连接)、Diaiect #选择(选择你要连接pymysql,mysqldb......)。

      3. DBAPI 代指连接(pymysql,mysqlDB,SQL,Oracle...)

基本操作

  1. 增(做操作的代表行)

    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index
    from sqlalchemy.orm import sessionmaker, relationship
    from sqlalchemy import create_engine
    
    class UserType(Base):
        __tablename__="usertype"
        id = Column(Integer,primary_key=True,autoincrement=True)
        title = Column(String(32),nullable=True,index=True)
    
    engine = create_engine("mysql+pymysql://root:@127.0.0.1:3306/s4day62db?charset=utf8",max_overflow=5)    #连接mysql数据库
    Session = sessionmaker(bind=engine)    #获取权限
    session=Session()    #获取权限
    #单个添加
    obj1=UserType(title="普通用户")    #在title中添加“普通用户”这个值
    session.add(obj1)	#将其写入
    #多个添加
    objs =[
        UserType(title="超级用户")
        UserType(title="白金用户")
        UserType(title="黑金用户")
    ]
    session.add_all(objs)
    session.commit()    #提交
    session.close()    #关闭
  2. from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index
    from sqlalchemy.orm import sessionmaker, relationship
    from sqlalchemy import create_engine
    
    class UserType(Base):
        __tablename__="usertype"
        id = Column(Integer,primary_key=True,autoincrement=True)
        title = Column(String(32),nullable=True,index=True)
    
    engine = create_engine("mysql+pymysql://root:@127.0.0.1:3306/s4day62db?charset=utf8",max_overflow=5)    #连接mysql数据库
    Session = sessionmaker(bind=engine)    #获取权限
    session=Session()    #获取权限
    user_type_list = session.query(UserType).filter(UserType.id>2).delete()   #查到满足条件的并删除
    #.delete()    #删除
    session.commit()    #提交
    session.close()    #关闭

     

  3. from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index
    from sqlalchemy.orm import sessionmaker, relationship
    from sqlalchemy import create_engine
    
    
    class UserType(Base):
        __tablename__="usertype"
        id = Column(Integer,primary_key=True,autoincrement=True)
        title = Column(String(32),nullable=True,index=True)
    
    engine = create_engine("mysql+pymysql://root:@127.0.0.1:3306/s4day62db?charset=utf8",max_overflow=5)    #连接mysql数据库
    Session = sessionmaker(bind=engine)    #获取权限
    session=Session()    #获取权限
    user_type_list = session.query(UserType).filter(UserType.id>0).update({title:"黑金"})    #查到小于0的id并把title修改为“黑金”
    session.query(Users).filter(Users.id > 2).update({Users.name: Users.name + "099"}, synchronize_session=False)    #字符串做操作时
    session.query(Users).filter(Users.id > 2).update({"num": Users.num + 1}, synchronize_session="evaluate")    ##数值做操作时
    #synchronize_session=False    如果要对字符串操作时必须加、
    #synchronize_session="evaluate"    对数值做操作是必须加
    session.commit()    #提交
    session.close()    #关闭

     

  4. from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index
    from sqlalchemy.orm import sessionmaker, relationship
    from sqlalchemy import create_engine
    
    
    class UserType(Base):
        __tablename__="usertype"
        id = Column(Integer,primary_key=True,autoincrement=True)
        title = Column(String(32),nullable=True,index=True)
    
    engine = create_engine("mysql+pymysql://root:@127.0.0.1:3306/s4day62db?charset=utf8",max_overflow=5)    #连接mysql数据库
    Session = sessionmaker(bind=engine)    #获取权限
    session=Session()    #获取权限
    user_type_list = session.query(UserType(你想取那几列可以写在这如:UserType.id"只写表名相当于sql中的*号")).all()   #查询usertype表中的所有记录
    #.all()    是全部
    #.filter(UserType.id>2)    是过滤和sql中的where一样
    print(session.query(UserType))    #可以看到sql代码
    for row in user_type_list:	
        print(row.id,row.title)
    
    session.commit()    #提交
    session.close()    #关闭
  5. 其他

    #条件
    ret = session.query(user).filtr_by(name="alex").all()
    ret = session.query(user).filter(user.id>1,user.name == "eric").all()#逗号分隔开默认是and运算
    ret = session.query(user).filter(user.id.between(1,3),user.name == "eric").all()
    #.between(1,3)
    ret=session.query(user).filter(user.id.in_([1,3,4])).all()    #in_([1,2,3])就代表in
    ret=session.query(user).filter(~user.id.in_([1,3,4])).all()    #~就代表not
    ret = session.query(user).filter(user.id.in_(session.query(user.id).filter_by(name="eric"))).all()#写表达式用filter如果是参数就用filter_by,filter_by在内部就调用的是filter,拿到的是字典在内部会被转成表达式来引用
    from sqlalcheny import and_,or_#如果要用and和or需要导入一下
    ret = session.query(user).filter(and_(user.id>3,user.name == "eric")).all()
    ret = session.query(user).filter(or_(user.id>3,user.name == "eric")).all()#用什么定义就用什么运算
    ret = session.query(user).filter(or_(user.id<2),and_(user.name == "eric",user.id>3)).all()
    #通配符
    ret = session.query(user).filter(user.naem.like("e%")).all()#找到所有e开头的用户
    ret = session.query(user).filter(~user.naem.like("e%")).all()#找到所有不是e开头的用户
    #限制
    ret = session.query(user)[1:2]#这样写是切片
    #排序
    ret = session.query(user).order_by(user.name.desc()).all()
    ret = session.query(user).order_by(user.naem.desc(),user.id.asc()).all()
    #如果姓名出现了重复就用id排序
    #分组
    from sqlalchemy.sql import func  #用之前需要导入一下
    ret = session.query(user).qroup_by(user.extre).all()
    ret = session.query(
    	func.max(user.id),
    	func.sum(user.id),
    	func.min(user.id)).group_by(user.name).all()
    #所有的函数都可以用func点出来
    ret = session.query(
    	func.max(user.id),
    	func.sum(user.id),
    	func.min(user.id)).group_by(user.name).having(func.min(user.id)>2).all()
    #连表
    ret = session.query(user,usertype).filter(user.id == usertype.nid).all()
    ret = session.query(user).join(usertype)
    ret = session.query(user).join(usertype,isouter=True)#加上isouter是左连表 
    
    #组合
    q1 =session.query(user.name).filter(user.id>2)
    q2 =session.quer(favor.caption).filter(favor.nid<2)
    ret = q1.union(q2).all() #将q1和q2上下连起来,多了个去重的功能
    
    q1 =session.query(user.name).filter(user.id>2)
    q2 =session.quer(favor.caption).filter(favor.nid<2)
    ret = q1.union_all(q2).all() #将q1和q2上下连起来,不去重
    
    #临时表
    #select * from b where id in ()
    
    #select * from (select * from tb) as b
    q1 = session.query(usertype).filter(userType.id>2).subquery()
    #如果要加临时表必须加上subquery()
    result= session.query(q1).all()
    
    #select a.id,(select * from b where b.id == a.id)from a   如果要实现这种就要用到.as_scalar()#
    result = session.query(UserType.id,session.query(user).filter(user.id==UserType.id).as_scalat())
    print(result)
    #不加它.as_scalat()是select*from a加了它是(select*from a)不加是没有括号的,想要实现就必须加
    #############################################
    #1.获取用户信息以及与其关联的用户类型名称
    #第一种普通链表
    user_list = session.query(user,UserType).join(UserType,isouter=True)
    print(session)
    for row in user_list:
        print(row[0].id,row[0].name,row[0].email)
    #第二种建立了关系的
    #创建关系就不用频繁的链表了
    user_type = relationship("UserType",backref="xxoo")
    #relationship分为
    #正向操作是根据绑定了外键的那行数据找到id表中的数据
    #反向操作是根据id绑定的外键找到被绑表中的数据,只有加了backref才能使用反向操作
    #relationship写在有foreigexey类中如:
    class User(Base):
        __tablename__ = "user"
        id = Column(Integer,primary_key=True)
        name = Column(String(32),nullable=True,autoincrement=True,dafault="sf",
    index=True)
        email = Column(String(16),unique=True)
        user_type_id = Column(Integer,ForeignKey("usertype.id"))
        relationship("UserType",backref="xxoo")
    ##########################################    
    
    user_list = session.query(user)
    for row in user_list:
        print(row.name,row.id,row.user_type.title)
    #2.获取用户类型
    #第一种
    type_list = session.query(UserType)
    for row in type_list:
        print(row.id,row.title,session.query(user).filter(user.user_type_id == row.id).all())
    #第二种
    type_list = session.query(usertype)
    for row in type_list:
        print(row.id,row.title,row.xxoo)
    #注意:加了all是吧所有的数据全部取到内存中,不加的话就和一个迭代器一样,只有在循环的之后才会拿取数据

建立表

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index
from sqlalchemy.orm import sessionmaker, relationship
from sqlalchemy import create_engine

class UserType(Base):
    __tablename__="usertype"
    id = Column(Integer,primary_key=True,autoincrement=True)
    title = Column(String(32),nullable=True,index=True)

class User(Base):
    __tablename__ = "user"
    id = Column(Integer,primary_key=True)
    name = Column(String(32),nullable=True,autoincrement=True,dafault="sf",
index=True)
    email = Column(String(16),unique=True)
    user_type_id = Column(Integer,ForeignKey("usertype.id"))
#Column代表列
#primary_key=True 建立主索引
#autoincrement=True 建立自增
#nullable=True是否可以为空
#dafault="sf"默认值
#index=True是否建立索引
#unique=True唯一索引
#foreignKey("usertype.id")外键(约束)
engine = create_engine("mysql+pymysql://root:@127.0.0.1:3306/s4day62?charset=utf-8,max_overflow=5")
Base.metadata.create_all(engine)#建立数据表
Base.metadata.drop_all(engine)#删除表

def init_db():
    Base.metadata.create_all(engine)
#找到继承了Base并创建成表    
def drop_db():
    Base.metadata.drop_all(engine)
#找到继承了Base并删除表
init_db()
drop_db()


#规定写法:用来创建联合索引
__table_args__ = (
#唯一联合索引将id和name创建索引在取个名字	
    		UniqueConstraint("id","name",name="uix_id_name"),
 #建立一个普通索引将name和email建立普通联合索引,普通索引的名字要写到前面
    Index("sdf","name","email",)
)

Visual FoxPro

VFP基础

  1. Visual FoxPro是关系型数据库管理系统的典型代表之一。其中的Visual FoxPro6.0是一个可运行于windows平台之上的32位数据库管理系统。

  2. Ctrl+F2建是“窗口”菜单中“命令窗口”命令的组合快捷键。

基础认识

  1. 数据:数据就是描述事物的符号,文字、声音、图像等都是可以是计算机的数据。

  2. 数据处理:数据处理是值对数据进行收集、存储、分类、计算、统计、检索及传输的过程。数据处理的目的是得到信息。数据处理经历了3个主要阶段:人工管理数据阶段文件系统管理数据阶段数据库系统管理数据阶段

  3. 数据库:数据库(DataBase,DB)是有组织的,可共享的想关数据的集合。

  4. 数据库管理系统:数据库管理系统(DataBase Management System,DBMS)是管理数据库的软件系统。它的主要功能是管理和维护数据。数据库管理系统按照指定的结构存储数据,使数据具有高度的独立性,不同的应用程序可以直接操作这些数据。

  5. 实体和实体集:实体是现实世界中客观存在并且可以相互区别的事物。实体集是同一类实体组成的集合。

  6. 联系的分类:现实生活中,相关的实体之间存在着某种联系。实体之间的联系可以分为三类:一对一的联系一对多的联系多对多的联系

  7. 表格:在现实生活中,人们常常使用表格来管理数据,用二维表反映事物之间的联系。二维表可以反映一对一、一对多、多对多联系。

  8. 数据类型:从现实生活中事物的三种关系,可以抽象出三种数据模型:层次模型网状模型关系模型

  9. 关系模型:关系模型是用二维表格的形式来表示实体与实体之间联系的数据模型。满足如下要求的一张二维表就称为一个关系。

    1. 表格中的每一列都是不能再细分的基本数据项。

    2. 表格中的每一列有一个名字,不同列的名字也不同。

    3. 表格中的每一列数据都是相同类型的数据。

    4. 表格中任意两行的次序可以交换。

    5. 表格中任意两列的次序可以交换。

    6. 表单中不存在完全相同的两行数据。

  10. 数据库类型:对应以上三种数据模型,有三种数据库类型:层次数据库网状数据库关系数据库。Visual FoxPro是关系数据库。

  11. 关系的基本概念

    1. 元组:在一个二维表(一个具体关系)中,水平方向的行称为元组,每一行是一个元组。元组对应存储文件中的一个具体记录。

    2. 属性:二维表中垂直方向的列称为属性,每一列有一个属性名。

    3. 域:属性的取值范围称为,即不同元组对同一个属性的取值所限定的范围。

    4. 外部关键字:如果表中的一个字段不是本表的主关键字或候选关键字,而是另一个表的主关键字或候选关键字,那么这个字段(属性)就称为外部关键字。

  12. 关系运算:专门的关系运算有选择投影联接它们主要用于查询数据的操作。visual FoxPro 关系数据库管理系统能够实现这三种基本关系运算。

    1. 选择:从关系中找出满足给定条件的元组的操作称为选择。

    2. 投影:从关系中取出若干个属性组成新的关系的操作称为投影。

    3. 联接:把两个关系中相同属性值的

  13. 执行命令

    1. Visual FoxPro的命令窗口提供了执行命令的功能。用户可以适应多种方式在命令窗口执行命令。

      # 在屏幕上当前光标的下一行显示指定的数据。
      ?[数据列表]
      ?"Hello world"    											# 显示Hello world
      clear    													# 清除所有显示的信息
      ?date()    													# 屏幕上按“月/日/年”的格式显示当前系统日期
      ?time()   													# 屏幕上按“时:分:秒”的格式显示当前系统时间
  14. Visual FoxPro 提供了三种管理数据的方式:菜单方式命令方式程序方式

  15. 基本规则

    1. 命令的基本规则:Visual FoxPro的命令一般由两部分组成。第一部分是命令动词,第二部分为子句。

      1. 动词如:use、in、alias、create、table等。

      2. 子句如:<表文件名>、[in 工作区号]、[alias 别名]等。

      3. 分隔符:分隔符通常是一个或多个空格,在命令动词与子句、子句与子句、子句的哥哥元素之间独有分隔符。

      4. 书写形式:一行只能写一条命令,但一条命令可以写在多行。如果一条命令写在多行,Visual FoxPro规定在除最后一行外的其他各行末尾均加一个分号“;”。

      5. 关键字字母的大小写等效:命令格式中的关键字可以适应大写、小写或大小写字母混合使用。

    2. 命令格式中的符号

      1. 尖括号<>:尖括号括起来的句子是必选项,使用命令是必须选择。

      2. 方括号[]:方括号括起来的句子是可选项,使用命令时可以选择也可以不选。

      3. 竖线号“|”:竖线号表示前后两任选一项,且只能选一项。

      4. 省略号"...":省略号表示可以按前项相同方式重复。

  16. 使用帮助

    1. Visual FoxPro 有一个完善的在线帮助系统,用户可以使用查看Windows帮助系统的一般方法查看Visual FoxPro 的帮助信息。

    2. 获取屏幕对象的帮助信息:Visual FoxPro 的帮助系统较详细地介绍了Visual FoxPro 的基本功能和基本操作方法。

      1. 获取帮助信息的一般方法:单击“常用”工具栏的“帮助”按钮,或选择“帮助”‘Microsoft Visual FoxPro帮助主题“命令、“帮助”“目录”命令、“帮助”“索引”命令或“帮助”“搜索”命令,都可以打开帮助窗口。

      2. 获取菜单和窗口的帮助信息:先打开菜单或窗口,再按F1建,帮助窗口就显示指定菜单或窗口的帮助内容。

      3. 获取对话框的帮助信息:查看对话框的帮助信息时,仍然需要先打开对话框,再按F1键。

    3. 获取命令和函数的帮助信息:使用命令获取帮助信息。HELP<帮助主题>

数据运算

  1. 数据和数据运算是任何数据库管理系统的基础。Visual FoxPro 提供了丰富的数据类型和运算方法。

常用的数据类型

  1. 数据类型

    1. Visual FoxPro 提供了多种数据类型,其中常见的数据类型为数值型字符型日期型逻辑型

    2. 数据类型决定数据的运算凡是和储存方式。Visual FoxPro 提供的数据类型有Character(字符型)、Currency(货币型)、Date(日期型)、DateTime(日期时间型)、Double(双精度型)、Float(浮点型)、Logical(逻辑型)、Numeric(数值型)、Integer(整形)、General(通用型)、Memo(备注型)

  2. 常量

    • 常量是指始终保持不变的量。常量用于描述现实生活中固定不变的数据,每个常量有一个数据类型。字符型数值型日期型逻辑型常量。

      1. 字符型常量(简称为字符串)由字符型数据组成。

      2. 数值型常量(简称为数字)由数值型数据组成。

      3. 日期型常量是由花括号括起来的日期型数据。它的一般格式为{^yyyy/mm/dd},yyyy表示年份、mm表示月份、dd表示日。日期默认显示格式为:mm/dd/yy。

      4. 逻辑型常量由.T..F.这两个值组成。

  3. 变量

    • 变量是其值可以发生改变的量。变量用于描述现实生活中可以发生改变的数据,Visual FoxPro 中的变量一般分为字段变量和内存变量。

      1. 字段变量是存储在数据表中的变量。

      2. 内存变量是存储在内存中的变量。

运算符

  1. Visual FoxPro 常见的运算符有算术运算符字符运算符关系运算符逻辑运算符

  2. 算术运算符

    运算符 名称 运算符 名称
    + 加法 - 减法
    * 乘法 / 除法
    ^或** 乘方 % 求余
    1. 算术运算符的优先级依次为:乘方乘与除求余加与减、。同等级运算从左到右依次运算。当表达式中有花括号时,花括号优先级最高。

  3. 字符运算符

    1. 字符运算符用于连接两个字符型数据。Visual FoxPro 的字符运算符有如下两个:原样连接运算符“+”非原样连接运算符“-”。非原样连接会把空格移到字符串尾部。

    2. 字符运算符按从左到右的顺序进行运算。

    3. 等于号比较是看开头是否一样的。

    4. $是看一个是否在另外一个里面(位置随便)

  4. 关系运算符

    运算符 名称 运算符 名称
    > 大于 >= 大于等于
    < 小于 <= 小于等于
    = 等于 == 恒等于
    <>或!=或# 不等于 $ 包含于(仅用于字符串)
    1. 关系运算符比较数据的法则

      1. 比较数值型数据是按数值大小进行比较。

      2. 比较单个字符是按照ASCLL码值的大小进行比较。

      3. 比较字符串是按从左到右的顺序依次比较每一个位置上的字符,a字符串第一个字符和b字符串第一个字符进行比较的。

      4. 比较日期型数据是按日期的先后进行比较。

  5. 逻辑运算符

    运算符 名称 运算符 名称 运算符 名称
    and or not

内存变量简介

  1. 给内存变量命名

    1. 一般不使用Visual FoxPro的关键字作为内存变量名。

    2. 因为系统内存变量名都以下划线开头,所以一般不用下划线开头为内存变量命名,以避免与系统内存变量发生重名。

    3. 内存变量名最好不要与字段变量同名。如果内存变量与字段变量同名,Visual FoxPro 优先使用同名的字段变量。

  2. 给内存变量赋值:给单个内存变量赋值。<内存变量名>=<表达式>

  3. 给多个内存变量赋值:store<表达式>to<内存变量表>,如:store “Hello world !” to t1,t2,t3

  4. 显示内存变量

    1. list|display memory [like 变量通配名] [to printer |to file 文件名]

    2. 功能

      1. list命令使用不间断的滚动方式来显示数据。display命令使用分屏显示的方式来显示数据。

      2. 选择like后只显示like中的变量,不选择将显示所有内存变量。变量通配名中可以使用通配符“?”替代一个字符,使用“*”可以代替一个或多个字符。

      3. 选择“to printer” ,将显示结果同时输出到打印机。选择“to file 文件名” ,将显示结果同时输出到指定的文件中。若省略它们,则显示结果值输出到屏幕上。

  5. 删除内存变量

    cleat memory													# 删除所有用户自定义内存变量。
    release <内存变量表>												# 删除指定的用户自定义内存变量。
    release all [like 变量通配名|except 变量通配名] [extended]		# 删除某一类内存变量。
    	# 选择“except”,将删除与变量通配名不匹配的内存变量。extended选项主要用于在程序中删除全局变量。

数组简介

  1. 数组:实际工作中常常需要使用一组内存变量来存储某些想关的数据。

  2. 定义数组:定义一维或二维数组declare|dimension <数组一>(行[,列])[,数组二(行[,列])……]

  3. 给一个数组赋值:<数组名>(行,列) = <表达式>。

  4. 数组的删除:使用删除内存变量的命令会删除整个数组。

常用函数的功能

  1. Visual FoxPro 的函数实质上是一段程序。有函数名和()组成,你的到值叫做返回值,括号中加的是参数。

  2. 按照函数的功能可以把函数分为数值函数日期和时间函数字符函数测试函数转换函数等类型。

  3. 数值函数

    1. 绝对值函数`abs(数值表达式)`。
    2. 符号函数`sign(数值表达式)`、测试“表达式”的值。是正数则返回1;负数是-1;0就是返回0。
    3. 取整函数`int(数值表达式)`。
    4. 取最小整数函数`ceiling(数值表达式)`、返回大于或等于“表达式”的值的最小整数。
    5. 取最大整数函数`floor(数值表达式)`、返回小于或等于“表达式”的值的最大整数。 
    6. 四舍五入函数`round(数值表达式,有效位数)`、对“数值表达式”的值按指定的“有效位数”进行四舍五入。
    7. 求余数函数`mod(数值表达式1,数值表达式2)`。
    8. 平方根函数`sqrt(数值表达式)`。
    9. 圆周率函数`pi()`。
    10.自然对数函数`log(数值型函数)`。
  4. 日期和时间函数

    1. 日期函数`date()`、返回当前系统时间。默认格式为mm/dd/yy。
    2. 年函数`year(日期表达式)`。
    3. 月函数`month(日期表达式)`。
    4. 日函数`day(日期表达式)`。
    5. 时间函数`time()`、返回当前系统时间。返回时间的默认格式为 hh:mm:ss。
    6. 系统日期时间函数`datetime()`。
  5. 字符函数

    1. 生成空格函数`space(空格个数)`。
    2. 删除先导空格函数`ltrim(字符表达式)`。
    3. 删除尾随空格函数`rtrim(字符表达式)`。
    4. 删除先导和尾随空格函数`alltrim(字符表达式)`。
    5. 左子串函数`left(字符表达式,字符个数)`。
    6. 右子串函数`right(字符表达式,字符个数)`。
    7. 子子串函数`substr(字符表达式,起始位置[,字符个数])`。
    8. 求子串位置函数`at(字符表达式1,字符表达式2[,数值表达式])or atc(字符表达式1,字符表达式2[,数值表达式])`、若字符表达式1是字符表达式2的子串,则at函数返回字符表达式1在字符表达式2的位置。若不是子串,则函数返回0。可选项数值表达式用于指定首字符出现的次数,其默认值是1。
    9. 子串替换函数`stuff(字符表达式1,起始位置,长度,字符表达式2)`、用字符表达式2的值替换字符表达式1中有起始位置和长度指定的子串。如果长度的值为0,则字符表达式2插在起始位置指定的字符前面。如果字符表达式2是空字符串,则删除字符表达式1中由起始位置和长度指定的子串。
    10. 字符串匹配函数`like(字符表达式1,字符表达式2)`、比较两个字符串在对应位置上的字符,若所有对应的字符都匹配,则函数返回真值,反之假值。
  6. 测试函数

    1. 测试字符串长度函数`len(字符型表达式)`。
    2. 测试数据是否为空函数`emtype(表达式)`、是空返回真值,反之假值。
    3. 测试数据类型函数`type(表达式)`、type的返回值为:C表示字符型、D表示日期型、L表达式逻辑型、M表示备注型、N表示数值型、S表示屏幕型、U表示未定义的数据类型、Y表示货币型。
    4. 测试数据范围函数`between(表达式1,表达式2,表达式3)`、测试表达式1是否在表达式2和表达式3之间。在真值,不在假值。
    5. 测试数据类型函数`vartype(表达式[,逻辑表达式])`、若表达式是一个数组,则根据第一个数组元素的类型返回字符。若表达式的值是null,则当逻辑表达式的值为真时返回表达式的原数据类型,当逻辑表达式的值为假货省略逻辑表达式时返回X。
    6. 表文件头测试函数`bof([工作区号|别名])`、判断记录指针是否指向文件头若是,则返回真值,否则返回假值。
    7. 表文件尾测试函数`eof([工作区号|别名])`、判断记录指针是否指向文件尾若是,则返回真值,否则返回假值。
    8. 记录号测试函数`recno([工作区号|别名])`、返回指定表文件中当前记录的记录号。
    9. 记录个数测试函数`reccount([工作区号|别名])`、返回指定表文件中的记录个数,如果指定的工作区号没有表打开,则函数返回0。
    10. 记录删除测试函数`delete([工作区号|别名])`、测试指定表文件的当前记录是否有删除标记。有返回真值没有返回假值。
  7. 转换函数

    1. 数值转换为字符函数`str(数值表达式[,长度[,小数位数]])`。
    2. 字符转换为数值函数`val(字符表达式)`、val函数装换数据时,从左到右依次转换,遇到非数字字符就停止转换。默认:0.00。
    3. 字符转换为日期函数`ctod(字符表达式)`。
    4. 字符串转换为日期时间函数`ctot(字符表达式)`。
    5. 日期时间转换为字符串函数`ttoc(日期时间表达式[,1])`、若选择1,则按“yyyymmddhhmmss”的合适返回结果,若忽略则按“mm/dd/yy HH:MM:SS”的格式返回结果。
    6. 日期转换为字符函数`dtoc(日期型表达式[,1])`、选择“1”,将按yyyymmdd的格式返回结果。缺省该选项,将按mm/dd/yy返回结果。
    7. 小写装换为大写函数`upper(字符表达式)`。
    8. 大写转换为小写函数`lower(字符表达式)`。
    9. 字符转换为ascll码函数`asc(字符表达式)`。
    10. ascll转换为字符函数`chr(数值表达式)`。
  8. 其他函数

    1. 最大值函数`max(表达式1,表达式2,表达式3,……)。`
    2. 最小值函数`min(表达式1,表达式2,表达式3,……)`。
    3. 条件测试函数`iif(逻辑表达式,表达式1,表达式2)`、测试逻辑表达式的值为真,则返回表达式1反之返回表达式2的值。
    4. 宏替换函数`&<字符型变量>[.]`、替换指定字符型变量的值,即函数值是变量中存放的字符串。如果函数与其后的字符没有明确分界,则要使用“.”作为函数的结束标记。

使用项目管理器管理文件

  1. 项目维嘉个对应的炫目管理器可以帮助用户管理各种文件。

常用的文件类型

  1. Visual FoxPro 可以使用多种类型的文件,文件类型不同,其作用不同,扩展名也不同。

  2. Visual FoxPro 常用的文件类型

    文件类型 扩展名 文件类型 扩展名
    表文件 .DBF 表备注文件 .FPT
    报表文件 .FRX 报表备注文件 .FRT
    标签文件 .LBX 标签备注文件 .LBT
    表单文件 .SCX 表单备注文件 .SCT
    数据库文件 .DBC 复合索引文件 .CDX
    项目文件 .PJX 项目备注文件 .PJT
    文本文件 .TXT 屏幕格式文件 .FMT
    查询程序文件 .QPR 程序文件 .PRG
    应用程序文件 .APP 可执行文件 .EXE
    菜单格式文件 .MNX 菜单备注文件 .MNT
    菜单程序文件 .MPR 内存变量文件 .MEM

数据库和表

  1. Visual FoxPro 使用表文件保存数据,使用数据库文件管理表和表与表之间的关系。

  1. 在实际生活中,使用表格保存数据时需要先绘制表格,在填入数据。类似地,要使用Visual FoxPro 的表保存数据,也需要先定义表结构,在输入数据。

  2. 表结构由字段定义。每个字段有4个属性:字段名称、字段类型、字段宽度、小数位数

  3. Visual FoxPro 的字段类型有:字符型、货币型、数值型、浮点型、日期型、日期时间型、双精度型、整型、逻辑型、备注型、通用型、字符型(二进制)、备注型(二进制)

设计表的结构

  1. 要使用Visual FoxPro 的表保存数据,首先需要分类组织数据,被设计表结构;其次建立表结构,将数据输入表,并保存表文件。

  2. 组织数据:实际生活中使用表格管理大量数据,如果处理的数据混乱无序,将给工作带来许多不便为了有效地管理各种各样的数据,人们常常根据需要把数据进行分类、整理,按一定的原则组织数据。

  3. 字段和记录

    1. 字段和记录都是Visual FoxPro 的重要概念。表的数据项称为字段,表中相关字段值的值组成的集合称为记录。

    2. 一个表可以存放多达10亿条记录。一个表最多允许有255个字段。

    3. 数据库表每个字段的大小为128个字节,自由表是10个字节。

    4. 字段属性和字段类型。

    5. 字段类型 类型代码 说明 最大宽度
      字符型 C 存储字符型数据 254个字节
      货币型 Y 存储货币型数据 系统规定宽度为8个字节
      数值型 N 存储数值型数据 20位
      浮动型 F 存储数值型数据 20位
      日期型 D 存储日期型数据 系统规定宽度为8个字节
      日期时间型 T 存储日期时间型数据 系统规定宽度为8个字节
      双精度型 B 存储双精度型数据 系统规定宽度为8个字节
      整型 I 存储整型 系统规定宽度为4个字节
      逻辑型 L 存储逻辑型数据 系统规定宽度为1个字节
      备注型 M 存储不定长的文本 系统规定宽度为4个字节
      通用型 G 存储OLE对象 系统规定宽度为4个字节
    6. 表文件是Visual FoxPro 最重要的文件之一。表设计器是建立个修改表文件的重要工具。用户可以使用项目管理器、菜单或命令启动表设计器,建立和修改表文件。

  4. 使用命令创建表

    create<table>														# 创建表的命令,打开表设计器新建一个Visual FoxPro 表
    # 创建表的sql命令:SQL是Structured Query Language (结构化查询语言)的缩写,它是关系数据库语言的国际标准。SQL命令功能强大,又非常简洁。
    create table|dbf <表文件名>(<字段名> <类型>[(宽度[,小数位数])] [,primary key 表达式 tag 索引名] [,foreign key 表达式 tag 索引名 references 表文件名 [tag  索引名 ]])									# 创建表的SQL命令、选择primary key 就是建立主索引、foreign key 就是建立外键(建立关系)。
    copy to <table> [ fields 字段列表] [for 条件]							# 复制表的命令、选择fields 指定数据复制到新表中、use打开的是需要复制的。
    copy structure to <table> [fields 字段列表]							 # 复制表结构的命令、选择fields就是被选中的结构复制到新表中,确实该选项则全部复制。

数据库

  1. 实际工作中管理数据时,常常需要使用多个表。Visual FoxPro 使用数据库文件管理表和表与表之间的关系。

  2. 创建数据库

    create database <database>												# 创建数据库
    modify database [database|?] [nowait] [noedit]							# 打开数据库设计器
    	# nowait 选项只在程序中使用。选择该选项,则数据库设计器打开后程序才继续运行。
    	# 选择 noedit 可禁止修改数据库
    delete database <database|?> [deletetables] [recycle]					# 删除数据库的命令
    	# 选择 deletetables 可指定在删除数据库文件时从磁盘上删除该数据库包含的表文件;若省略,则删除数据库是不从磁盘上删除数据库包含的表文件。
    	# 选择 recycle 可指定将删除的数据库文件和表文件放入Windows的回收站中,如果需要,可以从回收站找中还原它们。
  3. 打开和关闭当前数据库

    open database <database>												# 使用数据库之前先打开数据库、可以打开多个数据库。
    set database [database]													# 设置当前数据库 
    set database 															# 取消当前数据库
    close database 															# 关闭数据库
    close all																# 关闭所有打开的文件的命令
  4. 添加与移去表

    # 数据库表和自由表,一个表可以是自由表也可以是数据库表。
    add table <table|?> [name longtable]									# 向数据库添加表
    remove table <table|?> [delete] [recycle]								# 从数据库移去表
    	# 选择 delete 则不仅将数据库表移除,而且还从磁盘上删除该表。
    	# 选择 recycle 将移除的表翻到Windows 的回收站中。

显示和修改

  1. 表的结构应该相对稳定,才有利于管理数据。但随着实际请款的变化,表的结构也可能需要修改。

  2. 打开和关闭表

    1. 工作区:生活中常常需要使用多个表。为了便于管理,Visual FoxPro 提供了**32767个工作区**。启动Visual FoxPro 时1号工作区是当前工作区。
    2. 选择当前工作区的命令`select<工作区>|<别名>`。
    3. 使用命令打开表
       - use <表文件名>[in 工作区号] [alias 别名] [noupdate] [again]
       - noupdate,则指定表文件只读,即不用需修改表的数据
       - again 可以再次打开己在其他工作区中打开的表。
    4. 使用命令关闭表
       - use [ in 工作区 | 别名]
  3. 显示和修改表结构

    1. 使用命令显示表的结构
       - display | list  structure [in 工作区号| in 别名] [ to printer | to file 文件名]
       - to printer 可将显示结果输出到打印机。to file 可将显示结果输出到指定的文本文件。
    2. 使用命令修改表的结构
       - modify structure
  4. 浏览和编辑

    1. 使用命令浏览编辑数据
    
       - browse [fields 字段列表]  [for 条件] [freeze 字段名] [lock 锁定字段数] [noappend] [nodelete] [noedit]
       - 选择 fields 只显示字段列表中的,不选择全部显示,顺序由字段列表决定。
       - 选择freeze 把字段光标冻结在指定字段上,该字段是唯一可以修改的字段。
       - 选择 lock 可以将浏览窗口分成两个窗格,左边窗格显示指定数目的字段。
       - 选择 noAPPend  指定不能向表添加新记录。选择nodelete 指定不能删除。
       - 选择noedit 指定不能修改记录的数据。
    
    2. 使用命令编辑数据
    
       - edit | change [fields 字段列表] [范围] [for 条件]
    
       - “范围”的值
    
         | “范围”的值 |                   意义                   |
         | :--------: | :--------------------------------------: |
         |    all     |                 所有记录                 |
         |  record n  |                第n条记录                 |
         |   next n   |       从当前记录开始连续的n条记录        |
         |    rest    | 从当前记录开始直到最后一条记录的所有记录 |
    
         
  5. 定位记录和显示数据

    使用命令移动记录指针
    
    1. 绝对指针移动命令
       - go | go top | go | bottom |<记录号>
       - 选择top是定位到第一条
       - bottom 可把当前表的记录指针移到最后一条记录上。
    2. 相对指针移动命令
       - skip [记录数]
       - 如果不加记录数则记录指针向文件尾移动一条记录。
    3. 测试记录的函数
       1. 测试当前记录号的函数
          - recno()
       2. 测试记录总数的函数
          - reccount()
    4. 显示数据
       - display | list [all] [fields 字段列表] [范围] [for 条件] [off] [to printer| to file 文件名]
       - 选择 off是不显示记录号
       - to printer 可将显示结果输出到打印机。to file 可将显示结果输出到指定的文本文件。

追加、删除和更新

  1. 现实生活中管理数据时,追加记录是不可缺少的操作。

  2. 追加记录

    1. 追加记录命令
       - append[blank]
       - 选择blank 追加一条空记录
    2. 追加记录的SQL命令
       - insert into <表名> [(<字段名列表>)] values (<表达式列表>)
    3. 使用命令从表文件追加记录
       - append from <表文件名> [ fields 字段列表] [for 条件]
       - 把指定表的文件中的记录追加到当前表。
    4. 使用命令从文本文件追加记录
       - append from <文本文件名> type <文件类型> [ fields 字段列表] [ for 条件]
       - “文本文件名” 用于指定提供数据的文本文件。
       - “数据类型” 用于指定文本文件的数据格式。通常使用sdf 和 delimited 两种类型。其中sdf表示标准格式(也称为无格式),这种格式的特点是数据的前后空格保留,数据之间无分隔符,字符串也不乱起来,各行数据的长;delimited表示紧凑格式(也称为带格式),这种格式的特点是数据的前后空格不保留,用空格分隔各个数据项,字符串用定界符括起来,各行数据不等长。
    5. 表文件转换为文本文件
       - copy to <文件名> type <文件数据类型> [fields 字段列表] [for 条件]
       - 将当前表的数据复制到一个文本文件中。
       - 文件名用于指定文本文件的文件名,该文件的默认扩展名是.txt
       - 选择 with 定界符 ,可使用空格分隔个字段,并把字符串用指定的定界符括起来;选择with blank ,可使用空格分隔个字段,字符串不用引号括起来。若缺省这两项,则使用逗号分隔字段,字符串用双引号括起来。这种格式的文件也称为带格式文件。
       - 
  3. 删除记录

    1. 使用命令逻辑删除记录
       - delete [all] [for 条件]
       - 缺省这两项只逻辑删除当前记录。
    2. 逻辑删除记录的SQL命令
       - delete from <表文件名> [where 条件]
    3. 测试记录是否有删除标记的函数
       - delete()
    4. 使用命令取消记录的物理标记
       - recall [all] [for 条件]
    5. 使用命令物理删除记录
       - pack
    6. 使用命令物理删除所有记录
       - zap
    7. 使用命令恢复被逻辑删除的命令
       - recall [范围] [ for 条件]
  4. 更新数据

    1. 成批替换数据
       - replace <字段名1> with <表达式1> [,<字段名2> with <表达式2>......] [all] [for 条件]
    2. 更新数据的SQL命令
       - update <表文件名> set <字段名1> = <表达式1> [, <字段名2> = <表达式2> …] [ where 条件]
       - 

有序显示数据

  1. 向表追加记录时,Visual FoxPro 按照记录的先后顺序存储数据。但是在实际应用中,即常常需要对记录重新排序,按照不同的顺序使用表的记录。索引可以对记录逻辑排序,它只改变记录的逻辑顺序,并不改变记录的物理顺序,也不会建立表。一个表可以建立多个索引,每个索引提供一种逻辑顺序,用户可以按照多种不同的顺序使用表的记录。

  2. 索引根据表中某一特定的字段或表达式对记录进行排序。用作排序依据的字段或表达式称为索引关键字。跟剧对索引的关键字的不同要求,可以将索引分为一下4种类型。

  3. 索引类型 是否允许出现重复关键字 建立什么类型的表 一个表中建立个数
    主索引 数据库表 一个
    候选索引 数据库和自由表 多个
    普通索引 数据库和自由表 多个
    唯一索引 数据库和自由表 多个

创建索引和对记录排序

  1. 索引文件

    1. Visual FoxPro 的索引文件可以分为两类:一类是传统的单索引文件,默认扩展名是IDX。一个单索引文件只存放一个索引。另一类是复合索引文件,默认扩展名是CDX。一个复合索引文件可以存放多个索引,其中各个索引用索引名来区分。如果复合索引文件的主文件名与对应表的主文件名相同,则称它为结构索引文件。结构索引文件有一些很好的性质。在表这机器中创建的索引都存放在结构索引文件中。

  2. 使用命令创建索引

    1. index on <单索引文件名> | tag <索引名> [ of 复合索引文件名] [ for 条件] [ descending] [unique| candidate]

    2. desc是降序,asc是升序

    3. 选择 of ,索引存放在指定的复合索引文件中。缺省该选项,索引存放在结构索引文件中,省去 descending,索引顺序为升序。

    4. 选择 unique ,可建立唯一索引。选择 candidate ,可建立候选索引。若省略这两个选项,则建立普通索引。

  3. 当前索引

    1. 当用户需要按照多个不同的顺序使用表中的记录时,通常利用索引对记录进行逻辑排序。一个表可以建立多个索引,但任一时刻控制记录逻辑顺序的索引只有一个,这个索引称为当前索引。指定当前索引后,记录的顺序就由该索引决定。用户可以使用命令和工作区属性对话框至当前索引。

  4. 打开索引文件

    1. set index to [ 索引文件列表]

  5. 使用命令指定当前索引

    1. set order to < 索引名> [of 索引文件名] [ascending|descending]

    2. 选择of 索引文件名,指定该索引文件中的索引为当前索引。缺省该选项,则指定结构索引文件中的索引为当前索引。

  6. 维护索引

    1. 编辑索引关键字,可以更改记录排序的结果,所以应及时维护索引,是索引文件中的索引正确反映记录的最新状态。维护索引通常使用方法。

    2. 自动维护索引

      • Visual FoxPro 可以自动维护打开的索引文件中的索引。

    3. 使用命令维护索引

      • 当表文件和需要维护的索引文件都打开后,可以执行重新索引命令来维护索引。

      • reindex

      • 对当前表的所有打开的索引文件重新索引。

    4. 打开表和索引文件

      • use <表文件名> [in 工作区号] [index 索引文件表] [order[tag]索引标记 [of 复合索引文件] [ascending|descending]]

      • 选择order [tag] 索引标记 [of 复合索引文件]可指定,复合索引中的某个索引为当前索引。若省略of 复合索引文件,则指定结构索引文件中的某个索引为当前索引。

    5. 使用命令删除索引

      • delete tag <索引名|all> [of 复合索引文件名]

检索、统计和使用多个表的数据

  1. 保存数据的目的是为了更好地使用数据。要从大量数据中找出需要的数据,值使用浏览数据和显示数据的方法是远远不够的,还需要掌握检索数据的方法。

  2. 检索数据

    1. 使用命令检索数据
       - locate for<条件>
       - 在当前表中查找班组条件的第一条
    2. 继续检索命令
       - continue
       - 在当前表中继续查找满足条件的下一条记录。
    3. 使用索引快速检索数据
       - seek <表达式> [tag 索引名] [in 工作区号| 别名]
       - 在当前表的索引中检索指定表达式的值
    4. 测试检索是否成功的函数
       - found()
       - 测试记录指针是否在文件尾的函数
         - eof()
    5. 使用命令对记录进行物理排序
       - sort to <新文件名> on <字段1> [/a] [/d] [/c] [,<字段2> [/a] [/d] [/c] ……] [asc|desc] [fields 字段列表] [范围] [ for 条件]
       - “新文件名” 用于指定排序生成的表文件的文件名,该文件名不能与当前表同名。
       - “字段1”,“字段2”,……用于指定作为排序关键字的字段。如果使用多个字段排序,则系统将先按第一个字段,对于第一个字段值相等的记录,再按第二个字段排序,以此类推。
       - 选择“/a”,可指定按升序排,选择"/d",可指定按降序排"/c",可指定排序时不区分字母的大小写。它们都会对其前面的字段起作用。系统默认的是升序,且区分大小写。
  3. 统计数据

    1. 求和命令
       - sum [ 表达式列表] [ for 条件]
    2. 求平均值命令
       - average [ 表达式列表 ] [ for 条件 ]
    
    2.6.3 创建表间关系
    
    1. 表间关系
       - Visual FoxPro 可以在当前表和其他打开的表之间建立一对一的关系或一对多的关系。两个表建立关系后,当前表称为主表,与之建立关系的表称为子表。建立了表之间的关系后,当主表的记录指针移动时,系统自动移动子表的记录指针指向匹配的记录。
    2. 使用命令创建表之间的一对一关系
       - set relation to [关键字 into 别名……]
       - 选择 关键字 into 别名 ,指定建立关系。缺省该选项,则取消关系。其中关键字指定建立关系的关键字,别名是子表的别名。
    3. 使用命令创建表之间的一对多关系
       - set skip to <别名>
       - 注意:
         - Visual FoxPro 使用建立一对一关系的关键字建立一对多的关系。因此,建立一对多的关系之前必须先建立一对一的关系。
  4. 创建参照完整性

    1. Visual FoxPro 的参照完整性规则由更新规则、删除规则、插入规则组成。更新规则可以使编辑主表关键字的结果自动反映到子表,删除规则可以使删除主表记录是自动删除子表的相关记录,插入规则可以检查在子表插入记录的合法性。它们用于保护数据库表之间数据的正确性。

    2. 规则类别 规则名 意义
        级联 若修改主表关键字的值,则用新的关键字值更新子表的所有相关记录
      更新规则 限制 若子表中有相关记录,则禁止更新主表对应的关键字值
        忽略 不论子表是否存在相关记录,均可以修改主表关键字的值
        级联 若删除主表的记录,则删除子表的所有相关记录
      删除规则 限制 若子表中有相关记录,则禁止删除主表对应的记录
        忽略 不论子表是否存在相关记录,均可以删除主表的记录
      插入规则 限制 若主表不存在匹配的关键字值,则禁止在子表中插入记录
        忽略 不论主表是否存在匹配的关键字值,均可以在子表中插入记录
    3. 数据完整性

      • 数据完整性包括域完整性、实体完整性和参照完整性

        1. 域完整性

          • 域完整性是指定数据的取值范围。在Visual FoxPro 中,通过定义字段的数据类型和宽度,以及设置字段的有效性规则来实现域完整性。

        2. 实体完整性

          • 实体完整性是保证表中记录唯一的特性,即在一个表中不允许有重复的记录。Visual FoxPro 使用主索引和候选索引实现数据的实体完整性。

查询与视图

  1. 在管理数据的工作中,查询数据和修改数据是最常用的操作之一。利用Visual FoxPro 的查询功能可以方便地检索出需要的数据,借助Visual FoxPro 的视图可以方便地更新数据。

查询

  1. 查询是从指定的表或视图中提取满足条件的记录,并按照指定的输出去向输出查询结果。查询文件的默认扩展名为.QPR,但该文件实质上是一个文本文件,里面存放着实现查询功能的SQL命令。

    do <查询文件名>														# 使用命令运行查询
    modify query <查询文件名>											# 使用命令打开查询文件
  2. 查询去向:Visual FoxPro 可以用多种形式输出查询结果。如果设计查询时不指定查询去向,则系统默认在浏览窗口中显示查询结果。

    查询去向 含义
    浏览 将查询结果输出到浏览窗口
    临时表 将查询结果保存到一个临时表中
    将查询结果保存到一个指定的表中
    图形 将查询结果输出到 Microsoft Graph 图形文件中
    屏幕 将查询结果输出到当前活动窗口中
    报表 将查询结果输出到一个报表文件中
    标签 将查询结果输出到一个标签文件中

    注意:临时表保存在内存中。当关闭临时表时,系统自动删除该临时表。

使用SQL命令查询数据

  1. Visual FoxPro 的查询功能实质上是调用查询数据的SQL语句。

查询数据的SQL命令

  • 查询命令

    • select [distinct] [输出数量] <查询项列表>|* from <数据源> [where 条件] [group by 分组项列表] [having 条件] [order by 排序项列表] [输出对象]

    • *号代表所有查询项列表。

    • 选择 distinct ,不输出重复的记录。

    • 选择输出数量,值输出指定数量的记录。

    • 选择 having 条件 ,可以指定分组满足的条件。

    • 输出对象,将查询结果输出到指定对象。缺省,则查询结果默认输出到浏览窗口。

    • order by 是排序 的desc是降序,asc是升序。

  1. 简单的计算查询

    • count :计数

    • sum:求和

    • avg :求平均值

    • max:求最大值

    • min:求最小值

  2. 指定查询去向

    • [into 目标| to file 文件名 [additive]|to printer|to screen]

    • 选择 to file 文件名 指定查询结果输出到文本文件中。选择[additive],查询结果追加到文件尾,否则将覆盖原来的内容。

    • 选择 to printer 指定查询结果送打印机输出。

    • 选择 to screen 指定查询结果显示到屏幕上。

    • 选择 into 目标,指定查询结果输出到表文件或数组中。

    • 选项 意义
      DBF 表文件名 将查询结果保存到一个表文件中
      CURSOR 表文件名 将查询结果保存到一个只读的临时表中
      ARRAY数组名 将查询结果保存到一个二维数组中
      select * from a into dbf ad
      select * from a to screen
  3. 多表查询

    • 在数据源中指定较复杂的联接条件。是用select 命令查询多个表的数据时,数据源中不仅要指定查询的表名,通常还要指定表之间的联接类型和联接条件。

    • [数据库名 !] <表名> [inner|left|right|full] join[数据库 !] <表名> [on 联接条件]

    • 选项 名称 说明
      inner 内部联接 只返回完全满足联接条件的记录
      left 左联接 返回join左侧表中的所有记录以及右侧表中匹配的记录
      right 右联接 返回join右侧表中的所有记录以及左侧表中匹配的记录
      full 完全联接 返回两个表中的匹配和不匹配的所有记录
      select * from a left b on a.id = b.id where id <=10
      select * from a inner b on a.id = b.id where id <=10

创建报表和视图

  1. Visual FoxPro 有两种视图,本地视图用于更新本地计算机存储的数据,远程视图用于更新远程服务器上存储的数据。

  2. 创建和运行本地视图

    create view <viewName> as <查询语句>								 # 使用SQL命令建立视图,为当前数据库建立视图
    drop view <viewName>												# 删除视图的SQL命令,删除当前数据库中指定的视图
  3. 远程视图:Visual FoxPro 的远程数据可以更新远程 ODBC (Open DataBase Connectivity)数据源中的数据。

  4. 报表的数据源可以是表或视图。报表文件的默认扩展名为FRX。

  5. Visual FoxPro提供了多种创建报表的方法,用户可以使用报表向导、报表设计器或命令建立报表。

    create report <reportFileName>									# 使用命令新建报表
    modify report <reportFileName>									# 使用命令打开报表文件

其他SQL命令

  1. 修改表结构的命令的第一种

    1. alter table <表名> add | alter <字段名> <类型> [(宽度[,小数位数])] [check <表达式> [error 错误提示信息]] [default 默认值] [primary key |unique]

    2. 选择add ,指定添加字段。选择alter ,指定修改字段。

    3. 选择 check,可以指定字段的有效性规则,选择 error 错误提示信息,可以指定不满足有效性规则时的现实信息。

    4. 选择default 默认值,可以指定字段的默认值。

    5. 选择 primary key ,指定创建主索引。

    6. 选择 unique ,指定创建候选索引。

  2. 修改表结构的命令的第二种

    1. alter table <表名> alter <字段名> [set default 默认值] [set check 表达式 [error 错误提示信息]] [drop default] [drop check]

    2. 字段名,指定需要设置设置值或有效性规则的字段名。

    3. 选择,set check 表达式,可以指定字段的有效性规则;选择error错误提示信息,可以指定不满足字段的有效性规则时的提示信息。

    4. 选择 set default 默认值 ,可以指定字段的默认值。

    5. 选择 drop default ,可以删除字段的默认值。

    6. 选择drop check ,可以删除字段的有有效性规则。

  3. 修改表结构的命令的第三种

    1. alter table <表名> [ drop <字段名1>] [set check 表达式1 [error 错误提示信息]] [drop check] [add primary key 表达式2 tag 索引名] [drop primary key ] [add unique key 表达式3 tag 索引名] [drop unique key ] [rename column 字段名2 to 字段名3]

    2. 选择 drop <字段名1>,可以删除指定的字段。

    3. 选择 set check 表达式1,可以指定字段的有效性规则,选择 error 错误提示信息,可以指定不满足有效性规则时显示信息。

    4. 选择drop check ,可以删除字段的有效性规则

    5. 选择 add primary key表达式 2 tag 索引名,可以指定创建主索引。

    6. 选择drop primary key ,可以删除主索引。

    7. 选择 add unique key 表达式3 tag 索引名,可以指定创建候选索引。

    8. 选择drop unique key ,可以删除候选索引。

    9. 选择 rename column 字段名 2 to 字段名3 ,指定将 字段名2 改名为 字段名3。

结构化程序设计基础

  1. 人们常常利用Visual FoxPro 提供的程序设计功能,编写程序快速、方便地完成复杂的数据管理工作。Visual FoxPro支持结构化程序设计和面向对象程序设计。

  2. 创建与运行程序:Visual FoxPro 的程序文件是一个文本文件,程序文件的默认扩展名是.PRG。

    modify command <程序文件名>											# 建立程序文件的命令
    do <程序文件名>														# 运行程序的命令
  3. 添加注释:可以使用"*"号或note命令给某一行加注释,也可以使用"&&"顾浩在语句行后面添加注释。

编写程序

  1. Visual FoxPro 提供了3种基本的程序结构:顺序结构、选择结构、循环结构

  2. 常用程序命令

    clear														# 清屏命令
    
    # 简单输入\输出命令
    accept [提示信息] to <内存变量> 								# 输入字符串命令
    input [提示信息] to <内存变量>									# 输入表达式命令
    wait [提示信息] [to 内存变量] [window [at 行,列]] [nowait] [Timeout 时间] [cleat|noclear ]			# 输入一个字符命令
    	# 选择window at 行,列,在系统窗口显示信息,其中的at行,列可以指定窗口的位置。
    	# 选择Timeout 时间,指定等待的时间;缺省该选项,则无限等待,知道用户按键为止。
    	# 选择 nowait ,将不等待用户按键
    	# 选择noclear ,则不关闭提示窗口。知道执行下一条wait window 命令或wait clear 命令为止。
    	
    # 格式化输入/输出命令
    @<行,列> say <显示信息>								   	 # 格式化输出命令。
    @<行,列> [say 显示信息] get <变量>							# 格式化输入命令。
    row()													 # 测试行坐标的函数其函数格式为
    col()													 # 测试列坐标的函数其函数格式为
    
    # 设置程序运行环境:Visual FoxPro 提供了一个集成化的应用环境,但这个环境可能不适合用户开发的应用程序运行。所以,应用程序开头通常使用环境设置命令设置新的环境,应用程序结束之前又使用环境设置命令恢复Visual FoxPro的应用环境。
    set talk on |off											# 设置会话状态,设置是否显示某些命令执行的结果
    set safety on | off											# 设置文件保护命令,设置删除文件数据时是否显示提示信息。
    clear all													# 清除内存变量命令,清除用户自定义内存变量和对象
    cancal														# 终止程序运行命令,中止程序运行,清除局部变量,返回命令窗口。

选择结构程序

  1. 选择结构分为3种:单分支选择结构、双分支选择结构、多分支选择结构

    # 单分支
    if <条件>
    	<语句组>
    endif
    
    # 双分支:双分支选择结构。无论是否满足指定条件,都能执行其中一个程序分支,并且只能执行一个程序分支。
    if <条件>
    	<语句组>
    else 
    	<语句组>
    endif
    
    # 多分支:多分支选择结构通常有一个程序分支,但最多执行其中一个程序分支,也可能所有程序分支都不执行。
    # 如果所有case 后面的条件都不满足,当有otherwise选项时,执行对应的“语句组”,没有otherwise选项时,直接执行case后面的语句。
    do case 
    	case <条件1>
    		<语句组1>
    	case <条件2>
    		<语句组2>
    	case <条件n>
    		<语句组n>
    	[otherwise
        	语句组]
    endcase

循环结构程序

  1. 循环结构分为3种:基于条件的循环、基于记录的循环、基于次数的循环

    # 基于条件的循环
    do while <条件>
    	<语句组>
    end do
    
    # 基于记录的循环
    scan [for 条件]
    	<语句组>
    endscan
    
    # 基于次数的循环,不加步长默认为1
    for <变量>=<初值> to <终值> [step 步长]
    	<语句组>
    endfor
    
    # 循环控制命令
    loop																# 终止本次循环命令
    exit																# 结束循环命令

调试过程

  1. 程序中的错误通常分为两类:语法错误和逻辑错误。程序中命令格式、命令的关键字或程序结构出现错误将导致语法错误,命令或表达式使用不当导致逻辑错误。

  2. 过程是为了实现某个功能而编写的一段程序,它与子程序有许多相似之处。用户可以使用创建子程序的方法创建过程,可以像调用子程序一样调用过程。

  3. 过程定义过程

    procedure <过程名>
    	<语句组>
    endproc
    
    set procedure to [过程文件名] [additive]								# 打开过程文件,选择 additive ,则打开过程文件时不关闭原先已经打开的过程文件。
    release procedure <过程文件表>										# 关闭过程文件
    do <程序|过程名> [with 参数表]										  # 传递参数
    	# 接收参数的命令
    	# parameters <参数表>
    	# lparameters <参数表>
    	# 这里的参数表是变量,p命令声明的变量是私有变量,l命令声明的变量是局部变量。
  4. 过程文件:过程文件的默认扩展名是.PRG,一个过程we年可以存放多个过程。用户可以使用创建程序文件的方法创建过程文件。

内存变量的作用域

  • 内存变量的作用域也就是内存变量的作用范围,他指明了内存变量在什么范围内是有效的或能够被访问的。按照内存变量的作用域,可以将内存变量分为3类:全局变量、私有变量、局部变量

  1. 全局变量:在所有程序中都能使用的便来能够成为全局变量。全局变量必须先定义后使用。public<内存变量表>、它们的初值是逻辑假值。

  2. 私有变量:在程序中使用赋值命令或由系统自动建立的变量都是私有变量。私有变量只在程序和建立的子程序中有效,程序关闭后变量会自动删除。

  3. 局部变量:局部变量只在建立它的程序中有效,在其上级下级程序中无效。局部变量必须先定义后赋值。local<内存变量表>、初值为逻辑假值。

  4. 隐藏内存变量

    1. 从变量的作用与可知,如果子程序中的变量与主程序中的变量同名,当从子程序返回主程序时,系统默认把与主程序同名的变量的值转回主程序中,这使子程序可能无意识地改变主程序中变量的值,造成主程序运行混乱。用户可能在子程序中使用private命令隐藏上级程序可能存在的内存变量,

    2. private <内存变量表> | all [like 变量通配名|except 变量通配名]

    3. 选择like ,将隐藏所有与内存通配名匹配的内存变量。选择except ,将隐藏所有与变量通配名不匹配的内存变量。

  5. 对数组操作的函数

    1. 删除数组元素的函数adel(数组名,数字[,2]),返回1时是删除成功,-1时没有删除成功。

    2. 插入数组元素的函数ains (数组,数字[,2])

    3. 求数组长度的函数alen(数组[,数字]),数字的值为1或者2。对于一维数组,若果数字的值是1或者省略选项,则函数返回数组元素的个数;如果数字的值是2,则函数返回值是0。对于二维数组,如果是1则返回行数,如果是2则返回列数,如果省略数字则函数返回数组元素的个数。

  6. 表与数组交换函数

    1. 表的记录赋值到数组

      1. scatter [fields 字段表] [memo] to <数组名> [blank]

      2. 选择fields字段表,只复制指定字符安的内容;若省略则复制除备注型和通用型字段外的所有字段。

      3. 选择memo ,可制定复制备注型字段的内容。

      4. 选择blank,可建立一个空数组。个数组元素的类型和大小与对应字段相同。

    2. 数组的数据复制到表:gather from <数组名> [fields 字段表] [memo]

面向对象程序设计基础

  • 面向对象程序设计是当前流行的程序设计方法,也是程序设计的发展趋势。

用法

标签控件的属性

属性 用法 属性 用法
Name 对象的名称 Caption 对象的标题
Color 对象的颜色 FontName 标题的字体
FontBold 标题字体是否为粗体 FontSize 标题字体的大小
FontItalic 标题字体是否为斜体 ForeColor 标题字体的颜色
Width 对象的宽度 Height 对象的高度
Left 对象左边距离 Top 对象顶部距离
BackColor 对象的背景颜色 Visible 对象运行时是否可见
Enable 对象是否可用 ControlSource 指定与对象绑定的数据源

事件

类别 事件名 说明
鼠标事件 Click 在对象上单击鼠标左键时触发的事件
鼠标事件 DblClick 在对象上双击鼠标左键时触发的事件
鼠标事件 MouseMove 鼠标指针移动到对象上时触发的事件
鼠标事件 PightClick 在对象上单击鼠标右键时触发的事件
键盘事件 KeyPress 按下键盘的按键时触发的事件
控制焦点事件 GotFocus 对象获得焦点时触发的事件
控制焦点事件 LostFocus 与Gotfocus相反,对象失去焦点时触发的事件
改变控件内容事件 InteractiveChange 用户手动修改对象的值时触发的事件
改变控件内容事件 ProgrammaticChange 程序自动修改对象的值时触发的事件
表单事件 Load 创建(运行)表单时触发的事件
表单事件 Unload 关闭表单时触发的事件
表单事件 Resize 改变表单大小时触发的事件
表单事件 Activate 激活表单时触发的事件
表单事件 Deactivate 表单转变为非激活状态时触发的事件
表单事件 Init 创建对象时触发的事件
表单事件 Destroy 表单从内存中释放时触发的事件
数据环境事件 BeforeOpenTables 表打开前触发的事件
数据环境事件 AfterCloseTables 表关闭后触发的事件
计时器 imes 计时器计时到时触发的事件
出错 Error 程序在执行过程中出错时触发的事件

对象的引用

  1. 相对引用:从正在编写事件代码的对象(关键字this表示该对象)出发,向高一级(.parent)或低一级(.[对象名])逐层引用。

  2. 绝对引用:从最高层对象开始向低一级逐层引用。

  3. 关键字:thisform (当前对象所在的表单)和 thisformset(当前对象所在的表单集)。

    • 当在Command2上点击鼠标左键时:

      • thisform.pageframe1.page1.Command2.Caption = “确定”

控件

控件 描述
Label 用于显示文本信息的标签
Text 用于单行文本的输入框
Editbox 用于多行文本的编辑框
Command 命令按钮
Commandgroup 命令按钮组
Optiongroup 单选按钮组
Checkbox 复选框
Combobox 组合框,可以输入、可以下拉选项
Listbox 列表选择框
Spinner 微调按钮
Grid 二维表格
Imaage 用于显示图片的图像控件
Timer 能在一定时间循环执行行代码的定时器
PageFrame 包含若干页的页框
Line 水平线、垂直线或斜线
Shape 方框、圆或椭圆

 

面向对象程序设计的基本概念

  1. 对象

    • 现实生活中的对象就是一个具体的事物。

    • 在面向对象的程序设计中,对象是一个具有属性和方法的实体,是面向对象程序设计的基本元素

  2. 对象的属性和属性值

    • 现实生活中的每个对象有许多特性,每个特性有一个具体的值。

    • 在面向对象程序设计中,对象的特性称为对象的属性,描述对象特性的具体数据成为属性值。

  3. 事件和方法

    • 事件就是对象可以识别和相应的操作。它是预先定义的特定的操作。

    • 方法就是事件发生时对向执行的操作。

    • 调用格式

    • <表单>.<对象名>.<方法名>

    • thisform.release 关闭当前表单
      thisform.hide 隐藏当前表单
      thisform.show 显示当前表单
      thisform.refresh 刷新当前表单
      thisform.text1.setfocus 自动将焦点移动到text1文本框
  4. 类和子类

    • 某一种类型的对象具有一些共同的属性,将这些共同属性抽象出来就组成一个类。

    • 子类并不只是单纯地继承父类的属性,子类还具有各自特殊的属性。

  5. 类的继承性

    • 子类继承父类的属性说明类具有继承性。类的继承性使用户可以充分利用现有类派生出子类。

    • 类的继承性使得对父类所做的修改自动反馈到它的所有子类上。

  6. 类和对象的封装性

    • 现实生活中使用某些对象时,用户主要关心使用该对象的方法,而更少关心对象的内部属性。

    • 在Visual FoxPro 中,类也将对象的共同属性和方法封装在其内部,使得类派生出的对象也具有这些属性和方法。

面向对象程序设计方法简介

  1. 程序的事件驱动机制

    • 结构化的程序按照预定的流程执行。面向对象的程序则按照事件发生的顺序执行程序代码,这就是面向对象程序的事件驱动机制。

  2. 面向对象程序设计的基本方法

    • 由于面向对象程序事件驱动机制的优越性,使用面向对象的程序设计方法编写程序时,重点应考虑程序运行中可能产生的每一个事件和对应的方法以及用户界面的美观性。

      1. 设计应用程序界面

      2. 设置对象的属性值

      3. 编写事件过程

      4. 保存程序

      5. 运行调试程序

    • 案例6.1 设计应用程序正是按照这种方法,首先新建表单,并向表单设计器添加控件,设计用户界面,其次使用属性窗口设置对象的属性值,之后在代码窗口编写命令按钮的Cilck事件过程,最后保存程序和运行程序。

    • 使用Visual FoxPro 开发应用程序的基本方法并不是一成不变的。

表单

创建表单

  • Visual FoxPro 提供了多种创建表单的方法

  1. 使用命令创建表单

    • create form <表单文件名>

  2. 运行表单

    • do form <表单文件名>

  3. 打开表单

    • modify form <表单文件夹名>

表单的常用属性、方法和事件
  1. 表单常用属性
    • 属性 说明 默认值
      AlwaysOnTop 指定表单是否总是显示在其他打开的表单之上
      AutoCenter 指定表单初始化时是否让表单自动地在系统主窗口中居中
      BackColor 指定表单的背景颜色 21,12,12
      BorderStyle 指定表单的边框样式:0-关边框、1-单线边框、2-固定对话框、3-可调边框 form1,2
      Caption 指定表单标题栏显示的文本
      Closable 指定是否能通过单击右上角的“关闭框”来关闭表单
      Height 指定表单的高度
      MaxButton 指定表单右上角是否显示最大化按钮
      Minbutton 指定表单右上角是否显示最小化按钮
      Mowable 指定表单是否能够移动
      Picture 指定表单的背景图片  
      Scollbars 指定表单所具有的滚动条类型。可取值为:0-关,1-水平,2-垂直,3-即水平又垂直 0-关
      Titlebar 指定表单顶部是否显示标题栏(title) 1-开
      Width 指定表单的宽度  
      Windowstate 指定表单刚打开时是最小化、最大化还是正常显示状态 0-普通
      Visible 指定表单是显示还是隐藏
      WindowsType 指定是“关模式表单”还是“模式表单” 0-关模式
      Icon 指定表单的图标,显示在表单的左上角
      Name 指定表单的名称(在代码中引用时用的,与文件名没有关系) form1,2.。。
      1. Name、Caption和文件名和区别

        • Name:表单对象名,只在变成时使用

        • Caption:表单标题名,运行时显示在标题位置处:

        • 文件名:表单对应的文件名

      2. Visible与Enabled的区别

        • Visible:指定表单是否可见

        • Enabled:指定表单是否可用,或者是否可以响应用户的请求。

      3. “模式”与“非模式”的区别

        • 模式:只有本表单退出时,才可以激活别的表单。

        • 非模式:不关闭本表单,就可激活别的表单。

  2. 表单常用事件

    • Load事件:装载表单(创建表单之前)时,将会激发这个事件,而且表单被加载进内存;

    • Init事件:表单初始化(创建表单)时,将会激发这个事件;

    • Activate事件:表单激活时,将会激发这个事件;

    • GotFocus事件:表单接收焦点,由用户动作,或者在代码中使用SetFocus方法引起。

    • LostFocus事件:表单失去焦点时,将激活这个事件

    • Destroy事件:表单从内存中释放时,将会激发这个事件;

    • Unload事件:关闭表单时,将会激发这个事件,而且表单从内存中释放,在Destroy事件激发且所有包含的对象被释放后,才会激发Unload事件;

    • Deactivate事件:当表单不再处于激活状态时,将会激发这个事件;

    • Resize:改变表单大小时,将会激发这个事件;

    • Click:单击鼠标左键时,将会激发这个事件;

    • DblClick:双击鼠标左键时,将会激发这个事件;

    • RightClick:单击鼠标右键时,将会激发这个事件;

    • MouseDown、MouseUp、MouseMove三个常用的鼠标事件:在表单上按下鼠标、释放鼠标、移动鼠标时触发。

  3. 表单常用方法

    • Release方法:关闭、释放表单;

    • Refresh方法:重新绘制表单,并刷新表单中所有控件的属性。

    • Show方法:显示被隐藏的表单,相当于将表单的Visible属性这为.T.。

    • Hide方法:隐藏表单,相当于将表单的Visible属性这为.F.。

标签控件和文本框(TextBox)控件

  1. 标签控件的功能

    • 标签主要用于显示固定的文本信息。

  2. 标签控件常用属性

    • caption:指定标签的现实文本。可以在设计时设置,也可以在程序运行时设置或修改。

    • autosize:zutosize如果为真,标签在表单中的大小由caption属性中的文本长度决定,否则其大小由WIDTH和HEIGHT属性决定。

    • forecolor:设置标题的字体颜色。

    • backstyle:设置标签的背景是否透明,0透明,1不透明,默认为不透明。

    • name:标签对象的名称,是程序中访问标签的对象的标识。

  3. 文本框控件的功能:

    1. 用于显示和接收单行文本信息(不设置ControlSource属性),默认输入类型为字符型,最大长度为256个字符。

    2. 用于显示和编辑对应变量或字段的值(设置ControlSource属性为已有变量或字段名)。

  4. 文本框控件常用属性

    • ControlSource:设置文本框的数据来源。一般情况下,可以利用该属性为文本框指定一个字段或内存变量。

    • Value:保存文本框的当前内容,如果没有为ControlSource属性指定数据源,可以通过该属性访问文本框的内容。他的处置决定文本框中的类型。如果为ControlSource属性指定了数据源,该属性值与ControlSource属性指定的变量或字段的值相同。

    • PasswordChar:设置输入口令是显示的字符。

    • Readonly:确定文本框是否为只读,为T时,文本之不可修改。

命令按钮(CommandButton)控件和编辑框(EditBox)控件

  1. 命令按钮控件功能

    • 用来启动某个事件代码、完成特定功能。

  2. 命令按钮控件常用属性

    • Default:命令按钮的Default属性默认值为F,如果该属性设置为T,在该按钮所在的表单激活的情况下,按Enter,可以激活该按钮,并执行该按钮的Click事件代码。一个表单只能有一个按钮的Default属性为真。

    • Cancel:命令按钮的Cancel属性默认值为F,如果设置为T,在该案耨所在的表单激活的情况下,按Esc建可以激活该按钮,并执行该按钮的Click事件代码。一个表单只能有一个按钮的Cancel属性为真。

    • Caption:设置按钮的标题。

    • Enable:确定按钮是否有效,如果按钮的属性Enable为F,单击该按钮不会引发该按钮的单击事件。

  3. 编辑框控件的功能

    • 用于显示和编辑多行文本信息。在编辑框中能够选择、剪切、粘贴以及复制正文,可以实现自动换行,能够有自己的垂直滚动条。

  4. 编辑框常用属性

    • ControlSource:设置编辑框的数据源,一般为数据表的备注字段。

    • Value:保存编辑框中的内容,可以通过该属性来访问编辑框中的内容。

    • SelText:返回用户在编辑区内选定的文本,如果没有选定任何文本,则返回空串。

    • SelLength:返回用户在文本输入区中所选定字符的数目。

    • Readonly:确定用户是否能修改编辑框中的内容。

    • Scroolbars:指定编辑框是否具有滚动条,当属性值为0时,编辑框没有滚动条,当属性值为2(默认值)时,编辑框包含垂直滚动条。

选择组(OptionGroup)控件和列表框(ListBox)控件

  1. 选项组控件的功能

    • 是包含选项按钮的一种容器。一个选项组中往往包含若干个选项按钮,但用户只能从中选择一个按钮。当用户单击某个选项按钮时该按钮即成为备选中状态,而选项组中的其他选项按钮时,不管原来什么状态,都变为未选中状态,被选中的选项按钮中会显示一个圆点。

  2. 选项组常用属性

    • ButtonCount:指定选项组中选项按钮的数目。

    • Value:用于指定选项组中那个选项按钮被选中。

    • ControlSource:指定选项组数据源。

    • Buttons:用于存取选项组中每个选项的数组。

  3. 列表框的功能

    • 列表框提供一组条目(数据项),用户可以从中选择一个或多个条目,一般情况下,列表框显示其中的若干条目,用户可以通过滚动条浏览其他条目。

  4. 列表框常用属性

    • RowSourceType:指明列表框数据源的类型,可以为SQL语句、字段、别名、查询

    • RowSource:指定列表框的数据源

    • list属性:用以存取列表框中数据条目的字符串数组。

    • ListCount属性:列表框中数据条目的数目

    • ColumnCount属性:指定列表框的列数

    • Value属性:返回列表框中被选中的条目

    • ControlSource属性:将从列表框汇总选择的结果绑定指定的字段变量或内存变量上。

    • Selected属性:该属性是一个逻辑型数组,第n个数组元素代表第n个数据项是否为选定状态

    • MultiSelect属性:指定用户能否在列表框空间内进行多重选定(0或F不能,1或T允许,Ctrl+单击。)

  5. 列表框的常用方法

    • AddItem:把一个选项加入列表框

      • 格式:Control.AddItem(cltem[,nlndex] [,nColumn])

      • 其中cltem:是将要加入列表框的选项,必须是字符串表达式。

      • nlndex:指定数据项添加到列表框的位置。如果指定了有效的nlndex值,cltem将添加在列表框相应的位置处。

      • nColumn:指定控制的列,新数据项加入到此列中。

    • AddListltem:与与addltem类似,都是把一个列表项加入列表框中。只不过是addlistltem的参数是某个列表框的列表项,而不是字符串表达式。例如:

      • thisform.list2.addlistitem

      • (thisform.list1.listitem[1])

      • 将list1中第一个列表项添加到list2中

      • Clear:用于清除列表项中的所有列表项。

      • RemoveItem:用于删除列表框中的的列表项。

      • Index:被删除列表项在列表框中的序号。