zoukankan      html  css  js  c++  java
  • day22——创建表、增加数据、查询数据

    创建表

    create table 表名(
    列名 类型 是否可以为空, ##not null 不能空 null 可以空
    列名 类型 是否可以为空
    )ENGINE=InnoDB DEFAULT CHARSET=utf8

    自增列

    自增,如果为某列设置自增列,插入数据时无需设置此列,默认将自增(表中只能有一个自增列)
    create table tb1(
    nid int not null auto_increment primary key,
    num int null
    )

    create table tb1(
    nid int not null auto_increment,
    num int null,
    index(nid)
    )
    注意:1、对于自增列,必须是索引(含主键)。
    2、对于自增可以设置步长和起始值
    show session variables like 'auto_inc%';
    set session auto_increment_increment=2;
    set session auto_increment_offset=10;

    shwo global variables like 'auto_inc%';
    set global auto_increment_increment=2;
    set global auto_increment_offset=10;

    主键
    主键,一种特殊的唯一索引,不允许有空值,如果主键使用单个列,则它的值必须唯一,如果是多列,则其组合必须唯一。
    create table tb1(
    nid int not null auto_increment primary key,
    num int null
    )

    create table tb1(
    nid int not null,
    num int not null,
    primary key(nid,num)
    )

    外键

    外键,一个特殊的索引,只能是指定内容
    creat table color(
    nid int not null primary key,
    name char(16) not null
    )

    create table fruit(
    nid int not null primary key,
    smt char(32) null ,
    color_id int not null,
    constraint fk_cc foreign key (color_id) references color(nid)
    )

    删除表,主键 外键

    删除表
    drop table 表名

    清空表
    delete from 表名 #自增的不会清空
    truncate table 表名 #彻底清空

    4、修改表
    添加列:alter table 表名 add 列名 类型
    删除列:alter table 表名 drop column 列名

    修改列:
    alter table 表名 modify column 列名 类型; -- 类型
    alter table 表名 change 原列名 新列名 类型; -- 列名,类型

    添加主键:
    alter table 表名 add primary key(列名);

    删除主键:
    alter table 表名 drop primary key;
    alter table 表名 modify 列名 int, drop primary key;

    添加外键:alter table 从表 add constraint 外键名称(形如:FK_从表_主表) foreign key 从表(外键字段) references 主表(主键字段);
    删除外键:alter table 表名 drop foreign key 外键名称

    修改默认值:ALTER TABLE testalter_tbl ALTER i SET DEFAULT 1000;
    删除默认值:ALTER TABLE testalter_tbl ALTER i DROP DEFAULT;

    增删改语句


    insert into 表 (列名,列名...) values (值,值,值...)
    insert into 表 (列名,列名...) select (列名,列名...) from 表


    delete from 表
    delete from 表 where id=1 and name='alex'


    update 表 set name = 'alex' where id>1

    增删改语句

    查询语句

    select * from 表
    select * from 表 where id > 1
    select nid,name,gender as gg from 表 where id > 1

    条件
    select * from 表 where id > 1 and name != 'xiaojie' and num = 12;
    select * from 表 where id between 5 and 16;
    select * from 表 where id in (11,22,33)
    select * from 表 where id not in (11,22,33)
    select * from 表 where id in (select nid from 表)

    通配符
    select * from 表 where name like 'xia%' - xia开头的所有(多个字符串)
    select * from 表 where name like 'xia_' - xia开头的所有(一个字符)

    限制
    select * from 表 limit 5; - 前5行
    select * from 表 limit 4,5; - 从第4行开始的5行
    select * from 表 limit 5 offset 4 - 从第4行开始的5行

    限制
    select * from 表 order by 列 asc - 根据 “列” 从小到大排列
    select * from 表 order by 列 desc - 根据 “列” 从大到小排列
    select * from 表 order by 列1 desc,列2 asc - 根据 “列1” 从大到小排列,如果相同则按列2从小到大排序

    分组
    select num from 表 group by num
    select num,nid from 表 group by num,nid
    select num,nid from 表 where nid > 10 group by num,nid order nid desc
    select num,nid,count(*),sum(score),max(score),min(score) from 表 group by num,nid
    select num from 表 group by num having max(id) > 10
    特别的:group by 必须在where之后,order by之前

    连表
    无对应关系则不显示
    select A.num, A.name, B.name
    from A,B
    Where A.nid = B.nid

    无对应关系则不显示
    select A.num, A.name, B.name
    from A inner join B
    on A.nid = B.nid

    A表所有显示,如果B中无对应关系,则值为null
    select A.num, A.name, B.name
    from A left join B
    on A.nid = B.nid

    B表所有显示,如果B中无对应关系,则值为null
    select A.num, A.name, B.name
    from A right join B
    on A.nid = B.nid

    组合
    g、组合
    组合,自动处理重合
    select nickname
    from A
    union
    select name
    from B

    组合,不处理重合
    select nickname
    from A
    union all
    select name
    from B

    连表操作 转自 ://http://blog.csdn.net/steryzone/article/details/4997060/

    inner join(等值连接) 只返回两个表中联结字段相等的行
    left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录
    right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录

    INNER JOIN 语法:
    INNER JOIN 连接两个数据表的用法:
    SELECT * FROM 表1 INNER JOIN 表2 ON 表1.字段号=表2.字段号

    INNER JOIN 连接三个数据表的用法:
    SELECT * FROM (表1 INNER JOIN 表2 ON 表1.字段号=表2.字段号) INNER JOIN 表3 ON 表1.字段号=表3.字段号

    INNER JOIN 连接四个数据表的用法:
    SELECT * FROM ((表1 INNER JOIN 表2 ON 表1.字段号=表2.字段号) INNER JOIN 表3 ON 表1.字段号=表3.字段号) INNER JOIN 表4 ON Member.字段号=表4.字段号

    INNER JOIN 连接五个数据表的用法:
    SELECT * FROM (((表1 INNER JOIN 表2 ON 表1.字段号=表2.字段号) INNER JOIN 表3 ON 表1.字段号=表3.字段号) INNER JOIN 表4 ON Member.字段号=表4.字段号) INNER JOIN 表5 ON Member.字段号=表5.字段号


    注意事项:

    在输入字母过程中,一定要用英文半角标点符号,单词之间留一半角空格;
    在建立数据表时,如果一个表与多个表联接,那么这一个表中的字段必须是“数字”数据类型,而多个表中的相同字段必须是主键,而且是“自动编号”数据类型。否则,很难联接成功。
    代码嵌套快速方法:如,想连接五个表,则只要在连接四个表的代码上加一个前后括号(前括号加在FROM的后面,后括号加在代码的末尾即可),然后在后括号后面继续添加“INNER JOIN 表名X ON 表1.字段号=表X.字段号”代码即可,这样就可以无限联接数据表了:)

    1.理论
    只要两个表的公共字段有匹配值,就将这两个表中的记录组合起来。

    个人理解:以一个共同的字段求两个表中符合要求的交集,并将每个表符合要求的记录以共同的字段为牵引合并起来。

    语法

    select * FROM table1 INNER JOIN table2 ON table1 . field1 compopr table2 . field2

    INNER JOIN 操作包含以下部分:

    部分 说明

    table1, table2 要组合其中的记录的表的名称。
    field1,field2 要联接的字段的名称。如果它们不是数字,则这些字段的数据类型必须相同,并且包含同类数据,但是,它们不必具有相同的名称。
    compopr
    任何关系比较运算符:“=”、“<”、“>”、“<=”、“>=”或者“<>”。
    说明

    可以在任何 FROM 子句中使用 INNER JOIN 操作。这是最常用的联接类型。只要两个表的公共字段上存在相匹配的值,Inner 联接就会组合这些表中的记录。

    可以将 INNER JOIN 用于 Departments 及 Employees 表,以选择出每个部门的所有雇员。而要选择所有部分(即使某些部门中并没有被分配雇员)或者所有雇员(即使某些雇员没有分配到任何部门),则可以通过 LEFT JOIN 或者 RIGHT JOIN 操作来创建外部联接。

    如果试图联接包含备注或 OLE 对象数据的字段,将发生错误。

    可以联接任何两个相似类型的数字字段。例如,可以联接自动编号和长整型字段,因为它们均是相似类型。然而,不能联接单精度型和双精度型类型字段。

    下例展示了如何通过 CategoryID 字段联接 Categories 和 Products 表:

    SELECT CategoryName, ProductName

    FROM Categories INNER JOIN Products

    ON Categories.CategoryID = Products.CategoryID;

    在前面的示例中,CategoryID 是被联接字段,但是它不包含在查询输出中,因为它不包含在 SELECT 语句中。若要包含被联接字段,请在 SELECT 语句中包含该字段名,在本例中是指 Categories.CategoryID。

    也可以在 JOIN 语句中链接多个 ON 子句,请使用如下语法:

    SELECT fields
    FROM table1 INNER JOIN table2
    ON table1.field1 compopr table2.field1 AND
    ON table1.field2 compopr table2.field2 OR
    ON table1.field3 compopr table2.field3;

    也可以通过如下语法嵌套 JOIN 语句:

    SELECT fields
    FROM table1 INNER JOIN
    (table2 INNER JOIN [( ]table3
    [INNER JOIN [( ]tablex [INNER JOIN ...)]
    ON table3.field3 compopr tablex.fieldx)]
    ON table2.field2 compopr table3.field3)
    ON table1.field1 compopr table2.field2;

    LEFT JOIN 或 RIGHT JOIN 可以嵌套在 INNER JOIN 之中,但是 INNER JOIN 不能嵌套于 LEFT JOIN 或 RIGHT JOIN 之中。


    2.操作实例

    表A记录如下:
    aID aNum
    1 a20050111
    2 a20050112
    3 a20050113
    4 a20050114
    5 a20050115

    表B记录如下:
    bID bName
    1 2006032401
    2 2006032402
    3 2006032403
    4 2006032404
    8 2006032408


    实验如下:
    1.left join

    sql语句如下:
    select * from A
    left join B
    on A.aID = B.bID

    结果如下:
    aID aNum bID bName
    1 a20050111 1 2006032401
    2 a20050112 2 2006032402
    3 a20050113 3 2006032403
    4 a20050114 4 2006032404
    5 a20050115 NULL NULL
    (所影响的行数为 5 行)

    结果说明:
    left join是以A表的记录为基础的,A可以看成左表,B可以看成右表,left join是以左表为准的.
    换句话说,左表(A)的记录将会全部表示出来,而右表(B)只会显示符合搜索条件的记录(例子中为: A.aID = B.bID).
    B表记录不足的地方均为NULL.

    2.right join
    sql语句如下:
    select * from A
    right join B
    on A.aID = B.bID
    结果如下:
    aID aNum bID bName
    1 a20050111 1 2006032401
    2 a20050112 2 2006032402
    3 a20050113 3 2006032403
    4 a20050114 4 2006032404
    NULL NULL 8 2006032408
    (所影响的行数为 5 行)
    结果说明:
    仔细观察一下,就会发现,和left join的结果刚好相反,这次是以右表(B)为基础的,A表不足的地方用NULL填充.


    3.inner join
    sql语句如下:
    select * from A
    innerjoin B
    on A.aID = B.bID

    结果如下:
    aID aNum bID bName
    1 a20050111 1 2006032401
    2 a20050112 2 2006032402
    3 a20050113 3 2006032403
    4 a20050114 4 2006032404

    结果说明:
    很明显,这里只显示出了 A.aID = B.bID的记录.这说明inner join并不以谁为基础,它只显示符合条件的记录. 还有就是inner join 可以结合where语句来使用 如: select * from A innerjoin B on A.aID = B.bID where b.bname='2006032401' 这样的话 就只会放回一条数据了

    查询语句

  • 相关阅读:
    2015.2.27 UltraEdit中显示XML结构
    2015.1.31 DataGridView自动滚动到某行
    2015.1.15 利用函数实现将一行记录拆分成多行记录 (多年想要的效果)
    2015.1.15 利用Oracle函数返回表结果 重大技术进步!
    2015.1.15 利用Oracle函数插入表结构 Bulk collect into 不用循环,简洁高效
    2015.1.8 Left join 左连接
    2015.1.10 解决DataGridView SelectionChanged事件自动触发问题
    delphi 遍历窗口
    delphi 访问 protected 属性 哈哈
    clientdataset 读取excel 如果excel 文件不存在的时候 相应的gird 会不显示数据, 鼠标掠过 gird 格子 才会显示数据。 这是一个bug 哈哈
  • 原文地址:https://www.cnblogs.com/yangjinbiao/p/7882156.html
Copyright © 2011-2022 走看看