mysql之DML(SELECT DELETE INSERT UPDATE)

DML:数据操作语言
    INSERT
    DELETE
    SELECT
    UPDATE

SELECT:
    SELECT SELECT-LIST FROM TBNAME|TBNAMES|SELECT ACTION QUALIFICATION

SELECT-LIST 搜索清单
            DISTINCT 去重,相同的值只显示一次。
            AS ALIAS  字段别名
            * 所有内容
            FIELD 字段名
            聚合计算函数:
                AVG(FIELD) 平均值
                MIN(FIELD) 最小值
                MAX(FIELD) 最大值
                SUM(FIELD) 求和
                COUNT(FIELD) 个数

FROM子句:要查询的关系,可以是单个表,多个表,或其他SELECT语句。

QUALIFICATION 搜索码,搜索关键字。

ACTION 指定对于搜索码的限定或操作:
            WHERE子句:指定一个布尔关系的表达式。
                算数操作:+、-、*、/、%(取余)
                比较操作:=、>、<、>=、<=、<>(不等于)、!=(不等于)、<=>(NULLsafe NULL的安全等于,即便是NULL也能进行安全的相等比较)
                逻辑操作:AND(&&)、OR(||)、NOT(!)、XOR(异或)
                特殊操作:
                    BETWEEN  介于2者之间
                    LIKE ‘PATTERN’  比较操作,符合PATTERN的。
                        % 任意长度任意字符
                        _ 任意单个字符
                    REGEXP|RLIKE ‘PATTERN’ 支持正则表达式的LIKE,注意使用这个就不能用索引
                    [NOT] IN (LIST) 是否符合列表中的
                    IS [NOT] NULL  跟NULL比较

ORDER BY  FIELDNAME [ASC|DESC] 将查询后的结果根据某个字段进行排序,默认是升序(ASC)排列。

LIMIT [OFFSET,] COUNT 只显示COUNT个结果,或从OFFSET(偏移量)个开始,显示
            CONUT个结果。

GROUP BY QUALIFICATION
                根据搜索码进行分组,主要的目的是为了求聚合函数。
                HAVING  QUALIFICATION 过滤,用于将GROUP BY的结果再次进行过滤。只能和GROUP BY一同使用。

查询执行顺序:
        start --> FROM --> WHERE --> GROUP BY --> HAVING --> ORDER BY --> LIMIT

单表查询:
        SELECT * FROM TBNAME 显示所有内容
        SELECT FIELD1,FIELD2,... FROM TBNAME  投影
        SELECT * FROM TBNAME WHERE QUALIFICATION 选择

多表查询:
        表的连接关系:
            交叉连接:笛卡尔乘积
            自然连接:表中字段建立等值关系

内连接:
                TBNAME1 [NEER] JOIN TBNAME2 ON QUALIFICATION
                两个表中至少存在一个匹配,返回所在行。

外连接:
                左外连接:TBNAME1 LEFT JOIN TBNAME2 ON QUALIFICATION
                返回左侧表中指定的行,无论右侧表中是否有匹配。

右外连接:TBNAME1 RIGHT JOIN
                TBNAME2 ON QUALIFICATION 返回右侧表中指定的行,无论左侧表中是否有匹配。

全连接:TBNAME1 FULL JOIN TBNAME2 ON QUALIFICATION
                两个表中只要有匹配,就返回对应的行。

自连接:自己和自己连接,通过AS ALIAS的方式来实现。

子查询(嵌套查询):
        比较操作:只能返回单行单值
        在IN()中使用
        在FROM中使用

联合查询:
        UNION:
            将多个SELECT语句的结果集进行合并。

注意:字段的数据类型必须一致。

默认只显示不同值,若有重复值想全部显示使用UNION ALL。
            (SELECT语句1) UNION (SELECT语句2)
            或
            (SELECT语句1) UNION ALL (SELECT语句2)

实例:
    1.显示test库中courese表的所有内容:
        #mysql -uroot -p
        mysql>USE test;
        mysql>SELECT * FROM courses;

2.使用投影方式显示学生表中的名字和年龄:
        mysql>SELECT * FROM studnets;
        mysql>SELECT Name,Age FROM students;

3.使用选择方式显示学生表中年龄大于20的
        mysql>SELECT * FROM students WHERE Age>=20;

4.综合使用投影和选择。显示students表中性别为男的名字和年龄。
        mysql>SELECT Name,Age FROM students WHERE Gender=‘M’;

