您的位置:新葡亰496net > 网络数据库 > 新葡亰496net:详细实例,sql语句增删改查

新葡亰496net:详细实例,sql语句增删改查

发布时间:2019-10-30 00:37编辑:网络数据库浏览(153)

    又自学,把SQL的朝气蓬勃部分常用语句复习了一回。

    多表更新

    正文首要列举两张和三张表来说述多表连接查询。

    重新整建如下:

    假定大家有两张表,一张表为Product表寄存产品信息,当中有产品价格列Price;其余一张表是ProductPrice表,大家要将ProductPrice表中的价格字段Price更新为Price表中价位字段的百分之七十。 

    新建两张表:

    1增

    在Mysql中大家有三种手腕能够完结这或多或少,风流倜傥种是update table1 t1, table2 ts ...的措施:

    表1:student  截图如下:

    1.1【插入单行】
    insert [into] <表名> (列名) values (列值)
    例:insert into Strdents (姓名,性别,出寿辰期) values ('欢跃朋朋','男','1976/6/15')

    UPDATE product p, productPrice pp 
    SET pp.price = pp.price * 0.8 
    WHERE p.productId = pp.productId 
    AND p.dateCreated < '2004-01-01' 

    新葡亰496net 1

    1.2【将长存表数据加多到贰个本来就有表】
    insert into <原来就有的新表> (列名) select <原表列名> from <原表名>
    例:insert into tongxunlu ('姓名','地址','电子邮件')
    select name,address,email
    from Strdents

     

    表2:course  截图如下:

    1.3【间接拿现成表数据成立贰个新表并填写】
    select <新建表列名> into <新建表名> from <源表名>
    例:select name,address,email into tongxunlu from strdents

    其余风度翩翩种方法是使用inner join然后改进: 

    新葡亰496net 2
    (那时候这么建表只是为了演示连接SQL语句,当然实际支付中大家不会如此建表,实际支出中那多少个表会有友好不相同的主键。)

    1.4【使用union关键字合併数据进行插入多行】
    insert <表名> <列名> select <列值> tnion select <列值>
    例:insert Students (姓名,性别,出出生之日期)
    select '欢娱朋朋','男','一九八〇/6/15' union(union表示下意气风发行)
    select '紫褐小明','男','19**/**/**'

     

    一、外连接

    
    2删
    
    2.1【删除&lt;满足条件的&gt;行】  
    delete from &lt;表名&gt; [where &lt;删除条件&gt;]  
    例:delete from a where name='开心朋朋'(删除表a中列值为开心朋朋的行)
    
    
    2.2【删除整个表】  
    truncate table &lt;表名&gt;  
    truncate table tongxunlu  
    注意:删除表的所有行,但表的结构、列、约束、索引等不会被删除;不能用语有外建约束引用的表
    

    代码如下:

    外接连可分为:左连接、右连接、完全外接连。

    3改

    UPDATE product p 
    INNER JOIN productPrice pp 
    ON p.productId = pp.productId 
    SET pp.price = pp.price * 0.8 
    WHERE p.dateCreated < '2004-01-01' 

    1、左连接  left join 或 left outer join

    update <表名> set <列名=更新值> [where <更新规范>]
    例:update tongxunlu set 年龄=18 where 姓名='巴黎绿别名'

     

    SQL语句:select * from student left join course on student.ID=course.ID

    ~~~~~~~

    其他我们也得以使用left outer join来做多表update,举例说如果ProductPrice表中从未产品价格记录以来,将Product表的isDeleted字段置为1,如下sql语句: 

    实践结果:

    4查

    代码如下:

    新葡亰496net 3

    4.1``精确(条件)查询
    select <列名> from <表名> [where <查询条件发挥试>] [order by <排序的列名>[asc或desc]]

    UPDATE product p 
    LEFT JOIN productPrice pp 
    ON p.productId = pp.productId 
    SET p.deleted = 1 
    WHERE pp.productId IS null 

    左外连接包涵left join左表全体行,倘诺左表中某行在右表未有相称,则结果中对应行右表的部分全部为空(NULL).

    4.1.1【查询全数数据行和列】
    例:select * from a
    说明:查询a表中全部行和列

     

    注:当时大家不可能说结果的行数等于左表数据的行数。当然这里查询结果的行数等于左表数据的行数,因为左右两表那时为生机勃勃对生机勃勃关系。

    4.1.2【查询部分行列--条件查询】
    例:select i,j,k from a where f=5
    申明:查询表a中f=5的具有行,并显示i,j,k3列

    其余,上面的多少个例子都以两张表之间做涉嫌,然而只更新一张表中的笔录,其实是能够何况更新两张表的,如下sql: 

    2、右连接  right join 或 right outer join

    4.1.3【在查询中动用AS校订列名】
    例:select name as 姓名 from a where xingbie='男'
    表达:查询a表中性别为男的具有行,呈现name列,并将name列改名称为(姓名)呈现

    代码如下:

    SQL语句:select * from student right join course on student.ID=course.ID

    4.1.4【查询空行】
    新葡亰496net,例:select name from a where email is null
    表达:查询表a中email为空的具备行,并展现name列;SQL语句中用is null恐怕is not null来判别是或不是为空行

    UPDATE product p 
    INNER JOIN productPrice pp 
    ON p.productId = pp.productId 
    SET pp.price = pp.price * 0.8, 
    p.dateUpdate = CURDATE() 
    WHERE p.dateCreated < '2004-01-01' 

    实行结果:

    4.1.5【在询问中应用常量】
    例:select name, '唐山' as 地址 from Student
    表明:查询表a,展现name列,并丰裕地址列,其列值都为'邢台'

    两张表做涉嫌,更新了ProductPrice表的price字段和Product表字段的dateUpdate八个字段。

    新葡亰496net 4

    4.1.6【查询重临限定行数(关键字:top percent)】
    例1:select top 6 name from a
    表明:查询表a,展现列name的前6行,top为主要字
    例2:select top 60 percent name from a
    表明:查询表a,显示列name的十分六,percent为第一字

    ---------------------------------------------------------------------------------华丽分水线---------------------------------------------------------------------------------

    右外连接包涵right join右表全部行,如果左表中某行在右表未有相称,则结果中对应左表的局地全体为空(NULL)。

    4.1.7【查询排序(关键字:order by , asc , desc)】
    例:select name
    from a
    where chengji>=60
    order by desc
    注解:查询a表中chengji大于等于60的持有行,并按降序显示name列;默以为ASC升序

    多表查询

    注:同样当时咱们不能够说结果的行数等于右表的行数。当然这里查询结果的行数等于左表数据的行数,因为左右两表当时为风华正茂对大器晚成涉嫌。

    4.2``模糊查询
    4.2.1【使用like举行模糊查询】
    留意:like运算副只用于字符串,所以仅与char和varchar数据类型联合利用
    例:select * from a where name like '赵%'
    注解:查询突显表a中,name字段第三个字为赵的笔录

    新建两张表:

    3、完全外连接  full join 或 full outer join

    4.2.2【使用between在有个别范围内进行询问】
    例:select * from a where nianling between 18 and 20
    评释:查询显示表a中nianling在18到20之内的笔录

    表1:student      表2:course

    SQL语句:select * from student full join course on student.ID=course.ID

    4.2.3【使用in在罗列值内进行查询】
    例:select name from a where address in ('北京','上海','唐山')
    申明:查询表a中address值为京城抑或东京抑或南阳的笔录,展现name字段

      新葡亰496net 5      新葡亰496net 6

    实行结果:

    4.3``.分组查询
    4.3.1【使用group by进行分组查询】
    例:select studentID as 学员编号,AVG(score) as 平均成绩(注释:这里的score是列名)
    from score (注释:这里的score是表名)
    group by studentID
    证实:在表score中询问,按strdentID字段分组,突显strdentID字段和score字段的平均值;select语句中只允许被分组的列和为每一种分组重回的三个值的表明式,例如用二个列名作为参数的聚合函数

    (那时这么建表只是为了演示连接SQL语句,当然实际支出中大家不会如此建表,实际付出中那四个表会有和谐分化的主键。)

    新葡亰496net 7

    4.3.2【使用having子句实行分组筛选】
    例:select studentID as 学员编号,AVG(score) as 平均战绩(注释:这里的score是列名)
    from score (注释:这里的score是表名)
    group by studentID
    having count(score)>1
    表明:接上头例子,展现分组后count(score)>1的行,由于where只好在未曾分组时利用,分组后一定要选用having来节制标准。

    一、外连接

    一起外接连包涵full join左右两表中兼有的行,假诺右表中某行在左表中未有相称,则结果中对应行右表的生机勃勃部分全部为空(NULL),若是左表中某行在右表中从未相称,则结果中对应行左表的一些全部为空(NULL)。

    4.4``.多表联接查询

    外接连可分为:左连接、右连接、完全外接连。

    二、内连接  join 或 inner join

    4.4.1内联接

    1、左连接  left join 或 left outer join

    SQL语句:select * from student inner join course on student.ID=course.ID

    4.4.1.1【在where子句中钦赐联接条件】
    例:select a.name,b.chengji
    from a,b
    where a.name=b.name
    证实:查询表a和表b中name字段相等的笔录,并呈现表a中的name字段和表b中的chengji字段

    SQL语句:select * from student left join course on student.ID=course.ID

    推行结果:

    4.4.1.2【在from子句中选择join…on】
    例:select a.name,b.chengji
    from a inner join b
    on (a.name=b.name)
    说明:同上

     

    新葡亰496net 8

    4.4.2外联接

    施行结果:新葡亰496net 9左外连接包罗left join左表全体行,若是左表中某行在右表未有相配,则结果中对应行右表的一部分全部为空(NULL).

    inner join 是相比运算符,只回去契合条件的行。

    4.4.2.1【左外联接查询】
    例:select s.name,c.courseID,c.score
    from strdents as s
    left outer join score as c
    on s.scode=c.strdentID
    注解:在strdents表和score表中询问知足on条件的行,条件为score表的strdentID与strdents表中的sconde雷同

    注:那时候我们无法说结果的行数等于左表数据的行数。当然这里查询结果的行数等于左表数据的行数,因为左右两表这时候为生龙活虎对意气风发关系。

    这时候相当于:select * from student,course where student.ID=course.ID

    4.4.2.2【右外联接查询】
    例:select s.name,c.courseID,c.score
    from strdents as s
    right outer join score as c
    on s.scode=c.strdentID
    表明:在strdents表和score表中询问满意on条件的行,条件为strdents表中的sconde与score表的strdentID雷同

     

    三、交叉连接 cross join

     

    2、右连接  right join 或 right outer join

    1.定义:未有 WHERE 子句的断断续续联接将爆发连接所涉及的表的笛Carl积。第三个表的行数乘以第二个表的行数等于笛Carl积结果集的尺寸。

    下文首要列举两张和三张表来说述多表连接查询。

    SQL语句:select * from student right join course on student.ID=course.ID

    SQL语句:select * from student cross join course

    新建两张表:

    进行理并了结果:新葡亰496net 10右外连接满含right join右表全体行,假诺左表中某行在右表没有相配,则结果中对应左表的风度翩翩对全部为空(NULL)。

    实施结果:

    表1:student  截图如下:

    注:形似这时候我们不能够说结果的行数等于右表的行数。当然这里查询结果的行数等于左表数据的行数,因为左右两表当时为风流倜傥对黄金年代关乎。

    新葡亰496net 11

    新葡亰496net 12

     

    倘使大家在这时候给那条SQL加上WHERE子句的时候譬如SQL:select * from student cross join course where student.ID=course.ID

    表2:course  截图如下:

    3、完全外连接  full join 或 full outer join

    此刻将回来切合条件的结果集,结果和inner join所示推行结果意气风发律。

    新葡亰496net 13
    (那时那般建表只是为了演示连接SQL语句,当然实际支付中我们不会如此建表,实际支出中那多个表会有投机不相同的主键。)

    SQL语句:select * from student full join course on student.ID=course.ID

    四、两表关系为风流洒脱对多,多对风流倜傥或多对深刻的接连语句

    一、外连接

    推行结果:新葡亰496net 14完全外接连包罗full join左右两表中保有的行,若是右表中某行在左表中从不相称,则结果中对应行右表的片段全体为空(NULL),假使左表中某行在右表中并未相配,则结果中对应行左表的生机勃勃对全部为空(NULL)。

    道理当然是那样的上边两表为黄金年代对风度翩翩关乎,那么生机勃勃旦表A和表B为大器晚成对多、多对风姿洒脱或多对多的时候,我们又该怎么写连接SQL语句呢?

    外接连可分为:左连接、右连接、完全外接连。

     

    骨子里两表风流倜傥对多的SQL语句和相当的SQL语句的写法都大概,只是查询的结果不相仿,当然两表也要略有退换。

    1、左连接  left join 或 left outer join

    二、内连接  join 或 inner join

    比方表1的列能够改为:

    SQL语句:select * from student left join course on student.ID=course.ID

    SQL语句:select * from student inner join course on student.ID=course.ID

    Sno Name Cno

    实行理并了结果:

    执行结果:新葡亰496net 15inner join 是相比较运算符,只回去符合条件的行。那时候一定于:select * from student,course where student.ID=course.ID

    表2的列能够改为:

    新葡亰496net 16

     

    Cno CName

    左外连接包含left join左表全部行,假设左表中某行在右表未有匹配,则结果中对应行右表的局地全体为空(NULL).

    三、交叉连接 cross join

    那般两表就足以写大器晚成对多和多对黄金年代的SQL语句了,写法和方面包车型客车大器晚成对风姿罗曼蒂克SQL语句同样。

    注:那个时候大家不可能说结果的行数等于左表数据的行数。当然这里查询结果的行数等于左表数据的行数,因为左右两表当时为后生可畏对生机勃勃涉及。

    1.定义:未有 WHERE 子句的时有时无联接将产生连接所涉及的表的笛Carl积。第三个表的行数乘以第叁个表的行数等于笛Carl积结果集的尺寸。

    上边介绍一下当两表为多对多的时候大家该怎么建表甚至些SQL语句。

    2、右连接  right join 或 right outer join

    SQL语句:select * from student cross join course

    新建三表:

    SQL语句:select * from student right join course on student.ID=course.ID

    奉行结果:新葡亰496net 17倘诺我们在这里儿给那条SQL加上WHERE子句的时候比如SQL:select * from student cross join course where student.ID=course.ID

    表A:  student 截图如下:

    实施结果:

    那会儿将回来切合条件的结果集,结果和inner join所示执行结果同样。

    新葡亰496net 18

    新葡亰496net 19

    四、两表关系为大器晚成对多,多对豆蔻梢头或多对深刻的连匈牙利(Magyarország)语句

    表B:  course 截图如下:

    右外连接蕴涵right join右表全体行,借使左表中某行在右表未有相配,则结果中对应左表的有的全部为空(NULL)。

    本来上边两表为意气风发对意气风发关乎,那么只要表A和表B为黄金年代对多、多对风流洒脱或多对多的时候,大家又该怎样写连接SQL语句呢?

    新葡亰496net 20

    注:同样那时候大家无法说结果的行数等于右表的行数。当然这里查询结果的行数等于左表数据的行数,因为左右两表那个时候为意气风发对一事关。

    实质上两表黄金时代对多的SQL语句和一定的SQL语句的写法都大概,只是查询的结果不均等,当然两表也要略有改换。

    表C:  student_course 截图如下:

    3、完全外连接  full join 或 full outer join

    举个例子说表1的列能够改为:

    新葡亰496net 21

    SQL语句:select * from student full join course on student.ID=course.ID

    Sno Name Cno

    贰个上学的小孩子能够选择多门学科,一门学科能够被三个学子采取,由此学子表student和科目表course之间是多对多的关联。

    实践结果:

    表2的列能够改为:

    当两表为多对多关系的时候,大家必要树立三个中级表student_course,中间表起码要有两表的主键,当然还足以有其余内容。

    新葡亰496net 22

    Cno CName

    SQL语句:select s.Name,C.Cname from student_course as sc left join student as s on s.Sno=sc.Sno left join course as c on c.Cno=sc.Cno

    一同外接连满含full join左右两表中有着的行,倘若右表中某行在左表中从未相称,则结果中对应行右表的部分全部为空(NULL),要是左表中某行在右表中尚无相配,则结果中对应行左表的有的全体为空(NULL)。

    这么两表就足以写生龙活虎对多和多对风流罗曼蒂克的SQL语句了,写法和方面包车型地铁风流罗曼蒂克对大器晚成SQL语句相通。

    实践结果:

    二、内连接  join 或 inner join

    上面介绍一下当两表为多对多的时候我们该怎么建表以致些SQL语句。

    新葡亰496net 23

    SQL语句:select * from student inner join course on student.ID=course.ID

    新建三表:

    此条SQL试行的结果是学员选课的意况。

    进行结果:

    表A:  student 截图如下:     表B:  course 截图如下:   表C:  student_course 截图如下:

     

    新葡亰496net 24

        新葡亰496net 25            新葡亰496net 26      新葡亰496net 27

     

    inner join 是相比运算符,只回去切合条件的行。

    三个学员能够选拔多门课程,一门课程能够被七个学子接收,因而学子表student和科目表course之间是多对多的涉及。

     

    此时一定于:select * from student,course where student.ID=course.ID

    当两表为多对多涉及的时候,大家需求树立三个当中表student_course,中间表起码要有两表的主键,当然仍为能够有别的内容。

    Union

    UNION 操作符用于合併七个或多个 SELECT 语句的结果集。

    UNION 运算符通过结合别的七个结果表(举个例子 TABLE1 和 TABLE2)并消去表中任何重复行而派生出三个结果表。

    当 ALL 随 UNION 一齐利用时(即 UNION ALL),不拔除重复行。三种情景下,派生表的每风流洒脱行不是出自 TABLE1 便是出自 TABLE2。

    瞩目:使用UNION时,两张表查询的结果有平等数量的列、列类型日常。

    新葡亰496net:详细实例,sql语句增删改查。学生表音信(Students):

    ID Name Age City MajorID
    101 Tom 20 BeiJing 10
    102 Lucy 18 ShangHai 11

     

     

     

    教员表音信(Teachers):

     ID  Name
     101  Mrs Lee
     102  Lucy

     

     

     

    预置脚本:

    INSERT INTO Students(ID,Name,Age,City,MajorID) VALUES(101,'Tom',20,'BeiJing',10)
    INSERT INTO Students(ID,Name,Age,City,MajorID) VALUES(102,'Lucy',18,'ShangHai',11)
    
    INSERT INTO Teachers(ID,Name) VALUES(101,'Mrs Lee')
    INSERT INTO Teachers(ID,Name) VALUES(102,'Lucy')
    

     

    1)基本UNION查询,查询高校教师的资质、学子的总的消息表,包蕴ID和姓名

    SELECT ID,Name FROM Students
    UNION
    SELECT ID,Name FROM Teachers
    

    询问结果:

     ID  Name
    101 Mrs Lee
    101 Tom
    102  Lucy

     

     

     

     

    2)带条件的UNION查询,也可以查询同一张表,查询年龄为18,贰14周岁的学习者信息

    SELECT ID,Name FROM Student WHERE Age=18
    UNION
    SELECT ID,Name FROM Student WHERE Age=23
    

    道理当然是那样的,那足以接受IN大概OLAND相当轻松完毕,这里只是点到,现在蒙受复杂查询,相信您会用到。

    3)查询教授学子全体人名

     因为UNION只会接受不相同的值,假若学员大壮教育工小编中有重名的情事,那就要求UNION ALL

    SELECT Name FROM Students
    UNION ALL
    SELECT Name FROM Teachers
    

    查询结果:

     ID  Name
    101 Tom
    102 Lucy
    101 Mrs Lee
    102  Lucy

     

     

     

      

    三、交叉连接 cross join

    SQL语句:select s.Name,C.Cname from student_course as sc left join student as s on s.Sno=sc.Sno left join course as c on c.Cno=sc.Cno

     

    1.定义:未有 WHERE 子句的接力联接将生出连接所提到的表的笛Carl积。第一个表的行数乘以第二个表的行数等于笛Carl积结果集的大小。

    实施结果:新葡亰496net 28此条SQL履行的结果是学子选课的状态。

    SQL语句:select * from student cross join course

     

    施行结果:

    ---------------------------------------------------------------------------------华丽分界线---------------------------------------------------------------------------------

    新葡亰496net 29

    distinct的异样用法:select  count(*) from (select distinct cdkey from tbl_alipay) s;

    就算我们在这里时给那条SQL加上WHERE子句的时候比方SQL:select * from student cross join course where student.ID=course.ID

     

    此刻将回到切合条件的结果集,结果和inner join所示实行结果一律。

    distinct的另生龙活虎种格局:

    四、两表关系为豆蔻梢头对多,多对豆蔻年华或多对深远的总是语句

    select *, count(distinct name) from table group by name

    理之当然下边两表为生龙活虎对大器晚成关乎,那么意气风发旦表A和表B为后生可畏对多、多对后生可畏或多对多的时候,大家又该怎么着写连接SQL语句呢?

    结果:

    实在两表生机勃勃对多的SQL语句和生龙活虎对大器晚成的SQL语句的写法都差十分少,只是查询的结果不一样等,当然两表也要略有更改。

       id name count(distinct name)
       1 a 1
       2 b 1
       3 c 1

    例如说表1的列能够改为:

    聊到底豆蔻梢头项是多余的,不用管就行了,目标达到

    Sno Name Cno

    group by 必须放在 order by 和 limit在此之前,不然会报错

    表2的列能够改为:

     

    Cno CName

    引用自:

    与此相类似两表就足以写后生可畏对多和多对生机勃勃的SQL语句了,写法和方面包车型客车风流浪漫对风度翩翩SQL语句同样。

    下边介绍一下当两表为多对多的时候大家该怎样建表以致些SQL语句。

    新建三表:

    表A:  student 截图如下:

    新葡亰496net 30

    表B:  course 截图如下:

    新葡亰496net 31

    表C:  student_course 截图如下:

    新葡亰496net 32

    贰个学子能够筛选多门学科,一门科目能够被多少个学子采纳,由此学子表student和学科表course之间是多对多的涉嫌。

    当两表为多对多关系的时候,我们要求创设贰当中级表student_course,中间表起码要有两表的主键,当然还足以有别的内容。

    SQL语句:select s.Name,C.Cname from student_course as sc left join student as s on s.Sno=sc.Sno left join course as c on c.Cno=sc.Cno

    实行结果:

    新葡亰496net 33

    此条SQL实施的结果是学员选课的场所。

                                     接下来是另二个事例!

    今昔设有简单的表(里面包车型地铁主键外键就不写了):

    1. Create table Employee(    EmpID int,    EmpName nvarchar(10),    DepID int);  
    2. Create table Department(  DepID int,    DepName nvarchar(10));  
    3. Create talbe Manager(     EmpID int,    DepID int);  

    万风流倜傥本身要查询部门的音讯,包罗(部门ID,部门名称,部门老董,部门人数)。那须求多表连查和用到集结函数。

     

    SQL语句如下:

     

    1. select D.DepID, DepName,E.EmpName ,G.Num   
    2. from t_Department as D   
    3. left join t_Manager as M   
    4. on M.DepID=D.DepID   
    5. left join t_Employee as E   
    6. on E.EmpID=M.ManagerID   
    7. left join   
    8. (select DepID,COUNT(*) as Num   
    9. from t_Employee   
    10. group by(DepID)   
    11. ) as G   
    12. on D.DepID=G.DepID;  

    部门表<-->经理表<-->职工表

     

    人口结果

    多少个结实总是便获得结果

    本文由新葡亰496net发布于网络数据库,转载请注明出处:新葡亰496net:详细实例,sql语句增删改查

    关键词:

上一篇:旺旺老师笔记,数据库SQL语句的操作

下一篇:没有了