MySQL中的表操作及查询方式
<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">一.表操作</a></li><ul class="second_class_ul"><li><a href="#_lab2_0_0">1.插入数据</a></li><li><a href="#_lab2_0_1">2.更新数据</a></li></ul><li><a href="#_label1">二.查询</a></li><ul class="second_class_ul"><li><a href="#_lab2_1_2">1.查找数据</a></li><ul class="third_class_ul"><li><a href="#_label3_1_2_0">(1)整体查找</a></li><li><a href="#_label3_1_2_1">(2)定向查找</a></li></ul><li><a href="#_lab2_1_3">2.排序数据</a></li><ul class="third_class_ul"></ul><li><a href="#_lab2_1_4">3.筛选数据</a></li><ul class="third_class_ul"></ul><li><a href="#_lab2_1_5">4.更新数据</a></li><ul class="third_class_ul"></ul><li><a href="#_lab2_1_6">5.删除数据</a></li><ul class="third_class_ul"></ul><li><a href="#_lab2_1_7">6.截断表</a></li><ul class="third_class_ul"></ul><li><a href="#_lab2_1_8">7.聚合函数</a></li><ul class="third_class_ul"></ul><li><a href="#_lab2_1_9">8.数据分组</a></li><ul class="third_class_ul"></ul></ul><li><a href="#_label2">总结</a></li><ul class="second_class_ul"></ul></ul></div><p class="maodian"><a name="_label0"></a></p><h2>一.表操作</h2><p>MySQL的操作中,一些专用的词<strong>无论是大写还是小写都是可以通过的</strong>。</p>
<p class="maodian"><a name="_lab2_0_0"></a></p><h3>1.插入数据</h3>
<div class="jb51code"><pre class="brush:sql;">INSERT table_name (列名称…)VALUES (列数据…), (列数据…);</pre></div>
<p><strong>"[]"表示可有可无</strong>,插入时,<strong>如果不指定要插入的列,则表示默认全部列都要插入数据,插入数据的顺序必须和列的顺序一致</strong>。</p>
<p>如果插入单行数据,则只需一个"()“,如果想要多行插入,则可以同时追加多个”()"。</p>
<p class="maodian"><a name="_lab2_0_1"></a></p><h3>2.更新数据</h3>
<p>此外,由于<strong>主键</strong>或者<strong>唯一键</strong>对应的值已经存在而导致插入失败,则可以<strong>更新数据:</strong></p>
<div class="jb51code"><pre class="brush:sql;">INSERT INTO 表名称 (列名称…) VALUES (列数据…) ON DUPLICATE KEY UPDATE 列名称=新数据…;</pre></div>
<p>除这条语句之外,还有一条语句,名为<strong>替换</strong>,也可以解决主键或唯一键冲突问题:</p>
<div class="jb51code"><pre class="brush:sql;">REPLACE INTO 表名称(列名称…) VALUES (列数据…);</pre></div>
<p>如果没有发生冲突,就相当于直接插入,如果发生冲突,则删除原有数据,重新插入新数据。</p>
<p class="maodian"><a name="_label1"></a></p><h2>二.查询</h2>
<p class="maodian"><a name="_lab2_1_2"></a></p><h3>1.查找数据</h3>
<p class="maodian"><a name="_label3_1_2_0"></a></p><h4>(1)整体查找</h4>
<p><strong>全列查询</strong></p>
<div class="jb51code"><pre class="brush:sql;">select * from 表名称;</pre></div>
<p><strong>指定列查询</strong></p>
<div class="jb51code"><pre class="brush:sql;">select 列名称…from 表名称;</pre></div>
<p><strong>查询字段表达式</strong></p>
<div class="jb51code"><pre class="brush:sql;">select 列名称… 表达式 from 表名称;</pre></div>
<p>例如:</p>
<div class="jb51code"><pre class="brush:sql;">SELECT id, name, 10 FROM exam_result;
±–±-------±—+
| id | name | 10 |
±–±-------±—+
| 1 | 张三 | 10 |
| 2 | 李四 | 10 |
| 3 | 王五 | 10 |
| 4 | 赵六 | 10 |</pre></div>
<p>如果表达式与字段无关,则会生成一列表达式数据。</p>
<div class="jb51code"><pre class="brush:sql;">SELECT id, name, english + 10 FROM exam_result;
±–±--------±----------------+
| id | name | english + 10|
±–±--------±----------------+
| 1 |张三 | 66 |
| 2 |李四 | 87 |
| 3 |王五 | 100 |
| 4 |赵六 | 77 |</pre></div>
<p>表达式与字段有关:生成表达式为english + 10即将学生的英语成绩+10分的列并显示。</p>
<div class="jb51code"><pre class="brush:sql;">SELECT id, name, chinese + math + english FROM exam_result;</pre></div>
<p>还有如上表达式,表示显示学生汉数英的成绩之和。</p>
<div class="jb51code"><pre class="brush:sql;">SELECT id, name, chinese + math + english 总分 FROM exam_result;</pre></div>
<p>还可以给表达式指定别名,即<strong>在表达式后追加别名</strong>。</p>
<div class="jb51code"><pre class="brush:sql;">SELECT DISTINCT 字段 FROM 表名称;</pre></div>
<p>通过DISTINCT,可以<strong>将查询结果去重</strong>。</p>
<p class="maodian"><a name="_label3_1_2_1"></a></p><h4>(2)定向查找</h4>
<p>上边的查找操作,都是对一整个列的数据进行查找,如果我们想要对列中的特定数据进行查找,则可以通过<strong>WHERE</strong> <strong>条件。</strong></p>
<p><strong>比较运算符:</strong></p>
<ul><li><strong>>, >=, <, <=</strong> :大于,大于等于,小于,小于等于</li><li><strong>=</strong> :等于,NULL 不安全,例如 NULL = NULL 的结果是 NULL</li><li><strong><=></strong> :等于,NULL 安全,例如 NULL <=> NULL 的结果是 TRUE(1)</li><li><strong>!=, <></strong> :不等于</li><li><strong>BETWEEN a0 AND a1</strong> :范围匹配,,如果 a0 <= value <= a1,返回 TRUE(1)</li><li><strong>IN (option, …)</strong> :如果是 option 中的任意一个,返回 TRUE(1)</li><li><strong>IS NULL</strong> :是 NULL</li><li><strong>IS NOT NULL</strong> :不是 NULL</li><li><strong>LIKE</strong> :模糊匹配。% 表示任意多个(包括 0 个)字符;_ 表示任意一个字符</li></ul>
<p><strong>逻辑运算符:</strong></p>
<ul><li><strong>AND</strong> :多个条件必须都为 TRUE(1),结果才是 TRUE(1)</li><li><strong>OR</strong> :任意一个条件为 TRUE(1), 结果为 TRUE(1)</li><li><strong>NOT</strong> :条件为 TRUE(1),结果为 FALSE(0)</li></ul>
<p><strong>where基本使用</strong></p>
<div class="jb51code"><pre class="brush:sql;">select 字段… from 表名称 where 条件;</pre></div>
<p>例如,查找一张成绩表中,英语不及格的学生名单:</p>
<div class="jb51code"><pre class="brush:sql;">SELECT name, english FROM exam_result WHERE english < 60;</pre></div>
<p>多个条件可以通过<strong>逻辑运算符</strong>相互组合。</p>
<p>如果现在要查找一个同学,但是不记得他的全名,只记得他的<strong>姓为孙</strong>,该怎么找到他呢?</p>
<div class="jb51code"><pre class="brush:sql;">SELECT name FROM exam_result WHERE name LIKE ‘孙%';
SELECT name FROM exam_result WHERE name LIKE ‘孙_';</pre></div>
<p>通过 <strong>“LIKE”</strong> 条件, 其中 <strong>‘%’</strong> 表示该同学的名字可以是<strong>任意数量的字符</strong>,<strong>‘_’</strong> 表示该同学的名字<strong>只有一个字</strong>。</p>
<p>值得注意的是,在MySQL中,<strong>null 、0、和空字符’ ',三者互不相干</strong>,执行相关的查询时应注意。</p>
<p class="maodian"><a name="_lab2_1_3"></a></p><h3>2.排序数据</h3>
<p>对数据进行排序通常是查找到对应数据后的操作。</p>
<blockquote><p>select 列名称… from 表名称 ORDER BY 列名称 排序方式;</p></blockquote>
<ul><li>– ASC 为升序(从小到大)</li><li>– DESC 为降序(从大到小)</li><li>– 如果不指明排序方式,则默认为 ASC</li></ul>
<p>当数据中有null时,<strong>null视为比任何值都小</strong>。</p>
<p>此外,当出现多字段排序,比如:查询同学各门成绩,依次按 数学降序,英语升序,语文升序的方式显示,<strong>查询后的结果并不是说,就是按照上述排序方式将单独的科目进行排序</strong>,而是<strong>按照书写优先级</strong>,<strong>先将整体数据按照数学降序排序,如果出现数学成绩相等,再将其后的英语成绩按照升序排序,如果英语成绩也相等,则最后排序语文成绩</strong>。</p>
<p class="maodian"><a name="_lab2_1_4"></a></p><h3>3.筛选数据</h3>
<p>当数据量过大时,如果直接查询,可能会引起诸多不便,比如直接就显示到了数据的末尾几行。</p>
<p>因此可以通过<strong>LIMIT 按行筛选数据</strong>的方式来查询对应行的数据信息:</p>
<ul><li>起始下标为 0</li><li>从 0 开始,筛选 n 条结果</li><li>SELECT 列名称…FROM 表名称LIMIT n;</li><li>从 s 开始,筛选 n 条结果</li><li>SELECT 列名称… FROM 表名称LIMIT s, n;</li><li>从 s 开始,筛选 n 条结果,比第二种用法更明确,建议使用</li><li>SELECT 列名称… FROM 表名称LIMIT n OFFSET s;</li></ul>
<p>因此当我们对未知表进行查询时,最好加一条 LIMIT 1,避免因为表中数据过大,查询全表数据导致数据库卡死。</p>
<p class="maodian"><a name="_lab2_1_5"></a></p><h3>4.更新数据</h3>
<p><strong>数据更新必须配合where使用</strong>,因为你不可能将一整列的数据全部更新,一般都是<strong>对特定行的数据进行更新</strong>。</p>
<div class="jb51code"><pre class="brush:sql;">UPDATE 表名称 SET 列名称 = 新数据[, column = expr …] </pre></div>
<p>可以同时对某一行的<strong>多个数据进行更新</strong>,也可以对更新后的数据进行<strong>排序筛选等操作</strong>。</p>
<p>值得注意的是,当需要对某数据进行加减运算时,在MySQL中<strong>不支持 “+=” 等操作</strong>,必须采用 <strong>“新数据 = 原数据 + 改变值”</strong> 的方式。</p>
<p class="maodian"><a name="_lab2_1_6"></a></p><h3>5.删除数据</h3>
<div class="jb51code"><pre class="brush:sql;">DELETE FROM table_name </pre></div>
<p>删除数据时,可以使用where来指定要删除的数据,<strong>如果不使用where,则默认为删除整张表的全部数据</strong>。</p>
<p>值得注意的是,删除数据不会影响表的各种结构定义,就仅仅是删除插入的数据,<strong>诸如表字段的类型,以及表的各种约束条件等都不会受到影响</strong>。</p>
<p>特别要注意的是,<strong>delete删除数据,不会对自增长****AUTO_INCREMENT产生影响</strong>,比如说原本自增长已经到了5,此时删除全部数据,在进行插入,自增长依然会为6。</p>
<p class="maodian"><a name="_lab2_1_7"></a></p><h3>6.截断表</h3>
<div class="jb51code"><pre class="brush:sql;">TRUNCATE table_name;</pre></div>
<p>截断表truncate,同样是清空表的全部数据,与delete不同的是,<strong>它会将自增长****AUTO_INCREMEN同样清除,从AUTO_INCREMEN的初始值从头开始增长</strong>。</p>
<p class="maodian"><a name="_lab2_1_8"></a></p><h3>7.聚合函数</h3>
<ul><li><strong>COUNT( expr)</strong> :返回查询到的数据的 <strong>数量</strong></li><li><strong>SUM( expr)</strong> :返回查询到的数据的 <strong>总和</strong>,不是数字没有意义</li><li><strong>AVG( expr)</strong> :返回查询到的数据的 <strong>平均值</strong>,不是数字没有意义</li><li><strong>MAX( expr)</strong> :返回查询到的数据的 <strong>最大值</strong>,不是数字没有意义</li><li><strong>MIN( expr)</strong> :返回查询到的数据的 <strong>最小值</strong>,不是数字没有意义</li></ul>
<p>聚合函数可以选择<strong>对去重后的数据操作</strong>,通常和数据查找共同使用,例如<strong>查找某表总共有多少行</strong>:</p>
<div class="jb51code"><pre class="brush:sql;">SELECT COUNT(*) FROM 表名称;</pre></div>
<p>使用 * 做统计,不受 NULL 影响。</p>
<p class="maodian"><a name="_lab2_1_9"></a></p><h3>8.数据分组</h3>
<p>在select中使用group by 子句可以对指定列进行分组查询。</p>
<div class="jb51code"><pre class="brush:sql;">select 列名称… from table group by 列名称;</pre></div>
<p>所谓分组查询,<strong>就是对表中某一列中的相同数据组合</strong>,例如,有一张完整的学生表数据,其中包含名称为班级号的字段,现在要查询每个班级分别有多少学生,就可以通过分组查询:</p>
<div class="jb51code"><pre class="brush:sql;">select class_id count(*)from studentgroup by class_id;</pre></div>
<p><strong>having</strong>和group by配合使用,对group by结果进行过滤,作用类似用where:</p>
<div class="jb51code"><pre class="brush:sql;">select 列名称… from table group by 列名称 having 过滤条件;</pre></div>
<p class="maodian"><a name="_label2"></a></p><h2>总结</h2>
<p>以上为个人经验,希望能给大家一个参考,也希望大家多多支持琼殿技术社区。</p>
頁:
[1]