5.显示students表中的性别:
        mysql>SELECT DISINCT Gender FROM students;

6.显示students中年龄+1大于20的名字和年龄:
        注意这样直接使用可能无法使用索引。
        mysql>SELECT Name,Age FROM students WHERE Age+1>20;

7.显示students中年龄大于20的男性:
        mysql>SELECT Name,Age FROM students WHERE Age>20 AND Gender=‘M‘;

8.显示students中年龄不大于20,且性别不为男性:
        mysql>SELECT Name,Age,Gender FROM students WHERE NOT (Age>20 OR Gender=‘M‘);

9.显示students中年龄在20-25之间的同学:
        mysql>SELECT  Name,Age,Gender FROM students WHERE Age>=20 AND AGE<=25;
        msyql>SELECT  Name,Age,Gender FROM students WHERE Age BETWEEN 20 AND 25;

10.显示students中姓名以Y开头的:
        mysql>SELECT Name,Age FROM students WHERE Name LIKE ‘Y%‘;

11.显示students中姓名以Y开头,总长5个字符的:
        mysql>SELECT Name,Age FROM students WHERE Name LIKE ‘Y____‘;

12.显示students中姓名里包含ing的:
        mysql>SELECT Name,Age FROM students WHERE Name LIKE ‘%ing%‘;

13.显示students中姓名以M或N或Y开头的:
        mysql>SELECT Name,Age FROM students WHERE Name RLIKE ‘^[MNY].*’;

14.显示students中年龄为18 20 25 的:
        mysql>SELECT Name,Age FROM students WHERE Age IN (18,20,25);

15.显示students中CID2为空的名字:
        mysql>SELECT Name FROM students WHERE CID2 IS NULL;

15.显示用户的姓名并排序:
        mysql>SELECT Name FROM students ORDER BY Name;

16.别名显示:
        mysql>SELECT Name AS StudName FROM students;

17.仅显示前3个结果:
        mysql>SELECT Name FROM students LIMIT 3;

18.从第2个结果以后开始显示,共显示3个:
        mysql>SELECT Name FROM students LIMIT 2,3;

19.聚合函数:
        mysql>SELECET AVG(Age) FROM sutdents WHERE Gender=‘M‘ 男同学年龄的平均值
        mysql>SELECET COUNT(Age) FROM sutdents; 同学年龄的个数

20.根据性别分组计算年龄的平均值:
        mysql>SELECT AVG(Age) FROM students GROUP BY Gender;

21.根据CID求同学选修课的个数:
        mysql>SELECT COUNT(CID) AS Persons,CID FROM students GROUP BY CID;

22.显示选修课个数大于2个的:
        mysql>SELECT COUNT(CID) AS Persons,CID FROM students GROUP BY CID HAVING Persons>=2;

23.多表查询(交叉连接):
        mysql>SELECT * FROM students,courses;

24.多表查询(自然连接):
        假设有students表和courses表,从2张表中查询学生名称和对应的课程名称:
        mysql>SELECT students.Name,courses.Cname FROM sutdents,course WHERE sutdents.CID=courses.CID;

25.使用别名:
        mysql>SELECT s.Name,c.Cname FORM studnets AS s,courses AS c WHERE s.CID=c.CID;

26.多表查询(外连接)显示同学选择的课程,有名字显示名字,没有显示为空。CID1为选择的第一门课。
        mysql>SELECT s.Name,c.Cname FROM students AS s LEFT JOIN courses AS c ON s.CID1=c.CID

27.接上题,显示课程对应的同学名字,有名字显示名字,没有显示为空。
        mysql>SELECT s.Name,c.Cname FROM students AS s RIGHT JOINcourses AS c ON s.CID1=c.CID;

28.自连接,假设students表中有TID,表示该课程的导师编号,导师编号就是SID。显示同学名字和对应的导师名字
        mysql>SELECT s.Name AS stu,c.Name AS teacher FROM students AS s,students AS c WHERE  s.SID=c.SID;

29.显示表中年龄大于平均年龄的同学
        mysql>SELECT Name FROM students WHERE Age> (SELECT AVG(Age) FROM students);

30.显示学生中年龄和老师一样的
        mysql>SELECT Name FROM students WHERE Age IN (SELECT Age FROM Tutor);

