• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    SQL语句实例说明 方便学习mysql的朋友

    MySQL中模式就是数据库

    SHOW DATABASES;

    show databases;
    罗列所有数据库名称

    CREATE DATABASE 数据库名>

    create database TEST;
    创建名为TEST的数据库

    DROP DATABASE 数据库名>

    drop database TEST;
    删除名为TEST的数据库

    USE 数据库名>

    use TEST;
    使用名为TEST的数据库

    SHOW TABLES

    show tables;
    显示当前数据库所有表格

    SHOW [FULL] COLUMNS FROM 表名>

    show [full] columns from 表名>
    在MySQL数据库中显示表的结构,如果加上full则更加详细

    DESC 表名>

    desc TEST;
    查看表TEST的结构,同show columns from TEST

    SHOW CREATE TABLE 表名>

    show create table TEST;

    查看表TEST的所有信息,包括建表语句

    创建基本表:
    CREATE TABLE 表名>
    (列名> 数据类型>[列级完整性约束条件],
    列名> 数据类型>[列级完整性约束条件],
    ………………
    );

    create table STUDENT
    (
    studentId int(30) primary key,
    name varchar(255),
    address varchar(255)
    );
    创建名为STUDENT的表格,有属性studentId,name,address,其中studentId为主键

    create table TEACHER
    (
    teacherId int(30),
    name varchar(255),
    age int(20),
    studentId int(30),
    primary key (teacherId),
    foreign key (studentId) references STUDENT(studentId)
    );
    创建名为TEACHER的表格,其中teacherId为主键,studentId为外键,引用STUDENT表的主键studentId

    修改基本表:

    ALTER TABLE 表名> RENAME 修改后表名>

    alter table TEACHER rename S;
    将TEACHER表的表名改为S

    ALTER TABLE 表名> ADD COLUMN 列名> 属性类型>

    alter table TEACHER add column ADDRESS varchar(255);
    在表名为TEACHER的表中加入名为ADDRESS的列

    ALTER TABLE 表名> CHANGE COLUMN 列名> 修改后列名> 属性类型>

    alter table TEACHER change column ADDRESS address varchar(230);
    修改TEACHER表中的列,将ADDRESS的列名改为address

    ALTER TABLE 表名> DROP [COLUMN] 列名>

    alter table TEACHER drop [column] address;
    删除列名为address的列,column可有可无

    删除基本表:

    DROP TABLE 表名> [RESTRICT|CASCADE]
    删除表格


    drop table STUDENT restrict;
    删除STUDENT表。受限制的删除,欲删除的基本表不能被其他表的约束所引用(如check,foreign key等约束),
    不能有视图,不能有触发器,不能有存储过程或函数等。

    drop table STUDENT cascade;

    若选择cascade,则该表删除没有限制。在删除基本表的同时,相关的依赖对象,例如视图,都将被一起删除。

    但是我在MySQL测试的时候给错误提示Cannot delete or update a parent row: a foreign key constraint fails,不予以删除,不知道是什么原因。

    关于完整约束性:

     参考文章:完整性约束的SQL定义

    ALTER TABLE 表名> ADD CONSTRAINT 约束名> 约束条件>

     alter table teacher add constraint pk_teacher_id primary key teacher(id);

     在teacher表中增加名为pk_teacher_id的主键约束。

    ALTER TABLE 表名> DROP 约束条件>

    alter table teacher drop primary key;

    删除teacher表的主键约束。

    alter table student add constraint fk_student_teacher foreign key student(teacherId) references teacher(id);

    在student表中增加名为fk_student_teacher的约束条件,约束条件为外键约束。

    索引的建立与删除:

    索引的建立:

    CREATE [UNIQUE]|[CLUSTER] INDEX 索引名> ON 表名>(列名> [次序][,列名> [次序]]……);

    UNIQUE 表明此索引的每一个索引值只对应唯一的数据记录。

    CLUSTER 表示要建立的索引是聚簇索引。

    create unique index id_index on teacher(id asc);
    对teacher表的id列建立unique索引,索引名为id_index

    索引的删除:

    DROP INDEX 索引名> ON 表名>

    drop index id_index on teacher;
    在teacher表中删除索引,索引名为id_index

    另外的方法:

    新建索引:

    ALTER TABLE 表名> ADD [UNIQUE]|[CLUSTER] INDEX [索引名>](列名> [次序>],[列名> [次序>]]……)

    alter table teacher add unique index id_index(id asc);
    在teacher表中对id列升序建立unique索引,索引的名字为id_index

    删除索引:

    ALTER TABLE 表名> DROP INDEX 索引名>

    alter table teacher drop index id_index;
    删除teacher表名为id_index的索引

    数据库索引的建立有利也有弊,参考文章:

    数据库索引的作用和优点缺点(一)

    数据库索引的作用和优点缺点(二)

    数据库建立索引的原则

    数据查询:

    SELECT [ALL|DISTINCT] 目标列表达式> [,目标列表达式>]……

    FROM 表名或视图名> [表名或视图名>]……

    [WHERE 条件表达式>]

    [GROUP BY 列名1> [HAVING 条件表达式>]]

    [ORDER BY 列名2> [ASC|DESC] [,列名3> [ASC|DESC]]……];

    查询经过计算的值:

    select teacherId as id,salary - 100 as S from teacher;

    查询经过计算的值,从teacher表中查询出teacherId字段,别名为id,并且查询出salary字段减去100后的字段,别名为S

     

    使用函数和字符串:

    select teacherid as id,'birth',salary - 20 as SA, lower(name) from teacher;

    目标表达式>可以是字符串常量和函数等,'birth' 为字符串常量,lower(name)为函数,将name字段以小写字母形式输出

     

    消除取值重复的行:

    select distinct name from teacher;

    如果没有指定DISTINCT关键词,则缺省为ALL.

     

    查询满足条件的元组:

    WHERE子句常用的查询条件:

    查询条件

    谓词

    比较

    =, >, , >=, =, !=, >, !>, !

    确定范围

    BETWEEN AND, NOT BETWEEN AND

    确定集合

    IN, NOT IN

    字符匹配

    LIKE, NOT LIKE

    空值

    IS NULL, IS NOT NULL

    多重条件(逻辑运算)

    AND, OR, NOT

     


    (1)比较大小:

    select * from teacher where name = 'test';

    select * from teacher where salary > 500;

    select * from teacher where salary > 500;

    (2)确定范围:

    select * from teacher where salary between 300 and 1000;

    select * from teacher where salary not between 500 and 1000

    (3)确定集合

    select * from teacher where name in('test','test2');

    select * from teacher where name not in('test','test2');

    (4)字符匹配:

    [NOT] LIKE '匹配串>' [ESCAPE '换码字符>']
    匹配串>可以是一个完整的字符串,也可以含有通配符%和_
    %代表任意长度(长度可以是0)的字符。例如a%b表示以a开头,以b结尾的任意长度的字符串。如acb,addgb,ab

    _代表任意单个字符。例如a_b表示以a开头,以b结尾的长度为3的任意字符串。如acb,afb等都满足该匹配串。

    select * from teacher where name like '%2%‘;

    select * from teacher where name like '_e%d';

    注意一个汉字要占两个字符的位置。

    (5)涉及空值查询:

    select * from teacher where name is null;

    select * from teacher where name is not null;

    注意这里的"is"不能用符号(=)代替。

    (6)多重条件查询:

    select * from teacher where name = 'test' and salary between 400 and 800;

    select * from teacher where name like '%s%' or salary = 500;

     

    ORDER BY子句:

    ORDER BY 子句对查询结果按照一个或多个属性列的升序(ASC)或降序(DESC)排列,缺省值为(ASC)

    select salary from teacher order by salary asc;

    select * from teacher order by name desc,salary asc;


    聚集函数(aggregate functions):

    COUNT([DISTINCT|ALL]*)                 统计元组个数
    COUNT([DISTINCT|ALL]列名>)       统计一列值的个数
    SUM([DISTINCT|ALL]列名>)            计算一列值的总和
    AVG([DISTINCT|ALL]列名>)             计算一列值的平均值
    MAX([DISTINCT|ALL]列名>)             求一列值中的最大值
    MIN([DISTINCT|ALL]列名>
    )         求一列值中的最小值

    缺省值为ALL

    select count(distinct name) from teacher;
    查询没有重复的名字的个数

    select count(*) from teacher;
    查询teacher表格总记录数

    select sum(salary) from teacher;
    查询teacher表的salary字段的总和

    select avg(salary) from teacher;
    查询teacher表的salary字段的平均值

    select max(salary) from teacher;
    查询teacher表的salary字段的最大值

    select min(salary) from teacher;
    查询teacher表的salary字段的最小值

     

    GROUP BY子句:

    GROUP BY子句将查询结果按某一列或多列的值分组,值相等的为一组。
    对查询结果分组的目的是为了细化聚集函数的作用对象。分组后聚集函数将作用于每一个组,即每一组都有一个函数值。

    select cno,count(*) from teacher group by cno;
    对teacher表格按照cno分组,并算出每组里面有多少个元素

    如果分组后还要按照一定的条件对这些组进行筛选,最终只输出满足指定条件的组,则可以使用HAVING语句指定筛选条件。

    select cno,count(*) from teacher group by cno having count(*) >= 4;
    对teacher表格按照cno分组,并算出每组里面有多少个元素,得到元素个数大于等于4的值

     

    连接查询:

    连接查询是关系数据库中最主要的的查询,包括等值连接查询,自然连接查询,非等值连接查询,自身连接查询,外连接查询和复合条件连接查询等。

    等值与非等值连接查询:

    连接查询的WHERE子句中用来连接两个表的条件称为连接条件或连接谓词,格式为:

    [表名1>.]列名> 比较运算符> [表名2>.]列名2>

    其中比较运算符主要有:=,>, , >=, =, !=(或>)等

     

    select s.*,t.* from student as s,teacher as t where s.teacherid = t.teacherid;
    等值连接查询,将student表和teacher的信息连接查询出来,连接条件是s.teacherid = t.teacherid


    自身连接:

    一个表与自身进行连接,称为自身连接

    select teacher.name,student.name from people as teacher,people as student where teacher.name = student.teacher;
    自身连接查询,在people表里有两种角色,一种是教师,一种是学生,利用自身连接查询,得到name字段和teacher字段相等的元组

    外连接:

    左外连接列出左边关系中所有元组,右外连接列出右边关系中所有元组。

    左外连接:SELECT 目标列表达式>[,目标列表达式>]…… FROM 表名1> LEFT [OUTER] JOIN 表名2> ON 连接条件>
    右外连接:SELECT 目标列表达式>[,目标列表达式>]…… FROM 表名1> RIGHT [OUTER] JOIN 表名2> ON 连接条件>

    select s.sno,s.name,c.cno,c.name from student as s left outer join class as c on (s.cno = c.cno);
    student表和class表进行左外连接,连接条件是s.cno=c.cno

    select c.cno,c.name,s.sno,s.name from student as s right outer join class as c on (s.cno = c.cno); 
    student表和class表进行右外连接,连接条件为s.cno=c.cno


    student表数据:

    +-----+-----+------+
    | sno | cno | name |
    +-----+-----+------+
    | 1 | 1 | 地心 |
    | 2 | 2 | 华雄 |
    | 3 | 1 | 孝慈 |
    | 4 | 3 | 必须 |
    +-----+-----+------+

    class表数据:

    +-----+-----+------+
    | cid | cno | name |
    +-----+-----+------+
    | 1 | 1 | 化学 |
    | 2 | 2 | 物理 |
    | 3 | 3 | 政治 |
    +-----+-----+------+

     

    左外连接效果:

    +-----+------+-----+------+
    | sno | name | cno | name |
    +-----+------+-----+------+
    | 1 | 地心 | 1 | 化学 |
    | 2 | 华雄 | 2 | 物理 |
    | 3 | 孝慈 | 1 | 化学 |
    | 4 | 必须 | 3 | 政治 |
    +-----+------+-----+------+

    右外连接效果:

    +-----+------+-----+------+
    | cno | name | sno | name |
    +-----+------+-----+------+
    | 1 | 化学 | 1 | 地心 |
    | 1 | 化学 | 3 | 孝慈 |
    | 2 | 物理 | 2 | 华雄 |
    | 3 | 政治 | 4 | 必须 |
    +-----+------+-----+------+

    MySQL不支持全外连接!

     

    复合条件连接:

    WHERE子句中可以有多个连接条件,称为复合条件连接

    select s.sno,s.name,c.name,s.score from student s,class c where s.cno = c.cno and s.score 60;
    复合条件连接查询,查询学生信息和课程信息,并且成绩小于60的记录

    嵌套查询:

    一个SELECT-FROM-WHERE语句称为一个查询块。将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询。

    子查询的SELECT语句中不能使用ORDER BY子句,ORDER BY 子句只能对最终查询结果排序


    带有IN谓词的子查询:

    select sno,name from student
    where cno in
    (
    select cno from student
    where name = '华雄'
    );

    查询和"华雄"选同一课程的所有学生的学号和姓名。

     

    子查询的查询条件不依赖于父查询,称为不相关子查询

    如果子查询条件依赖于父查询,这类子查询称为相关子查询,整个查询语句称为相关嵌套查询语句。


    带有比较运算符的子查询:

    select name,cno from student s1
    where score >
    (
    select avg(score) from student s2
    where s2.name = s1.name
    );

    查询学生的大于各科平均成绩的科目

    以上是相关子查询。

     

    带有ANY(SOME)或ALL谓词的子查询

    子查询返回单值时可以用比较运算符,但返回多值时要用ANY(有的系统用SOME)或ALL谓词修饰。使用ALL或ALL谓词时必须使用比较运算符。

    >ANY                          大于子查询结果的某个值
    >ALL                           大于子查询结果的所有值 
    ANY                           小于子查询结果的某个值
    ALL                            小于子查询结果的所有值
    >=ANY                          大于等于子查询结果的某个值     
    >=ALL                          大于等于子查询结果的所有值
    =ANY                          小于等于子查询结果的某个值
    =ALL                           小于等于子查询结果的所有值
    =ANY                             等于子查询结果的某个值
    =ALL                              等于子查询结果的所有值(通常没有实际意义)
    !=(或>)ANY                   不等于子查询结果的某个值
    !=(或>)ALL                    不等于子查询结果的任何一个值

    select name,score from student where score = all (select score from student);
    查询成绩最小的学生姓名和成绩

    集合查询:

    SELECT语句的查询结果是元组的集合,所以多个SELECT语句的结果可进行集合操作。集合操作主要包括并操作(UNION),交操作(INTERSECT),差操(EXCEPT)。
    参加集合操作的各查询结果的列数必须相同;对应项的数据类型也必须相同。
    MySQL数据库不支持INTERSECT和EXCEPT操作!

    select * from student where cno=1
    union
    select * from student where cno=2;
    查询班级1和班级2所有学生信息

     

     

    数据更新:

    插入数据:

    插入元组:

    INSERT
    INTO 表名> [(属性列1>)[,属性列2>]……]
    VALUES (常量1>[,常量2>]……);


    例子:

    insert into student (cno,name,score) values (2,'横切',85);

     

    插入子查询结果:

    INSERT 
    INTO 表名> [(属性1>[,属性2>]……)]
    子查询;


    例子:

    insert into studentcopy select * from student;
    将student表的信息全部复制到studentcopy表中


    修改数据:

    UPDATE 表名>
    SET 列名>=表达式>[,列名>=表达式>]……
    [WHERE 条件>]


    修改某一元组的值:

    update studentcopy set score=80 where sno=1;

    修改多个元组的值:

    update studentcopy set score=score-20;

    删除数据:

    DELETE
    FROM 表名>
    [WHERE 条件>]; 

     

    删除某一元组:

    delete from studentcopy where sno=1;

    删除多个元组:

    delete from studentcopy;

    带子查询的删除语句:

    delete from studentcopy where cno in (select cno from student as s where s.cno = 2);

    视图:

     关于视图,它的作用和优缺点可以参考文章:数据库视图介绍

    建立视图:

    CREATE VIEW 视图名> [(列名>[,列名>]……)]
    AS 子查询>
    [WITH CHECK OPTION]


    子查询可以是任意复杂的SELECT语句,但通常不允许含有ORDER BY子句和DISTINCT语句。

    WITH CHECK OPTION 表示对视图进行UPDATA,INSERT和DELETE操作时要保证更新,插入或删除的行满足视图定义中的谓词条件

    组成视图的属性列名或者全部省略或者全部指定,没有第三种选择。如果省略了视图的各个属性列名,则隐含该视图由子查询中SELECT子句目标列中的诸字段组成。
    但在下面三种情况下必须明确指定组成视图的所有列名:
    (1) 某个目标列不是单纯的属性名,而是聚集函数或列表达式。
    (2) 多表连接时选出了几个同名列作为视图的字段。
    (3) 需要在视图中为某个列启用新的更合适的名字。


    create view part_student
    as
    select * from student
    where cno = 2;
    建立物理班学生的视图

    create view student_class (sno,student_name,class_name,score)
    as
    select s.sno,s.name,c.name,s.score
    from student as s,class as c
    where s.cno = c.cno;
    结合学生表和选课表建立视图


    如果以后修改了基本表的结构,则基本表与视图的映射关系就被破坏了,该视图就不能正确工作了。为避免出现这类问题,最好在修改基本表之后删除由该基本表导出的视图,然后重建这个视图。


    删除视图:

    DROP VIEW 视图名> [CASCADE];

    如果视图上还导出了其他视图,则使用CASCADE级联删除语句,把该视图和由它导出的所有视图一起删除。

    查询视图:

    查询视图和查询基本表类似。

    更新视图:

    更新视图和更新基本表类似,不过有些限制。

    上一篇:使用SSIS创建同步数据库数据任务的方法
    下一篇:SQL Server 2008 到底需要使用哪些端口?
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    SQL语句实例说明 方便学习mysql的朋友 SQL,语句,实例,说明,方便,