31.显示所有同学的名字和年龄并显示年龄大于等于20的
        mysql>SELECT Name,Age FROM (SELECT Name,Age FROM students) AS t WHERE t.Age >=20;

32.将students表和tutor表中查询到的Name和Age进行合并
        mysql>(SELECT Name,Age FROM students) UNION (SELECT Tname,Age FROM tutor) ;

33.显示courses表中没有被students表中出现在CID2的课程的名称:
        mysql>SELECT Cname FROM courses WHERE CID NOT IN(SELECT DISTINCT CID2 FROM students WHERE CID2 IS NOT NULL);

34.显示在courses表中的没有代课的老师名字,CID课程编号 Cname课程名称 和TID教师编号,tutors表中为老师名字Tname和TID
        mysql>SELECT Tname FROM tutors WHRER TID NOT IN (SELECT DISTINCT TID FROM courses);

35.显示students表中CID1有2个或2个以上同学学习的额课程的名称
        mysql>SELECT Cname FROM courses WHRER CID IN (SELECT  CID1 FROM students GROUP BY CID1 HAVING COUNT(CID1)>=2 );

36.显示每个老师和其教授的课程,没有教授的课程保持为NULL
        mysql>SELECT t.Tname,c.Cname FROM tutors AS t LEFT JOIN courses AS c ON t.TID=c.TID;

37.显示每个课程及其相关的老师,没有老师教授的课程将其老师显示为空
        mysql>SELECT t.Tname,c.Cname FROM tutors AS t RIGHT JOIN courses AS c ON t.TID=c.TID;

38.显示每位同学的CID1的课程及其老师名称
        mysql>SELECT Name,Cname,Tname FROM stutdents,courses,tutors WHERE students.CID=courses.CID AND courses.TID=tutors.TID

39.显示tutors中最后一行的数据:
        mysql>SELECT * FROM tutors ORDER BY TID DESC LIMIT 1;

INSERT:     
        
    INSERT INTO TBNAME (COL1,COL2,...) VALUES (VAL1,VAL
        2...)[,(VAL3,VAL4),...] 可以插入多行

INSERT INTO TBNAME SET COL1=VAL1,...; 插入一行

INSERT INTO  TBNAME (COL1,...) SELECT STATMENT  将搜索到的内容插入,注意格式要完全相同。

REPLACE INTO 和INSERT类似,提供替换功能。

插入的数据类型:
        字符型:单引号
        数值型:
        日期时间型
        空值:NULL
        空串:‘’

实例:
        1.向tutors表中插入新数据:
            mysql>INSERT INTO tutors (Tname,Gerder,Age) VALUES (tom,‘M‘,40),(jerry,‘F‘,33);

2.向totors表中插入单行数据:
            mysql>INSERT INTO tutors SET Tname=‘mike‘,Gender=‘F‘,Age=22;

3.将students表中年龄大于20的插入tutors表中:
            mysql>INSERT INTO tutors (Tname,Gernder,Age) SELECT Nname,Gender,Age FORM students WHERE Age>20;

DELETE:
    DELETE FROM TBNAME1,TBNAME2,... [WHERE]|[ORDER BY] |[LIMIT] 删除表

TRUNCATE TBNAME 清空表并重置AUTO_INCREMENT计数器。

实例:
        1.删除students表
            mysql>DELETE FROM students;

2.删除students表中年龄不大于18的行:
            msyql>DELETE FROM students WHERE Age<=18;

3.显示并清空students表并重置计数器

mysql>SHOW TABLE STATUS LIKE ‘students‘\G;
            mysql>SHOW VARIABLES LIKE ‘%last_insert_id%
            mysql>TRUNCATE students;

UPDATE
    UPDATE TBNMAE SET COL=VALUE [WHERE]|[ORDER BY] |[LIMIT]

实例:
        1,修改students表中tom的年龄和性别:
            mysql>UPDTAE students SET Age=30,Gernder=‘F‘ WHERE Name=‘tom‘;

时间: 2024-10-12 04:49:09

mysql之DML(SELECT DELETE INSERT UPDATE)的相关文章

MyBatis XML 映射器 select、insert update 和 delete、参数

MyBatis 的真正强大在于它的语句映射,这是它的魔力所在. 如果跟JDBC 代码进行对比,省掉了将近 95% 的代码. 1 selectCREATE TABLE person (id int(11) NOT NULL AUTO_INCREMENT,username varchar(100) DEFAULT NULL,password varchar(100) DEFAULT NULL,full_name varchar(100) DEFAULT NULL,first_name varchar

Mysql之1451 - Cannot delete or update a parent row: a foreign key constraint fails...解决办法记录

今天使用delete语句删除一张表中的一条信息时,提示了这么一个错误:1451 - Cannot delete or update a parent row: a foreign key constraint fails...错误代码为1451 在这里参考了一位园友的解决方案mysql删除外链解决办法,如下: 关闭外键约束 SET FOREIGN_KEY_CHECKS=0; 语句执行 DELETE FROM blog_blog WHERE blog_blog.id=91; 删除完成后,重新开启外

SQL系列(十二)—— insert update delete

前言 这个系列的前面都一直在介绍查询select.但是SQL中十分广泛,按对数据的不同处理可以分为: DML:全称Data Manipulation Language,从名字上可以看出,DML是对数据的维护管理语言,主要是处理数据本身: DDL:全称Data Definition Language,同样从名字上可以看出,DDL数据定义语言,主要用来操作库.表.视图.索引等,主要是对数据结构的操作: DCL:全称Data Control Language,从名字可以看出,是数据控制语言,主要用来控

mysql之select,insert,delete,update

写在前面 上篇文章学习了创建数据库和数据表,这篇文章将学习对数据表的增删改查操作. 系列文章 mysql之创建数据库,创建数据表 一个例子 上篇文章中,创建了数据库和数据表,数据表中还没有数据,这里我们为三张表中添加数据进行测试. 注意:为了避免字段名或者表明与系统的某些关键字重复,可以使用``包裹字符串,与sql server中的[]类似.``在键盘上方数字键最左边的那个键(英文输入法) 1.添加四个班级信息 use school; -- 添加班级信息 insert into tb_class

linux下mysql Insert update delete 事务 用户管理

linux下mysql Insert update delete  事务 用户管理 1.INSERT插入语句格式: INSERT INTO tb_name (字段1, 字段2, ...) VALUES (值1,值2, ...)[,(值1, 值2, ...),...]; INSERT INTO 表名 SET 字段1=值1,字段2=值2,...; INSERT INTO 表名 (字段1,字段2,...) SELECT (字段1,字段2,...) FROM 表名 [WHERE 条件]; 2.REPLA

DML -- 数据操纵预言: insert/delete/update --多表连接修改/.多表连接删除/多表连接查询-- truncate 和 delete的区别

/* DML -- 数据操纵预言: insert/delete/update */ #一: 插入语句 /* 语法1: insert into 表名(列名,..,列名....) values(值1,值2,...),(值1,值2,...),(值1,值2,...); 语法2: insert into 表名 set 列名1=值1,列名2=值2,....; */ /*二: 修改语句 1.修改单表的记录 语法: update 表名 set 列1=新值1,列2=新值2,列2=新值2... where 筛选条件

MySQL降低insert, update, delete的优先级来优化性能

数据库经常被多个用户访问,对处理什么情况已经用什么次序处理进行管理是MySQL的任务.insert 操作可能很耗时,尤其是有很多索引需要更新时, 而且它可能会降低等待处理的select语句的性能. 如果select是最重要的(通常也是这样的),那可以通过在insert 和into 之间添加关键字LOW_PRIORITY来指示MySQL降低insert 语句的优先级,如: INSERT LOW_PRIORITY INTO ... update 和 delete 也是一样的: UPDATE LOW_

sql serveri不用游标,适合于循环DML (update delete insert)的场合实例

use tempdb go if exists(select * from tempdb..sysobjects where id=object_id('tempdb..#tbl_Cursor')) DROP TABLE #tbl_Cursor if exists(select * from tempdb..sysobjects where id=object_id('tempdb..#tbl_Value')) DROP TABLE #tbl_Value go if object_id(N'te

元素类型为 &quot;mapper&quot; 的内容必须匹配 &quot;(cache-ref|cache|resultMap*|parameterMap*|sql*|insert*|update*|delete*|select)

在配置ssm框架的时候,写mapper映射文件的时候会出现 元素类型为 "mapper" 的内容必须匹配 "(cache-ref|cache|resultMap*|parameterMap*|sql*|insert*|update*|delete*|select) 有时候编译的时候会出现这个bug,是因为在前面写了注释.导致了执行顺序的问题.需要把一些注释删掉,就可以正常执行了. /*mapper动态开发*/ <mapper namespace="com.ss