澳门新萄京官方网站-www.8455.com-澳门新萄京赌场网址

澳门新萄京官方网站:多表查询

2019-10-01 作者:数据库网络   |   浏览(131)

读书mysql必备工具即安装mysql客商端;mysql安装教程在互连网有多数,在此地就不在留神表明;

一、约束之主键约束

一、约束之主键约束

1、数据库

 1 数据库概念(精通)

1.1 什么是数据库

数据库就是用来储存和保管多少的货仓!

数据仓库储存款和储蓄数据的优先:可存款和储蓄多量数据;

l  方便找寻;

l  保持数据的一致性、完整性;

l  安全,可共享;

l  通过组合解析,可发出新数据。

 

1.2 数据库的向上历程

l  未有数据库,使用磁盘文件存款和储蓄数据;

l  等级次序结构模型数据库;

l  网状结构模型数据库;

关系结构[c1] 模型数据库:使用二维表格来囤积数据;

l  关系-对象模型数据库;

 

  MySQL便是关系型数据库!

 

1.3 常见数据库

l  Oracle(神喻):甲骨文(最高!);

l  DB2:IBM;

l  SQL Server:微软;

l  Sybase:赛尔斯;

l  MySQL:甲骨文;

 

1.4 精晓数据库

l  RDBMS = 管理员(manager) 仓库(database)

l  database = N个table

l  table:

  • 表结构:定义表的列名和列类型!
  • 表记录:一行一行的记录!

 

 

大家以往所说的数据库泛指“关系型数据库管理种类(君越DBMS

  • Relational database management system[c2] )”,即“数据库服务器”。

 

当大家设置了数据库服务器后,就足以在数据库服务器中开创数据库,每一种数据库中还是可以分包多张表。

 

数量库表便是四个多行多列的报表。在开立表时,需求钦点表的列数,以及列名称,列类型等新闻。而不用钦定表格的行数,行数是从未有过上限的。上边是tab_student表的布局:

 

 

当把表格创制好了后来,就能够向表格中添加多少了。向表格加多数据是以行为单位的!上面是s_student表的记录:

 

s_id

s_name

s_age

s_sex

S_1001

zhangSan

23

male

S_1002

liSi

32

female

S_1003

wangWu

44

male

 

  大家要学会区分哪些是表结构,什么是表记录。

 

1.5 应用程序与数据库

  应用程序使用数据库达成对数码的储存!

 

 

1、数据库

 1 数据库概念(领会)

1.1 什么是数据库

数据库就是用来仓库储存和管制数量的饭店!

数据仓库储存款和储蓄数据的开始时期:可存款和储蓄大量数额;

l  方便寻觅;

l  保持数据的一致性、完整性;

l  安全,可共享;

l  通过组合深入分析,可爆发新数据。

 

1.2 数据库的前进进度

l  未有数据库,使用磁盘文件存款和储蓄数据;

l  档期的顺序结构模型数据库;

l  网状结构模型数据库;

提到结构[c1] 模型数据库:使用二维表格来存款和储蓄数据;

l  关系-对象模型数据库;

 

  MySQL正是关系型数据库!

 

1.3 常见数据库

l  Oracle(神喻):甲骨文(最高!);

l  DB2:IBM;

l  SQL Server:微软;

l  Sybase:赛尔斯;

l  MySQL:甲骨文;

 

1.4 理解数据库

l  RDBMS = 管理员(manager) 仓库(database)

l  database = N个table

l  table:

  • 表结构:定义表的列名和列类型!
  • 表记录:一行一行的记录!

 

 

作者们未来所说的数据库泛指“关系型数据库处理种类(路虎极光DBMS

  • Relational database management system[c2] )”,即“数据库服务器”。

 

当我们设置了数据库服务器后,就足以在数据库服务器中开创数据库,种种数据库中还是能分包多张表。

 

多少库表便是一个多行多列的报表。在创制表时,必要钦赐表的列数,以及列名称,列类型等音信。而毫不钦点表格的行数,行数是尚未上限的。上面是tab_student表的结构:

 

 

当把表格创设好了以往,就能够向表格中添扩张少了。向表格增多数据是以行为单位的!下边是s_student表的记录:

 

s_id

s_name

s_age

s_sex

S_1001

zhangSan

23

male

S_1002

liSi

32

female

S_1003

wangWu

44

male

 

  大家要学会区分哪些是表结构,什么是表记录。

 

1.5 应用程序与数据库

  应用程序使用数据库完结对数码的储存!

 

 

上面将精心介绍一下有关SQL语句:

自律:约束是增加在列上的,用来约束列的。

封锁:约束是加多在列上的,用来约束列的。

2 安装MySQL数据库

2.1 安装MySQL

  参谋:MySQL安装图解.doc

 

2.2 MySQL目录结构

MySQL的数码存款和储蓄目录为data,data目录经常在C:Documents and SettingsAll UsersApplication DataMySQLMySQL Server 5.1data地方。在data下的各类目录都意味贰个数据库。

MySQL的设置目录下:

l  bin目录中都以可试行文件;

l  my.ini文件是MySQL的配备文件;

 

2 安装MySQL数据库

2.1 安装MySQL

  参照他事他说加以考察:MySQL安装图解.doc

 

2.2 MySQL目录结构

MySQL的数据存款和储蓄目录为data,data目录经常在C:Documents and SettingsAll UsersApplication DataMySQLMySQL Server 5.1data地方。在data下的各样目录都代表三个数据库。

MySQL的设置目录下:

l  bin目录中都以可实践文件;

l  my.ini文件是MySQL的配置文件;

 

SQL语句:结构化查询语言(Structured Query Language)

1、主键约束(独一标志):非空、独一、被引述

1、主键约束(独一标记):非空、独一、被引述

3 基本命令

3.1 运行和停业mysql服务器

l  启动:net start mysql;

l  关闭:net stop mysql;

 

在起步mysql服务后,展开windows义务管理器,会有三个名称为mysqld.exe的长河运营,所以mysqld.exe才是MySQL服务器程序。

 

3.2 客商端登入退出mysql

在开发银行MySQL服务器后,大家须要动用管理员客商登入MySQL服务器,然后来对服务器实行操作。登入MySQL要求使用MySQL的顾客端程序:mysql.exe

l  登录:mysql -u root -p 123 -h localhost;

  • -u:前边的root是客户名,这里运用的是一级助理馆员root;
  • -p:前面包车型地铁123是密码,那是在装置MySQL时就早就钦命的密码;
  • -h:后边给出的localhost是服务器主机名,它是足以轻易的,举个例子:mysql -u root -p 123;

l  退出:quit或exit;

 

在签到成功后,展开windows职分管理器,会有三个名称为mysql.exe的长河运维,所以mysql.exe是顾客端程序。

 

3 基本命令

3.1 运转和倒闭mysql服务器

l  启动:net start mysql;

l  关闭:net stop mysql;

 

在起步mysql服务后,张开windows职务管理器,会有八个名字为mysqld.exe的进度运营,所以mysqld.exe才是MySQL服务器程序。

 

3.2 客户端登入退出mysql

在开发银行MySQL服务器后,大家供给动用助理馆员顾客登陆MySQL服务器,然后来对服务器实行操作。登入MySQL必要接纳MySQL的顾客端程序:mysql.exe

l  登录:mysql -u root -p 123 -h localhost;

  • -u:后边的root是客商名,这里运用的是一流管理员root;
  • -p:前边的123是密码,那是在装置MySQL时就曾经钦定的密码;
  • -h:前面给出的localhost是服务器主机名,它是足以轻便的,举个例子:mysql -u root -p 123;

l  退出:quit或exit;

 

在登陆成功后,张开windows职务管理器,会有多个名字为mysql.exe的进程运营,所以mysql.exe是客商端程序。

 

SQL语法

  • 当表的某一列被钦定为主键后,该类就无法为空,不能够有重复值出现
  • 创制表时钦命主键的二种方法:

    CREATE TABLE stu(

    sid  CHAR(6) PRIMARY KEY,
    sname  VARCHAR(20),
    age  INT,
    sex  VARCHEAR(10)
    

    );

    CREATE TABLE stu(

    sid  CHAR(6) ,
    sname  VARCHAR(20),
    age  INT,
    sex  VARCHEAR(10),
    PRIMARY KEY(sid)
    

    );

  • 当表的某一列被钦赐为主键后,该类就不能够为空,不可能有重复值出现
  • 创制表时钦赐主键的二种格局:

    CREATE TABLE stu(

    sid  CHAR(6) PRIMARY KEY,
    sname  VARCHAR(20),
    age  INT,
    sex  VARCHEAR(10)
    

    );

    CREATE TABLE stu(

    sid  CHAR(6) ,
    sname  VARCHAR(20),
    age  INT,
    sex  VARCHEAR(10),
    PRIMARY KEY(sid)
    

    );

2、SQL语句

 

2、SQL语句

 

  1. SQL语句能够在单行或多楷体写,以分行结尾
  2. 可使用空格和缩进来加强语句的可读性
  3. MySQL不区分大小写,提议使用大写

  内定sid列为主键列,即为sid列增添主键约束

  钦命sid列为主键列,即为sid列增多主键约束

1        SQL概述

1.1 什么是SQL

SQL(Structured Query Language)是“结构化查询语言”,它是对关系型数据库的操作语言。它能够动用到具有关系型数据库中,举例:MySQL、Oracle、SQL Server等。SQ标准(ANSI/ISO)有:

l  SQL-92:一九九二年揭露的SQL语言职业;

l  SQL:一九九八:1996年发布的SQL语言标签;

l  SQL:二零零零:二〇〇〇年宣布的SQL语言标签;

 

这么些专门的学问就与JDK的本子同样,在新的版本中总要有局地语法的变迁。分化一时间期的数据库对区别标准做了完毕。

虽说SQL能够用在颇具关系型数据库中,但众大多据库还皆有正规之后的一些语法,大家得以叫做“方言”。举例MySQL中的LIMIT语句正是MySQL只有的白话,别的数据库都不辅助!当然,Oracle或SQL Server都有自个儿的方言。

 

1.2 语法须求

l  SQL语句能够单行或多黑体写,以分行结尾;

l  可以用空格和缩进来来加强语句的可读性;

l  关键字不区分大小写,提出选拔大写;

 

1        SQL概述

1.1 什么是SQL

SQL(Structured Query Language)是“结构化查询语言”,它是对关系型数据库的操作语言。它能够运用到拥有关系型数据库中,比方:MySQL、Oracle、SQL Server等。SQ典型(ANSI/ISO)有:

l  SQL-92:1995年发布的SQL语言职业;

l  SQL:1999:1996年颁发的SQL语言标签;

l  SQL:二零零三:2004年发布的SQL语言标签;

 

那个专门的学业就与JDK的版本同样,在新的本子中总要有部分语法的变化。差异偶然候期的数据库对两样专门的学业做了落到实处。

虽说SQL能够用在装有关系型数据库中,但非常多数据库还都有标准之后的局地语法,大家能够称之为“方言”。比如MySQL中的LIMIT语句正是MySQL唯有的白话,另外数据库都不协助!当然,Oracle或SQL Server都有谈得来的白话。

 

1.2 语法要求

l  SQL语句能够单行或多石籀文写,以分局结尾;

l  能够用空格和缩进来来加强语句的可读性;

l  关键字不区分大小写,建议选用大写;

 

SQL语句分类:

  • 修改表时钦赐主键:
  • 修改表时钦点主键:
2 分类

l  DDL(Data Definition Language):数据定义语言,用来定义数据库对象:库、表、列等;

l  DML(Data Manipulation Language):数据操作语言,用来定义数据库记录(数据);

l  DCL(Data Control Language):数据调节语言,用来定义访谈权限和安全等级;

l  DQL(Data Query Language):数据查询语言,用来查询记录(数据)。

 

2 分类

l  DDL(Data Definition Language):数据定义语言,用来定义数据库对象:库、表、列等;

l  DML(Data Manipulation Language):数据操作语言,用来定义数据库记录(数据);

l  DCL(Data Control Language):数据调节语言,用来定义访谈权限和安全等级;

l  DQL(Data Query Language):数据查询语言,用来询问记录(数据)。

 

  1. DDL(Data Definition Language):数据定义语言,用来定义数据库对象:库、表、列等;
      > 创建、删除、修改:库、表结构!!!
  2. DML(Data Manipulation Language):数据操作语言,用来定义数据库记录(数据);
      > 增、删、改:表记录
  3. DCL(Data Control Language):数据调整语言,用来定义访谈权限和安全等第;
  4. DQL(Data Query Language):数据查询语言,用来询问记录(数据)。
    ddl:数据库或表的构造操作
    dml:对表的记录实行更新(增、删、改)
    dql:对表的笔录的询问
    dcl:对客商的创设,及授权!

ALTER TABLE stu ADD PRIMARY KEY(sid);

ALTER TABLE stu ADD PRIMARY KEY(sid);

3 DDL(数据定义语言)

3.1 基本操作

l  查看全数数据库名称:SHOW DATABASES; 

l  切换数据库:USE mydb1,切换来mydb1数据库;

3.2 操作数据库

l  成立数据库:CREATE DATABASE [IF NOT EXISTS] mydb1;

成立数据库,比如:CREATE DATABASE mydb1,创造一个名称为mydb1的数据库。倘若这一个数量已经存在,那么会报错。举个例子CREATE DATABASE IF NOT EXISTS mydb1,在名称为mydb1的数据库空中楼阁时创建该库,那样能够幸免报错。

 

l  删除数据库:DROP DATABASE [IF EXISTS] mydb1;

删去数据库,举例:DROP DATABASE mydb1,删除名叫mydb1的数据库。若是这一个数据库荒诞不经,那么会报错。DROP DATABASE IF EXISTS mydb1,就算mydb1不设有,也不会的报错。

 

l  修改数据库编码:ALTEKoleos DATABASE mydb1 CHARACTEPRADO SET utf8

修改数据库mydb1的编码为utf8。注意,在MySQL中持有的UTF-8编码都不能够应用个中的“-”,即UTF-8要书写为UTF8。

 

3.3 数据类型

MySQL与Java同样,也会有数据类型。MySQL中数据类型首要接纳在列上。

 

常用类型:

l  int:整型

l  double:浮点型,比方double(5,2)表示最多5位,当中必得有2位小数,即最大值为999.99;

l  decimal:泛型型,在表单钱方面利用该项目,因为不会产出精度缺点和失误难题;

l  char:固定长度字符串类型;

l  varchar:可变长度字符串类型;

l  text:字符串类型;

l  blob:字节类型;

l  date:日期类型,格式为:yyyy-MM-dd;

l  time:时间等级次序,格式为:hh:mm:ss

l  timestamp:时间戳类型;

 

3.4 操作表

l  创建表:

CREATE TABLE 表名(

  列名 列类型,

  列名 列类型,

  ......

);

例如:

CREATE TABLE stu(

         sid        CHAR(6),

         sname      VARCHAR(20),

         age            INT,

         gender     VARCHAR(10)

);

 

再例如:

CREATE TABLE emp(

         eid             CHAR(6),

         ename     VARCHAR(50),

         age            INT,

         gender     VARCHAR(6),

         birthday  DATE,

         hiredate  DATE,

         salary       DECIMAL(7,2),

         resume    VARCHAR(1000)

);

 

l  查看当前数据库中全部表名称:SHOW TABLES; 

l  查看钦命表的创始语句:SHOW CREATE TABLE emp,查看emp表的创设语句;

l  查看表结构:DESC emp,查看emp表结构;

l  删除表:DROP TABLE emp,删除emp表;

 

l  修改表:

  1. 添加列:给stu表添加classname列:

ALTER TABLE stu ADD (classname varchar(100));

 

  1. 修改列类型:修改stu表的gender列类型为CHAOdyssey(2):

ALTER TABLE stu MODIFY gender CHAR(2);

 

  1. 修改列名:修改stu表的gender列名称叫sex:

ALTER TABLE stu change gender sex CHAR(2);

 

  1. 删除列:删除stu表的classname列:

ALTER TABLE stu DROP classname;

 

  1. 修改表名称:修改stu表名字为student:

ALTER TABLE stu RENAME TO student;

 

3 DDL(数据定义语言)

3.1 基本操作

l  查看全数数据库名称:SHOW DATABASES; 

l  切换数据库:USE mydb1,切换成mydb1数据库;

3.2 操作数据库

l  创设数据库:CREATE DATABASE [IF NOT EXISTS] mydb1;

始建数据库,举例:CREATE DATABASE mydb1,创制贰个名称为mydb1的数据库。若是那些数额已经存在,那么会报错。比如CREATE DATABASE IF NOT EXISTS mydb1,在名称为mydb1的数据库海市蜃楼时创立该库,那样能够免止报错。

 

l  删除数据库:DROP DATABASE [IF EXISTS] mydb1;

删去数据库,举例:DROP DATABASE mydb1,删除名字为mydb1的数据库。假若那个数据库不设有,那么会报错。DROP DATABASE IF EXISTS mydb1,就算mydb1荒诞不经,也不会的报错。

 

l  修改数据库编码:ALTE本田CR-V DATABASE mydb1 CHARACTE大切诺基 SET utf8

修改数据库mydb1的编码为utf8。注意,在MySQL中兼有的UTF-8编码都不可能使用在那之中的“-”,即UTF-8要书写为UTF8。

 

3.3 数据类型

MySQL与Java一样,也可能有数据类型。MySQL中数据类型首要选取在列上。

 

常用类型:

l  int:整型

l  double:浮点型,举个例子double(5,2)表示最多5位,个中必需有2位小数,即最大值为999.99;

l  decimal:泛型型,在表单钱方面利用该类型,因为不会并发精度缺点和失误难题;

l  char:固定长度字符串类型;

l  varchar:可变长度字符串类型;

l  text:字符串类型;

l  blob:字节类型;

l  date:日期类型,格式为:yyyy-MM-dd;

l  time:时间档期的顺序,格式为:hh:mm:ss

l  timestamp:时间戳类型;

 

3.4 操作表

l  创建表:

CREATE TABLE 表名(

  列名 列类型,

  列名 列类型,

  ......

);

例如:

CREATE TABLE stu(

         sid        CHAR(6),

         sname      VARCHAR(20),

         age            INT,

         gender     VARCHAR(10)

);

 

再例如:

CREATE TABLE emp(

         eid             CHAR(6),

         ename     VARCHAR(50),

         age            INT,

         gender     VARCHAR(6),

         birthday  DATE,

         hiredate  DATE,

         salary       DECIMAL(7,2),

         resume    VARCHAR(1000)

);

 

l  查看当前数据库中有所表名称:SHOW TABLES; 

l  查看内定表的创始语句:SHOW CREATE TABLE emp,查看emp表的创立语句;

l  查看表结构:DESC emp,查看emp表结构;

l  删除表:DROP TABLE emp,删除emp表;

 

l  修改表:

  1. 添加列:给stu表添加classname列:

ALTER TABLE stu ADD (classname varchar(100));

 

  1. 修改列类型:修改stu表的gender列类型为CHALacrosse(2):

ALTER TABLE stu MODIFY gender CHAR(2);

 

  1. 修改列名:修改stu表的gender列名称叫sex:

ALTER TABLE stu change gender sex CHAR(2);

 

  1. 删除列:删除stu表的classname列:

ALTER TABLE stu DROP classname;

 

  1. 修改表名称:修改stu表名叫student:

ALTER TABLE stu RENAME TO student;

 

问询Sql语句的分类未来,上边大家将稳重计算一下有关DDL的应用:

  • 去除主键:
  • 删去主键:
4 DML(数据操作语言)

4.1 插入数据

语法:

INSERT INTO 表名(列名1,列名2, …) VALUES(值1, 值2)

INSERT INTO stu(sid, sname,age,gender) VALUES('s_1001', 'zhangSan', 23, 'male');

INSERT INTO stu(sid, sname) VALUES('s_1001', 'zhangSan');[崔3] 

 

语法:

INSERT INTO 表名 VALUES(值1,值2,…)

因为从没点名要插入的列,表示按成立表时列的一一插入全部列的值:

INSERT INTO stu VALUES('s_1002', 'liSi', 32, 'female');

 

  注意:全数字符串数据必得利用单援用!

 

4.2 修改数据(update)

语法:

UPDATE 表名 SET 列名1=值1, … 列名n=值n [WHERE 条件]

UPDATE stu SET sname=’zhangSanSan’, age=’32’, gender=’female’ WHERE sid=’s_1001’;

UPDATE stu SET sname=’liSi’, age=’20’ WHERE age>50 AND gender=’male’;

UPDATE stu SET sname=’wangWu’, age=’30’ WHERE age>60 OR gender=’female’;

UPDATE stu SET gender=’female’ WHERE gender IS NULL

UPDATE stu SET age=age 1 WHERE sname=’zhaoLiu’;

 

4.3 删除数据

语法:

DELETE FROM 表名 [WHERE 条件]

DELETE FROM stu WHERE sid=’s_1001’003B

DELETE FROM stu WHERE sname=’chenQi’ OR age > 30;

DELETE FROM stu;[崔4] 

 

语法:

TRUNCATE TABLE 表名

TRUNCATE TABLE stu;[崔5] 

 

尽管如此TRUNCATE和DELETE都足以删除表的有所记录,但有原理分歧。DELETE的功能未有TRUNCATE高!

TRUNCATE其实属性DDL语句,因为它是先DROP TABLE,再CREATE TABLE。况且TRUNCATE删除的记录是不可能回滚的,但DELETE删除的笔录是能够回滚的(回滚是业务的知识!)。

 

4 DML(数据操作语言)

4.1 插入数据

语法:

INSERT INTO 表名(列名1,列名2, …) VALUES(值1, 值2)

INSERT INTO stu(sid, sname,age,gender) VALUES('s_1001', 'zhangSan', 23, 'male');

INSERT INTO stu(sid, sname) VALUES('s_1001', 'zhangSan');[崔3] 

 

语法:

INSERT INTO 表名 VALUES(值1,值2,…)

因为未有一点点名要插入的列,表示按创设表时列的次第插入全体列的值:

INSERT INTO stu VALUES('s_1002', 'liSi', 32, 'female');

 

  注意:全体字符串数据必需运用单援引!

 

4.2 修改数据(update)

语法:

UPDATE 表名 SET 列名1=值1, … 列名n=值n [WHERE 条件]

UPDATE stu SET sname=’zhangSanSan’, age=’32’, gender=’female’ WHERE sid=’s_1001’;

UPDATE stu SET sname=’liSi’, age=’20’ WHERE age>50 AND gender=’male’;

UPDATE stu SET sname=’wangWu’, age=’30’ WHERE age>60 OR gender=’female’;

UPDATE stu SET gender=’female’ WHERE gender IS NULL

UPDATE stu SET age=age 1 WHERE sname=’zhaoLiu’;

 

4.3 删除数据

语法:

DELETE FROM 表名 [WHERE 条件]

DELETE FROM stu WHERE sid=’s_1001’003B

DELETE FROM stu WHERE sname=’chenQi’ OR age > 30;

DELETE FROM stu;[崔4] 

 

语法:

TRUNCATE TABLE 表名

TRUNCATE TABLE stu;[崔5] 

 

尽管如此TRUNCATE和DELETE都足以删除表的具有记录,但有原理分裂。DELETE的功能未有TRUNCATE高!

TRUNCATE其实属性DDL语句,因为它是先DROP TABLE,再CREATE TABLE。况且TRUNCATE删除的记录是无计可施回滚的,但DELETE删除的笔录是足以回滚的(回滚是业务的知识!)。

 

从宏观的层面大家先介绍基于数据库的操作:

ALTER TABLE stu DROP PRIMARY KEY;

ALTER TABLE stu DROP PRIMARY KEY;

5 DCL

5.1 成立客户

语法:

CREATE USER 用户名@地址 IDENTIFIED BY '密码';

CREATE USER user1@localhost IDENTIFIED BY ‘123’;[崔6] 

CREATE USER user2@’%’ IDENTIFIED BY ‘123’;[崔7] 

 

5.2 给顾客授权

  语法:

GRANT 权限1, … , 权限n ON 数据库.* TO 用户名

GRANT CREATE,ALTER,DROP,INSERT,UPDATE,DELETE,SELECT ON mydb1.* TO user1@localhost;

GRANT ALL ON mydb1.* TO user2@localhost;

 

5.3 撤废授权

  语法:

  REVOKE权限1, … , 权限n ON 数据库.* FORM 用户名

REVOKE CREATE,ALTER,DROP ON mydb1.* FROM user1@localhost;

 

5.4 查看客商权限

语法:

SHOW GRANTS FOR 用户名

SHOW GRANTS FOR user1@localhost;

 

5.5 删除客商

语法:

DROP USER 用户名

DROP USER user1@localhost;

 

5.6 修改客商密码

语法:

USE mysql;

UPDATE USER SET PASSWORD=PASSWORD(‘密码’) WHERE User=’用户名’ and Host=’IP’;

FLUSH PRIVILEGES;

UPDATE USER SET PASSWORD=PASSWORD('1234') WHERE User='user2' and Host=’localhost’;

FLUSH PRIVILEGES;

 

5 DCL

5.1 创设客户

语法:

CREATE USER 用户名@地址 IDENTIFIED BY '密码';

CREATE USER user1@localhost IDENTIFIED BY ‘123’;[崔6] 

CREATE USER user2@’%’ IDENTIFIED BY ‘123’;[崔7] 

 

5.2 给顾客授权

  语法:

GRANT 权限1, … , 权限n ON 数据库.* TO 用户名

GRANT CREATE,ALTER,DROP,INSERT,UPDATE,DELETE,SELECT ON mydb1.* TO user1@localhost;

GRANT ALL ON mydb1.* TO user2@localhost;

 

5.3 裁撤授权

  语法:

  REVOKE权限1, … , 权限n ON 数据库.* FORM 用户名

REVOKE CREATE,ALTER,DROP ON mydb1.* FROM user1@localhost;

 

5.4 查看顾客权限

语法:

SHOW GRANTS FOR 用户名

SHOW GRANTS FOR user1@localhost;

 

5.5 删除客商

语法:

DROP USER 用户名

DROP USER user1@localhost;

 

5.6 修改客户密码

语法:

USE mysql;

UPDATE USER SET PASSWORD=PASSWORD(‘密码’) WHERE User=’用户名’ and Host=’IP’;

FLUSH PRIVILEGES;

UPDATE USER SET PASSWORD=PASSWORD('1234') WHERE User='user2' and Host=’localhost’;

FLUSH PRIVILEGES;

 

 *查阅全数数据库:SHOW DATABASES
* 切换(选拔要操作的)数据库:USE 数据库名
* 成立数据库:CREATE DATABASE [IF NOT EXISTS] mydb1 [CHARSET=utf8]
* 删除数据库:DROP DATABASE [IF EXISTS] mydb1
* 修改数据库编码:ALTE昂Cora DATABASE mydb1 CHARACTE昂Cora SET utf8

2、主键自拉长

2、主键自拉长

3、数据查询语法(DQL)

  DQL就是数码查询语言,数据库实施DQL语句不会对数码举办退换,而是让数据库发送结果集给客商端。

语法:

SELECT selection_list /*要询问的列名称*/

  FROM table_list /*要询问的表名称*/

 

  WHERE condition /*行条件*/

 

  GROUP BY grouping_columns /*对结果分组*/

 

  HAVING condition /*分组后的行条件*/

 

  ORDER BY sorting_columns /*对结果分组*/

 

  LIMIT offset_start, row_count /*结果限定*/

 

创建名:

l  学生表:stu

字段名称

字段类型

说明

sid

char(6)

学生学号

sname

varchar(50)

学生姓名

age

int

学生年龄

gender

varchar(50)

学生性别

 

CREATE TABLE stu (

         sid    CHAR(6),

         sname               VARCHAR(50),

         age            INT,

         gender     VARCHAR(50)

);

INSERT INTO stu VALUES('S_1001', 'liuYi', 35, 'male');

INSERT INTO stu VALUES('S_1002', 'chenEr', 15, 'female');

INSERT INTO stu VALUES('S_1003', 'zhangSan', 95, 'male');

INSERT INTO stu VALUES('S_1004', 'liSi', 65, 'female');

INSERT INTO stu VALUES('S_1005', 'wangWu', 55, 'male');

INSERT INTO stu VALUES('S_1006', 'zhaoLiu', 75, 'female');

INSERT INTO stu VALUES('S_1007', 'sunQi', 25, 'male');

INSERT INTO stu VALUES('S_1008', 'zhouBa', 45, 'female');

INSERT INTO stu VALUES('S_1009', 'wuJiu', 85, 'male');

INSERT INTO stu VALUES('S_1010', 'zhengShi', 5, 'female');

INSERT INTO stu VALUES('S_1011', 'xxx', NULL, NULL);

 

l  雇员表:emp

字段名称

字段类型

说明

empno

int

员工编号

ename

varchar(50)

员工姓名

job

varchar(50)

员工工作

mgr

int

领导编号

hiredate

date

入职日期

sal

decimal(7,2)

月薪

comm

decimal(7,2)

奖金

deptno

int

部分编号

 

CREATE TABLE emp(

         empno               INT,

         ename               VARCHAR(50),

         job             VARCHAR(50),

         mgr           INT,

         hiredate   DATE,

         sal             DECIMAL(7,2),

         comm                decimal(7,2),

         deptno               INT

) ;

INSERT INTO emp values(7369,'SMITH','CLERK',7902,'1980-12-17',800,NULL,20);

INSERT INTO emp values(7499,'ALLEN','SALESMAN',7698,'1981-02-20',1600,300,30);

INSERT INTO emp values(7521,'WARD','SALESMAN',7698,'1981-02-22',1250,500,30);

INSERT INTO emp values(7566,'JONES','MANAGER',7839,'1981-04-02',2975,NULL,20);

INSERT INTO emp values(7654,'MARTIN','SALESMAN',7698,'1981-09-28',1250,1400,30);

INSERT INTO emp values(7698,'BLAKE','MANAGER',7839,'1981-05-01',2850,NULL,30);

INSERT INTO emp values(7782,'CLARK','MANAGER',7839,'1981-06-09',2450,NULL,10);

INSERT INTO emp values(7788,'SCOTT','ANALYST',7566,'1987-04-19',3000,NULL,20);

INSERT INTO emp values(7839,'KING','PRESIDENT',NULL,'1981-11-17',5000,NULL,10);

INSERT INTO emp values(7844,'TURNER','SALESMAN',7698,'1981-09-08',1500,0,30);

INSERT INTO emp values(7876,'ADAMS','CLERK',7788,'1987-05-23',1100,NULL,20);

INSERT INTO emp values(7900,'JAMES','CLERK',7698,'1981-12-03',950,NULL,30);

INSERT INTO emp values(7902,'FORD','ANALYST',7566,'1981-12-03',3000,NULL,20);

INSERT INTO emp values(7934,'MILLER','CLERK',7782,'1982-01-23',1300,NULL,10);

 

l  部分表:dept

字段名称

字段类型

说明

deptno

int

部分编码

dname

varchar(50)

部分名称

loc

varchar(50)

部分所在地点

 

CREATE TABLE dept(

         deptno               INT,

         dname               varchar(14),

         loc             varchar(13)

);

INSERT INTO dept values(10, 'ACCOUNTING', 'NEW YORK');

INSERT INTO dept values(20, 'RESEARCH', 'DALLAS');

INSERT INTO dept values(30, 'SALES', 'CHICAGO');

INSERT INTO dept values(40, 'OPERATIONS', 'BOSTON');

 

3、数据查询语法(DQL)

  DQL正是数据查询语言,数据库实施DQL语句不会对数码开展改动,而是让数据库发送结果集给顾客端。

语法:

SELECT selection_list /*要查询的列名称*/

  FROM table_list /*要询问的表名称*/

 

  WHERE condition /*行条件*/

 

  GROUP BY grouping_columns /*对结果分组*/

 

  HAVING condition /*分组后的行条件*/

 

  ORDER BY sorting_columns /*对结果分组*/

 

  LIMIT offset_start, row_count /*结果限定*/

 

创建名:

l  学生表:stu

字段名称

字段类型

说明

sid

char(6)

学生学号

sname

varchar(50)

学生姓名

age

int

学生年龄

gender

varchar(50)

学生性别

 

CREATE TABLE stu (

         sid    CHAR(6),

         sname               VARCHAR(50),

         age            INT,

         gender     VARCHAR(50)

);

INSERT INTO stu VALUES('S_1001', 'liuYi', 35, 'male');

INSERT INTO stu VALUES('S_1002', 'chenEr', 15, 'female');

INSERT INTO stu VALUES('S_1003', 'zhangSan', 95, 'male');

INSERT INTO stu VALUES('S_1004', 'liSi', 65, 'female');

INSERT INTO stu VALUES('S_1005', 'wangWu', 55, 'male');

INSERT INTO stu VALUES('S_1006', 'zhaoLiu', 75, 'female');

INSERT INTO stu VALUES('S_1007', 'sunQi', 25, 'male');

INSERT INTO stu VALUES('S_1008', 'zhouBa', 45, 'female');

INSERT INTO stu VALUES('S_1009', 'wuJiu', 85, 'male');

INSERT INTO stu VALUES('S_1010', 'zhengShi', 5, 'female');

INSERT INTO stu VALUES('S_1011', 'xxx', NULL, NULL);

 

l  雇员表:emp

字段名称

字段类型

说明

empno

int

员工编号

ename

varchar(50)

员工姓名

job

varchar(50)

员工工作

mgr

int

领导编号

hiredate

date

入职日期

sal

decimal(7,2)

月薪

comm

decimal(7,2)

奖金

deptno

int

部分编号

 

CREATE TABLE emp(

         empno               INT,

         ename               VARCHAR(50),

         job             VARCHAR(50),

         mgr           INT,

         hiredate   DATE,

         sal             DECIMAL(7,2),

         comm                decimal(7,2),

         deptno               INT

) ;

INSERT INTO emp values(7369,'SMITH','CLERK',7902,'1980-12-17',800,NULL,20);

INSERT INTO emp values(7499,'ALLEN','SALESMAN',7698,'1981-02-20',1600,300,30);

INSERT INTO emp values(7521,'WARD','SALESMAN',7698,'1981-02-22',1250,500,30);

INSERT INTO emp values(7566,'JONES','MANAGER',7839,'1981-04-02',2975,NULL,20);

INSERT INTO emp values(7654,'MARTIN','SALESMAN',7698,'1981-09-28',1250,1400,30);

INSERT INTO emp values(7698,'BLAKE','MANAGER',7839,'1981-05-01',2850,NULL,30);

INSERT INTO emp values(7782,'CLARK','MANAGER',7839,'1981-06-09',2450,NULL,10);

INSERT INTO emp values(7788,'SCOTT','ANALYST',7566,'1987-04-19',3000,NULL,20);

INSERT INTO emp values(7839,'KING','PRESIDENT',NULL,'1981-11-17',5000,NULL,10);

INSERT INTO emp values(7844,'TURNER','SALESMAN',7698,'1981-09-08',1500,0,30);

INSERT INTO emp values(7876,'ADAMS','CLERK',7788,'1987-05-23',1100,NULL,20);

INSERT INTO emp values(7900,'JAMES','CLERK',7698,'1981-12-03',950,NULL,30);

INSERT INTO emp values(7902,'FORD','ANALYST',7566,'1981-12-03',3000,NULL,20);

INSERT INTO emp values(7934,'MILLER','CLERK',7782,'1982-01-23',1300,NULL,10);

 

l  部分表:dept

字段名称

字段类型

说明

deptno

int

部分编码

dname

varchar(50)

部分名称

loc

varchar(50)

部分所在地点

 

CREATE TABLE dept(

         deptno               INT,

         dname               varchar(14),

         loc             varchar(13)

);

INSERT INTO dept values(10, 'ACCOUNTING', 'NEW YORK');

INSERT INTO dept values(20, 'RESEARCH', 'DALLAS');

INSERT INTO dept values(30, 'SALES', 'CHICAGO');

INSERT INTO dept values(40, 'OPERATIONS', 'BOSTON');

 

-- 首先先进行查询数据库,下面是我的数据库
mysql> show databases;
 -------------------- 
| Database           |
 -------------------- 
| information_schema |
| bookstore          |
| bos                |
| category           |
| chatroom           |
| crm                |
| dangdang           |  |
| maven              |
| mmall              |
| mybaits            |
| mysql              |
| o2o                |
| performance_schema |
| registersystem     |
| spring6            |
| spring_day03       |
| springmvc          |
 -------------------- 
29 rows in set (0.53 sec)

--创建数据库Sql语句
mysql> create database if not exists mydb1 charset=utf8;
Query OK, 1 row affected (0.04 sec)

-- 删除数据库的SQL语句
mysql> drop database mydb1;
Query OK, 0 rows affected (0.24 sec)

-- 确认数据库是否删除
mysql> show databases;
 -------------------- 
| Database           |
 -------------------- 
| information_schema |
| bookstore          |
| bos                |
| category           |
| chatroom           |
| crm                |
| dangdang           |
| maven              |
| mmall              |
| mybaits            |
| mysql              |
| o2o                |
| performance_schema |
| registersystem     |
| spring6            |
| spring_day03       |
| springmvc          |
 -------------------- 
29 rows in set (0.00 sec)
  • 因为主键列的特征是:必得独一,不能够为空,所以大家平日会内定主键为整型,然后设置其自行增加,那样能够确定保证在插入数据时主键列的举世无双和非空天性。
  • 始建表时钦定主键自增加

    CREATE TABLE stu(

    sid  INT PRIMARY KEY AUTO_INCREMENT,
    sname  VARCHAR(20),
    age  INT,
    sex  VARCHEAR(10)
    

    );

  • 修改表时设置主键自拉长:

  • 因为主键列的表征是:必得唯一,无法为空,所以大家普通会钦命主键为整型,然后设置其机动拉长,那样能够确认保障在插入数据时主键列的唯一和非空性格。
  • 制造表时内定主键自增进

    CREATE TABLE stu(

    sid  INT PRIMARY KEY AUTO_INCREMENT,
    sname  VARCHAR(20),
    age  INT,
    sex  VARCHEAR(10)
    

    );

  • 修改表时设置主键自拉长:

1 基础查询

1.1 查询全部列

SELECT * FROM stu;

 

1.2 查询钦赐列

SELECT sid, sname, age FROM stu; 【select sid,sname,sid sname from stu;】

能够壹次询问多列

 

1 基础查询

1.1 查询全体列

SELECT * FROM stu;

 

1.2 查询钦点列

SELECT sid, sname, age FROM stu; 【select sid,sname,sid sname from stu;】

能够贰遍询问多列

 

 2. 数据类型(列类型)

ALTER TABLE stu CHANGE sid sid INT AUTO_INCREMENT;

ALTER TABLE stu CHANGE sid sid INT AUTO_INCREMENT;

2 条件查询

2.1 条件查询介绍

规范查询正是在查询时给出WHERE子句,在WHERE子句中得以行使如下运算符及关键字:

l  =、!=、<>、<、<=、>、>=;

l  BETWEEN…AND; (左边两端都带有)

l  IN(set);

l  IS NULL; update stu set sage=20 where sage=null; sage=null永恒是false,所以要用is null。

l  IS NOT NULL

l  AND;

l  OR;

l  NOT;

 

2.2 查询性别为女,而且年龄50的笔录

  SELECT * FROM stu

WHERE gender='female' AND ge<50;

 

2.3 查询学号为S_1001,可能姓名叫liSi的笔录

SELECT * FROM stu

WHERE sid ='S_1001' OR sname='liSi';

 

2.4 查询学号为S_1001,S_1002,S_1003的记录

SELECT * FROM stu

WHERE sid IN ('S_1001','S_1002','S_1003');

 

2.5 查询学号不是S_1001,S_1002,S_1003的记录

SELECT * FROM tab_student

WHERE s_number NOT IN ('S_1001','S_1002','S_1003');

 

2.6 查询年龄为null的笔录

SELECT * FROM stu

WHERE age IS NULL;

 

2.7 查询年龄在20到40里头的学生记录

SELECT *

FROM stu

WHERE age>=20 AND age<=40;

或者

SELECT *

FROM stu

WHERE age BETWEEN 20 AND 40;

 

2.8 查询性别非男的学习者记录

SELECT *

FROM stu

WHERE gender!='male';

或者

SELECT *

FROM stu

WHERE gender<>'male';

或者

SELECT *

FROM stu

WHERE NOT gender='male';

 

2.9 查询姓名不为null的学员记录

SELECT *

FROM stu

WHERE NOT sname IS NULL;

或者

SELECT *

FROM stu

WHERE sname IS NOT NULL;

 

2 条件查询

2.1 条件查询介绍

规范查询就是在查询时给出WHERE子句,在WHERE子句中得以应用如下运算符及关键字:

l  =、!=、<>、<、<=、>、>=;

l  BETWEEN…AND; (左侧两端都蕴含)

l  IN(set);

l  IS NULL; update stu set sage=20 where sage=null; sage=null永恒是false,所以要用is null。

l  IS NOT NULL

l  AND;

l  OR;

l  NOT;

 

2.2 查询性别为女,况且年龄50的笔录

  SELECT * FROM stu

WHERE gender='female' AND ge<50;

 

2.3 查询学号为S_1001,只怕姓名字为liSi的记录

SELECT * FROM stu

WHERE sid ='S_1001' OR sname='liSi';

 

2.4 查询学号为S_1001,S_1002,S_1003的记录

SELECT * FROM stu

WHERE sid IN ('S_1001','S_1002','S_1003');

 

2.5 查询学号不是S_1001,S_1002,S_1003的记录

SELECT * FROM tab_student

WHERE s_number NOT IN ('S_1001','S_1002','S_1003');

 

2.6 查询年龄为null的笔录

SELECT * FROM stu

WHERE age IS NULL;

 

2.7 查询年龄在20到40中间的学员记录

SELECT *

FROM stu

WHERE age>=20 AND age<=40;

或者

SELECT *

FROM stu

WHERE age BETWEEN 20 AND 40;

 

2.8 查询性别非男的学生记录

SELECT *

FROM stu

WHERE gender!='male';

或者

SELECT *

FROM stu

WHERE gender<>'male';

或者

SELECT *

FROM stu

WHERE NOT gender='male';

 

2.9 查询姓名不为null的上学的小孩子记录

SELECT *

FROM stu

WHERE NOT sname IS NULL;

或者

SELECT *

FROM stu

WHERE sname IS NOT NULL;

 

int:整型
double:浮点型,比如double(5,2)表示最多5位,在那之中必得有2位小数,即最大值为999.99;
decimal:浮点型,在表单钱方面选取该项目,因为不会冒出精度缺点和失误难题;
char:固定长度字符串类型; char(255),数据的长短相差钦点长度,补足到内定长度!
varchar:可变长度字符串类型; varchar(65535), zhangSan
text(clob):字符串类型;
  > 很小
  > 小
  > 中
  > 大
blob:字节类型;
  > 很小
  > 小
  > 中
  > 大
date:日期类型,格式为:yyyy-MM-dd;
time:时间等级次序,格式为:hh:mm:ss
timestamp:时间戳类型;

  • 修改表时去除主键自增加:
  • 修改表时去除主键自增加:
3 模糊查询(单词中含有a字母)

当想询问姓名中包罗a字母的上学的儿童时就需求接纳模糊查询了。模糊查询必要运用首要字LIKE。

3.1 查询姓名由5个假名构成的学习者记录

SELECT *

FROM stu

WHERE sname LIKE '_____';

混淆查询必需使用LIKE关键字。其中“_”相称任意多少个字母,5个“_”表示5个大肆字母。

 

3.2 查询姓名由5个字母构成,何况第5个字母为“i”的学习者记录

SELECT *

FROM stu

WHERE sname LIKE '____i';

 

3.3 查询姓名以“z”最初的学童记录  (%表示别的的位数,“%”相称0~n个别的字母)

SELECT *

FROM stu

WHERE sname LIKE 'z%';

其中“%”匹配0~n个其余字母。

 

3.4 查询姓名中第4个字母为“i”的学习者记录 ( '_i%'

SELECT *

FROM stu

WHERE sname LIKE '_i%';

 

3.5 查询姓名中包含“a”字母的上学的小孩子记录(where sname like '%y%' and sage>15;可以组合使用)

SELECT *

FROM stu

WHERE sname LIKE '%a%';

 

3 模糊查询(单词中含有a字母)

当想询问姓名中隐含a字母的上学的小孩子时就必要使用模糊查询了。模糊查询必要利用首要字LIKE。

3.1 查询姓名由5个假名构成的学习者记录

SELECT *

FROM stu

WHERE sname LIKE '_____';

模糊查询必得使用LIKE关键字。个中“_”相配大肆一个字母,5个“_”表示5个猖獗字母。

 

3.2 查询姓名由5个假名构成,况且第5个字母为“i”的上学的小孩子记录

SELECT *

FROM stu

WHERE sname LIKE '____i';

 

3.3 查询姓名以“z”起始的上学的小孩子记录  (%表示其他的位数,“%”相称0~n个别的字母)

SELECT *

FROM stu

WHERE sname LIKE 'z%';

其中“%”匹配0~n个别的字母。

 

3.4 查询姓名中第3个字母为“i”的上学的小孩子记录 ( '_i%'

SELECT *

FROM stu

WHERE sname LIKE '_i%';

 

3.5 查询姓名中包罗“a”字母的上学的小孩子记录(where sname like '%y%' and sage>15;能够组合使用)

SELECT *

FROM stu

WHERE sname LIKE '%a%';

 

对表操作的语法格式和案例:

ALTER TABLE stu CHANGE sid sid INT ;

ALTER TABLE stu CHANGE sid sid INT ;

4 字段调节查询(去除重复记录,字段加减,增添别称等)

4.1 去除重复记录( distinct )

除去重复记录(两行或两行以上记录中一种类的上的数目都一致),比如emp表中sal字段就存在同样的记录。当只查询emp表的sal字段时,那么会并发重复记录,那么想去除重复记录,供给选用DISTINCT:(man man man female female)-à man female

SELECT DISTINCT sal FROM emp;

 

4.2 查看雇员的月工资与酬劳之和

  因为sal和comm两列的门类都以数值类型,所以能够做加运算。假使sal或comm中有八个字段不是数值类型,那么会出错。

SELECT *,sal comm FROM emp;

 

comm列有无数笔录的值为NULL,因为任马珂西与NULL相加结果可能NULL,所以结账结果可能会出现NULL。上边选拔了把NULL转变到数值0的函数IFNULL:

SELECT *, sal IFNULL (comm, 0) FROM emp;

 

4.3 给列名增多小名(AS …)会生成新的total列

在地点查询中冒出列名字为sal IFNULL(comm,0),那十分不美观,未来我们给这一列给出二个小名,为total:

SELECT *, sal IFNULL(comm,0) AS total FROM emp;

给列起别称时,是能够大致AS关键字的:

SELECT *,sal IFNULL(comm,0) total FROM emp;

 

4 字段调整查询(去除重复记录,字段加减,增加外号等)

4.1 去除重复记录( distinct )

除去重复记录(两行或两行以上记录中数不清的上的数额都无差别),比方emp表中sal字段就存在同样的记录。当只查询emp表的sal字段时,那么会油可是生重复记录,那么想去除重复记录,须求动用DISTINCT:(man man man female female)-à man female

SELECT DISTINCT sal FROM emp;

 

4.2 查看雇员的月收入与工资之和

  因为sal和comm两列的类型都以数值类型,所以能够做加运算。假设sal或comm中有一个字段不是数值类型,那么会出错。

SELECT *,sal comm FROM emp;

 

comm列有多数记录的值为NULL,因为别的东西与NULL相加结果要么NULL,所以付账结果恐怕会现出NULL。上边选择了把NULL调换到数值0的函数IFNULL:

SELECT *, sal IFNULL (comm, 0) FROM emp;

 

4.3 给列名增多外号(AS …)会变动新的total列

在上头查询中现身列名字为sal IFNULL(comm,0),那很欠赏心悦目,现在我们给这一列给出几个小名,为total:

SELECT *, sal IFNULL(comm,0) AS total FROM emp;

给列起小名时,是能够归纳AS关键字的:

SELECT *,sal IFNULL(comm,0) total FROM emp;

 

语法:

  • 测量检验主键自增进:
  • 测量试验主键自增进:
5 排序( ORDER BY _____ ASC ascend;   DESC descend)

5.1 查询全数学员记录,按年龄升序排序 ORubiconDE讴歌ZDX BY … ASC

SELECT *

FROM stu

ORDER BY sage ASC;

或者

SELECT *

FROM stu

ORDER BY sage;

 

 

5.2 查询全部学生记录,按年龄降序排序

SELECT *

FROM stu

ORDER BY age DESC;

 

5.3 查询全部雇员,按月薪水降序排序,如若月收入同样不时间,按编号升序排序(order by …asc,…desc)

SELECT * FROM emp

ORDER BY sal DESC,empno ASC;

 

 

5 排序( ORDER BY _____ ASC ascend;   DESC descend)

5.1 查询全体学生记录,按年龄升序排序 O途锐DE大切诺基 BY … ASC

SELECT *

FROM stu

ORDER BY sage ASC;

或者

SELECT *

FROM stu

ORDER BY sage;

 

 

5.2 查询全体学生记录,按年龄降序排序

SELECT *

FROM stu

ORDER BY age DESC;

 

5.3 查询全部雇员,按月收入降序排序,假设月薪同样有时候,按编号升序排序(order by …asc,…desc)

SELECT * FROM emp

ORDER BY sal DESC,empno ASC;

 

 

 表
* 创建表:
  CREATE TABLE [IF NOT EXISTS] 表名(ITCAST_0001
    列名 列类型,
    列名 列类型,
    ...
    列名 列类型
  );
* 查看当前数据库中装有表名称:SHOW TABLES;
* 查看内定表的创办语句:SHOW CREATE TABLE 表名(掌握);
* 查看表结构:DESC 表名;
* 删除表:DROP TABLE 表名;
* 修改表:前缀:ALTER TABLE 表名
  > 修改之增加列:
    ALTER TABLE 表名 ADD (
      列名 列类型,
      列名 列类型,
      ...
    );
  > 修改之修改列类型(如若被改造的列已存在多少,那么新的项目也许会潜濡默化到已存在数量):ALTER TABLE 表名 MODIFY 列名 列类型;
  > 修改之修改列名:ALTE逍客 TABLE 表名 CHANGE 原列名 新列名 列类型;
  > 修改之删除列:ALTE中华V TABLE 表名 DROP 列名;
  > 修改表名称:ALTEKuga TABLE 原表名 RENAME TO 新表名;

INSERT INTO stu VALUES(NULL,'zhangsan',23,'man');

INSERT INTO stu(sname,age,sex) VALUES(NULL,'zhangsan',23,'man');

INSERT INTO stu VALUES(NULL,'zhangsan',23,'man');

INSERT INTO stu(sname,age,sex) VALUES(NULL,'zhangsan',23,'man');

6 聚合函数

聚合函数是用来做纵向运算的函数:

l  COUNT( …):总计钦点列不为NULL的记录行数;

l  MAX():总括钦点列的最大值,要是钦点列是字符串类型,那么使用字符串排序运算;

l  MIN():总括内定列的细微值,若是钦点列是字符串类型,那么使用字符串排序运算;

l  SUM():总结内定列的数值和,假设钦赐列类型不是数值类型,那么合算结果为0;

l  AVG():计算钦命列的平均值,若是钦命列类型不是数值类型,那么合算结果为0;

l  CONCAT(): mysql特有的,连接字符串

l  ROUND(AVG(),2)保留两位小数

 

 

6.1 COUNT

当需求纵向总计时能够采纳COUNT()。

l  查询emp表中记录数:

SELECT COUNT(*) AS cnt FROM emp;

 

l  查询emp表中有回扣的人口:

SELECT COUNT(comm) cnt FROM emp;

小心,因为count()函数中提交的是comm列,那么只总计comm列非NULL的行数。

 

l  查询emp表中每年报酬大于2500的总人口:

SELECT COUNT(*) FROM emp

WHERE sal > 2500;

 

l  计算每月报酬与工资之和超越2500元的食指:(先判别有未有为null的,有的话用IFNULL)

SELECT COUNT(*) AS cnt FROM emp WHERE sal IFNULL(comm,0) > 2500;

 

l  查询有薪金的人口,以及有领导的人口:

SELECT COUNT(comm), COUNT(mgr) FROM emp;

 

6.2 SUM和AVG

当要求纵向求和时使用sum()函数。

l  查询全部雇员每年工资和:

SELECT SUM(sal) FROM emp;

 

l  查询全部雇员每月薪水和,以及全体雇员劳务费和:

SELECT SUM(sal), SUM(comm) FROM emp;

 

l  查询全数雇员每月工资 薪水和:

SELECT SUM(sal IFNULL(comm,0)) FROM emp;

 

l  总计全体职工平均薪俸:

SELECT SUM(sal), COUNT(sal) FROM emp;

或者

SELECT AVG(sal) FROM emp;

 

6.3 MAX和MIN

l  查询最高级程序猿资和最低薪酬:

SELECT MAX(sal), MIN(sal) FROM emp;

 

6.4 CONCAT(’ ‘, ename, ‘,’ job )【mysql特有,连接字符串】

 

 

6.5 ROUND(AVG(sal),2)保留两位小数

 

6 聚合函数

聚合函数是用来做纵向运算的函数:

l  COUNT( …):总括钦定列不为NULL的笔录行数;

l  MAX():总计内定列的最大值,要是钦赐列是字符串类型,那么使用字符串排序运算;

l  MIN():计算钦定列的细小值,即使钦赐列是字符串类型,那么使用字符串排序运算;

l  SUM():计算内定列的数值和,假如钦点列类型不是数值类型,那么合算结果为0;

l  AVG():计算钦赐列的平均值,要是内定列类型不是数值类型,那么合算结果为0;

l  CONCAT(): mysql特有的,连接字符串

l  ROUND(AVG(),2)保留两位小数

 

 

6.1 COUNT

当供给纵向计算时可以利用COUNT()。

l  查询emp表中记录数:

SELECT COUNT(*) AS cnt FROM emp;

 

l  查询emp表中有工钱的总人口:

SELECT COUNT(comm) cnt FROM emp;

介意,因为count()函数中提交的是comm列,那么只计算comm列非NULL的行数。

 

l  查询emp表中月收入大于2500的人头:

SELECT COUNT(*) FROM emp

WHERE sal > 2500;

 

l  总结每年工资与酬金之和超越2500元的人数:(先推断有未有为null的,有的话用IFNULL)

SELECT COUNT(*) AS cnt FROM emp WHERE sal IFNULL(comm,0) > 2500;

 

l  查询有回扣的总人口,以及有老总的人数:

SELECT COUNT(comm), COUNT(mgr) FROM emp;

 

6.2 SUM和AVG

当须求纵向求和时接纳sum()函数。

l  查询全体雇员每月薪资和:

SELECT SUM(sal) FROM emp;

 

l  查询全数雇员年薪和,以及独具雇员薪水和:

SELECT SUM(sal), SUM(comm) FROM emp;

 

l  查询全体雇员每月薪金 酬薪和:

SELECT SUM(sal IFNULL(comm,0)) FROM emp;

 

l  总结全部职员和工人平均薪资:

SELECT SUM(sal), COUNT(sal) FROM emp;

或者

SELECT AVG(sal) FROM emp;

 

6.3 MAX和MIN

l  查询最高级程序猿资和最低薪给:

SELECT MAX(sal), MIN(sal) FROM emp;

 

6.4 CONCAT(’ ‘, ename, ‘,’ job )【mysql特有,连接字符串】

 

 

6.5 ROUND(AVG(sal),2)保留两位小数

 

//创建表
mysql> create table tb_stu(
    -> number char(10),
    -> name varchar(50),
    -> age int,
    -> gender varchar(10)
    -> );
Query OK, 0 rows affected (0.24 sec)

-- 查看表
mysql> show tables;
 ---------------- 
| Tables_in_mydb |
 ---------------- 
| tb_stu         |
 ---------------- 
1 row in set (0.00 sec)

-- 查看表结构
mysql> desc tb_stu;
 -------- ------------- ------ ----- --------- ------- 
| Field  | Type        | Null | Key | Default | Extra |
 -------- ------------- ------ ----- --------- ------- 
| number | char(10)    | YES  |     | NULL    |       |
| name   | varchar(50) | YES  |     | NULL    |       |
| age    | int(11)     | YES  |     | NULL    |       |
| gender | varchar(10) | YES  |     | NULL    |       |
 -------- ------------- ------ ----- --------- ------- 
4 rows in set (0.08 sec)

-- 添加表的字段
mysql> alter table tb_stu
    -> add(
    -> education varchar(50)
    -> );
Query OK, 0 rows affected (0.30 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show tables;
 ---------------- 
| Tables_in_mydb |
 ---------------- 
| tb_stu         |
 ---------------- 
1 row in set (0.00 sec)

mysql> desc tb_stu;
 ----------- ------------- ------ ----- --------- ------- 
| Field     | Type        | Null | Key | Default | Extra |
 ----------- ------------- ------ ----- --------- ------- 
| number    | char(10)    | YES  |     | NULL    |       |
| name      | varchar(50) | YES  |     | NULL    |       |
| age       | int(11)     | YES  |     | NULL    |       |
| gender    | varchar(10) | YES  |     | NULL    |       |
| education | varchar(50) | YES  |     | NULL    |       |
 ----------- ------------- ------ ----- --------- ------- 
5 rows in set (0.02 sec)

-- 修改表的字段信息
mysql> alter table tb_stu
    -> modify education varchar(30);
Query OK, 0 rows affected (0.31 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc tb_stu;
 ----------- ------------- ------ ----- --------- ------- 
| Field     | Type        | Null | Key | Default | Extra |
 ----------- ------------- ------ ----- --------- ------- 
| number    | char(10)    | YES  |     | NULL    |       |
| name      | varchar(50) | YES  |     | NULL    |       |
| age       | int(11)     | YES  |     | NULL    |       |
| gender    | varchar(10) | YES  |     | NULL    |       |
| education | varchar(30) | YES  |     | NULL    |       |
 ----------- ------------- ------ ----- --------- ------- 
5 rows in set (0.02 sec)

-- 删除表的字段
mysql> alter table tb_stu
    -> drop education;
Query OK, 0 rows affected (0.31 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc tb_stu;
 -------- ------------- ------ ----- --------- ------- 
| Field  | Type        | Null | Key | Default | Extra |
 -------- ------------- ------ ----- --------- ------- 
| number | char(10)    | YES  |     | NULL    |       |
| name   | varchar(50) | YES  |     | NULL    |       |
| age    | int(11)     | YES  |     | NULL    |       |
| gender | varchar(10) | YES  |     | NULL    |       |
 -------- ------------- ------ ----- --------- ------- 
4 rows in set (0.02 sec)

--修改表的名称
mysql> alter table tb_stu
    -> rename to tb_student;
Query OK, 0 rows affected (0.07 sec)

mysql> show tables;
 ---------------- 
| Tables_in_mydb |
 ---------------- 
| tb_student     |
 ---------------- 
1 row in set (0.00 sec)

3、非空约束

3、非空约束

7 分组查询(经常查询主音讯(当前组最高值,人数,等等),不能够查询个人消息)

 

当要求分组查询时索要选拔GROUP BY子句,比如查询种种机构的工薪和,那注解要使用一些来分组。

 

7.1 分组查询(通常前面跟count(*))

l  查询每一种机构的机构编号和各类单位的报酬和:

SELECT deptno, SUM(sal)

FROM emp

GROUP BY deptno;

 

l  查询每个部门的部门编号以及各样机关的人数:

SELECT deptno,COUNT(*)

FROM emp

GROUP BY deptno;

 

l  查询每个部门的部门编号以及各种机关报酬超过1500的总人口:

SELECT deptno,COUNT(*)

FROM emp

WHERE sal>1500

GROUP BY deptno;

 

7.2 HAVING子句(分组后的牢笼)

l  查询薪给总额大于八千的单位编号以及薪水和:

SELECT deptno, SUM(sal)

FROM emp

GROUP BY deptno

HAVING SUM(sal) > 9000;

  

瞩目,WHERE是对分组前记录的准则,即使某行记录没有满意WHERE子句的标准,那么这行记录不会参预分组;而HAVING是对分组后数据的束缚。

 

7 分组查询(平日查询主音信(当前组最高值,人数,等等),不可能查询个人新闻)

 

当供给分组查询时索要运用GROUP BY子句,举个例子查询各类单位的工薪和,那注脚要动用一些来分组。

 

7.1 分组查询(平时后边跟count(*))

l  查询每一种机关的机构编号和各个机构的劳务费和:

SELECT deptno, SUM(sal)

FROM emp

GROUP BY deptno;

 

l  查询每一个机关的机关编号以及各类机构的人口:

SELECT deptno,COUNT(*)

FROM emp

GROUP BY deptno;

 

l  查询每一个机关的机关编号以及各种机关薪资高于1500的人头:

SELECT deptno,COUNT(*)

FROM emp

WHERE sal>1500

GROUP BY deptno;

 

7.2 HAVING子句(分组后的牢笼)

l  查询薪酬总额大于八千的机关编号以及报酬和:

SELECT deptno, SUM(sal)

FROM emp

GROUP BY deptno

HAVING SUM(sal) > 9000;

  

留意,WHERE是对分组前记录的法规,如若某行记录未有满意WHERE子句的法则,那么那行记录不会在座分组;而HAVING是对分组后数据的牢笼。

 

 DML(数据操作语言,它是对表记录的操作(增、删、改)!)

因为一些列无法安装为null值,所以能够对丰裕非空约束。

因为一些列不能够安装为null值,所以能够对丰盛非空约束。

8 LIMIT(限定查询结果的开始行,方言)

LIMIT用来界定查询结果的初叶行,以及总行数。

 

8.1 查询5行记录,开首行从0起先

SELECT * FROM emp LIMIT 0, 5;

 

专心,开首行从0开端,即首先行初步!

 

8.2 查询10行记录,最初行从3起来

SELECT * FROM emp LIMIT 3, 10;

 

8.3 分页查询

借使一页记录为10条,希望查看第3页记录应当怎么查呢?

l  第一页记录伊始行为0,一共查询10行;

l  第二页记录开始行为10,一共查询10行;

l  第三页记录早先行为20,一共查询10行;

 

8 LIMIT(限定查询结果的初始行,方言)

LIMIT用来限制查询结果的起头行,以及总行数。

 

8.1 查询5行记录,最初行从0起首

SELECT * FROM emp LIMIT 0, 5;

 

留心,起首行从0最初,即首先行开头!

 

8.2 查询10行记录,初阶行从3起始

SELECT * FROM emp LIMIT 3, 10;

 

8.3 分页查询

倘使一页记录为10条,希望查看第3页记录应当怎么查呢?

l  第一页记录伊始行为0,一共查询10行;

l  第二页记录先导行为10,一共查询10行;

l  第三页记录早先行为20,一共查询10行;

 

  1. 插入数据
    * INTERT INTO 表名(列名1,列名2, ...) VALUES(列值1, 列值2, ...);
      > 在表名后提交要插入的列名,别的未有一些名的列等同与插入null值。所以插入记录总是插入一行,不容许是半行。
      > 在VALUES后交付列值,值的顺序和个数必需与近期线指挥部定的列对应
    * INTERT INTO 表名 VALUES(列值1, 列值2)
      > 未有付诸要插入的列,那么表示插入全数列。
      > 值的个数必得是该表列的个数。
      > 值的逐个,必需与表创立时交由的列的一一一样。

  2. 修改数据
    * UPDATE 表名 SET 列名1=列值1, 列名2=列值2, ... [WHERE 条件]
    * 条件(条件可选的):
      > 条件必须是四个boolean类型的值或表明式:UPDATE t_person SET gender='男', age=age 1 WHERE sid='1';
      > 运算符:=、!=、<>、>、<、>=、<=、BETWEEN...AND、IN(...)、IS NULL、NOT、OR、AND

例如:

例如:

4、完整性约束

  完整性约束是为了表的数码的科学!假设数据不精确,那么一齐头就无法增添到表中。

 

4、完整性约束

  完整性约束是为了表的数码的科学!借使数量不得法,那么一同头就不可能加多到表中。

 

DCL

CREATE TABLE stu (
   sid INT PRIMARY KEY AUTO_INCREMENT,
   sname  VARCHAR(20) NOT NULL,
   age   INT,
   sex  VARCHAR(10)
);
CREATE TABLE stu (
   sid INT PRIMARY KEY AUTO_INCREMENT,
   sname  VARCHAR(20) NOT NULL,
   age   INT,
   sex  VARCHAR(10)
);
1 主键(primary key)

当某一列增加了主键约束后,那么这一列的数码就不可能重复出现。那样每行记录中其主键列的值正是这一行的独一标志。举例学生的学号能够用来做独一标记,而学生的姓名是不能够做独一标记的,因为上学有不小希望同名。

主键列的值不能为NULL,也不可能重新!

  钦命主键约束使用PRIMA兰德帕杰罗Y KEY关键字

 

l  创设表:定义列时钦定主键:

CREATE TABLE stu(

                  sid        CHAR(6) PRIMARY KEY,

                  sname      VARCHAR(20),

                  age            INT,

                  gender     VARCHAR(10)

);

l  成立表:定义列之后独立钦定主键:

 

CREATE TABLE stu(

                  sid        CHAR(6),

                  sname      VARCHAR(20),

                  age            INT,

                  gender     VARCHAR(10),

                   PRIMARY KEY(sid)

);

 

l  修改表时钦命主键:

ALTER TABLE stu

ADD PRIMARY KEY(sid);

 

l  删除主键(只是删除主键约束,而不会删除主键列):

ALTER TABLE stu DROP PRIMARY KEY;

 

1 主键(primary key)

当某一列加多了主键约束后,那么这一列的数码就不能够重复出现。那样每行记录中其主键列的值便是这一行的独一标记。举例学生的学号能够用来做独一标志,而学员的人名是不能够做独一标记的,因为上学有十分的大概率同名。

主键列的值不可能为NULL,也不能够重复!

  钦命主键约束使用P福睿斯IMA君越Y KEY关键字

 

l  成立表:定义列时钦定主键:

CREATE TABLE stu(

                  sid        CHAR(6) PRIMARY KEY,

                  sname      VARCHAR(20),

                  age            INT,

                  gender     VARCHAR(10)

);

l  创建表:定义列之后独立钦定主键:

 

CREATE TABLE stu(

                  sid        CHAR(6),

                  sname      VARCHAR(20),

                  age            INT,

                  gender     VARCHAR(10),

                   PRIMARY KEY(sid)

);

 

l  修改表时钦点主键:

ALTER TABLE stu

ADD PRIMARY KEY(sid);

 

l  删除主键(只是删除主键约束,而不会删除主键列):

ALTER TABLE stu DROP PRIMARY KEY;

 

* 叁个项目开创一个客户!二个项目相应的数据库独有三个!
* 这些客户只好对那几个数据库有权力,其余数据库你就操作不了了!

对sname列设置了非空约束。

对sname列设置了非空约束。

2 主键自拉长(非空,独一,可被援引:整型才足以自增进:AUTO_INCREMENT)

MySQL提供了主键自动增加的机能!那样顾客就绝不再为是还是不是有主键是或不是再一次而闹心了。当主键设置为全自动拉长后,在未有付诸主键值时,主键的值会自动生成,况兼是最大主键值 1,也就不会现出重复主键的也许了。

l  成立表时设置主键自增进(主键必需是整型本领够自增进):

CREATE TABLE stu(

                   sid INT PRIMARY KEY AUTO_INCREMENT,

                  sname      VARCHAR(20),

                  age            INT,

                  gender     VARCHAR(10)

);

 

l  修改表时设置主键自拉长:(关键字:change)

ALTER TABLE stu CHANGE sid sid INT AUTO_INCREMENT;

 

l  修改表时去除主键自拉长:

ALTER TABLE stu CHANGE sid sid INT;

 

2 主键自增进(非空,独一,可被援引:整型才足以自拉长:AUTO_INCREMENT)

MySQL提供了主键自动拉长的功力!这样顾客就毫无再为是还是不是有主键是不是再一次而闹心了。当主键设置为电动增加后,在一向不付诸主键值时,主键的值会自动生成,而且是最大主键值 1,也就不会并发重复主键的大概了。

l  创制表时设置主键自增进(主键必需是整型技能够自增加):

CREATE TABLE stu(

                   sid INT PRIMARY KEY AUTO_INCREMENT,

                  sname      VARCHAR(20),

                  age            INT,

                  gender     VARCHAR(10)

);

 

l  修改表时设置主键自拉长:(关键字:change)

ALTER TABLE stu CHANGE sid sid INT AUTO_INCREMENT;

 

l  修改表时去除主键自增进:

ALTER TABLE stu CHANGE sid sid INT;

 

  1. 创制顾客
      * CREATE USER 用户名@IP地址 IDENTIFIED BY '密码';
        > 顾客只好在钦命的IP地址上登陆
      * CREATE USER 用户名@'%' IDENTIFIED BY '密码';
        > 客户能够在大肆IP地址上登陆

  2. 给客商授权
      * GRANT 权限1, … , 权限n ON 数据库.* TO 用户名@IP地址
        > 权限、用户、数据库
        > 给顾客分派在内定的数据库上的钦点的权能
        > 例如;GRANT CREATE,ALTER,DROP,INSERT,UPDATE,DELETE,SELECT ON mydb1.* TO user1@localhost;
          * 给user1客户分派在mydb1数据库上的create、alter、drop、insert、update、delete、select权限
      * GRANT ALL ON 数据库.* TO 用户名@IP地址;
        > 给客商分派钦点数据库上的具备权限

  3. 注销授权
      * REVOKE 权限1, … , 权限n ON 数据库.* FROM 用户名@IP地址;
        > 裁撤内定客户在钦命数据库上的钦赐权限
        > 例如;REVOKE CREATE,ALTER,DROP ON mydb1.* FROM user1@localhost;
          * 打消user1客商在mydb1数据库上的create、alter、drop权限

  4. 翻开权限
      * SHOW GRANTS FOR 用户名@IP地址
        > 查看钦点顾客的权限

  5. 去除顾客
      * DROP USER 用户名@IP地址

4、独一约束

4、独一约束

3 非空(NOT NULL)

钦点非空约束的列不能未有值,约等于说在插入记录时,对增添了非空约束的列必得求给值;在改造记录时,无法把非空驶列车的值设置为NULL。

l  内定非空约束:

CREATE TABLE stu(

                   sid INT PRIMARY KEY AUTO_INCREMENT,

                   sname VARCHAR(10) NOT NULL,

                  age            INT,

                  gender     VARCHAR(10)

);

当为sname字段钦赐为非空后,在向stu表中插入记录时,必得给sname字段钦定值,不然会报错:

INSERT INTO stu(sid) VALUES(1); 【报错】

 

  插入的记录中sname未有一些名值,所以会报错!

 

3 非空(NOT NULL)

点名非空约束的列不能够未有值,也正是说在插入记录时,对增添了非空约束的列绝对要给值;在改换记录时,无法把非空驶列车的值设置为NULL。

l  钦命非空约束:

CREATE TABLE stu(

                   sid INT PRIMARY KEY AUTO_INCREMENT,

                   sname VARCHAR(10) NOT NULL,

                  age            INT,

                  gender     VARCHAR(10)

);

当为sname字段钦赐为非空后,在向stu表中插入记录时,必得给sname字段钦命值,不然会报错:

INSERT INTO stu(sid) VALUES(1); 【报错】

 

  插入的笔录中sname未有一些名值,所以会报错!

 

*****DQL -- 数据查询语言
  查询不会修改数据库表记录!

车库有些列不可能设置双重的值,所以能够对列加多独一约束。

车库有些列不能够设置双重的值,所以能够对列增加独一约束。

4 唯一(UNIQUE)

仍是可感觉字段钦命唯一约束!当为字段钦定独一约束后,那么字段的值必需是独一的。那一点与主键相似!比方给stu表的sname字段钦点独一约束:

CREATE TABLE tab_ab(

         sid INT PRIMARY KEY AUTO_INCREMENT,

         sname VARCHAR(10) UNIQUE

);

 

  INSERT INTO sname(sid, sname) VALUES(1001, 'zs');

INSERT INTO sname(sid, sname) VALUES(1002, 'zs');

  当一遍插入一样的名字时,MySQL会报错!

 

4 唯一(UNIQUE)

还能为字段内定独一约束!当为字段钦点独一约束后,那么字段的值必得是独一的。那或多或少与主键相似!比方给stu表的sname字段钦点独一约束:

CREATE TABLE tab_ab(

         sid INT PRIMARY KEY AUTO_INCREMENT,

         sname VARCHAR(10) UNIQUE

);

 

  INSERT INTO sname(sid, sname) VALUES(1001, 'zs');

INSERT INTO sname(sid, sname) VALUES(1002, 'zs');

  当五遍插入一样的名字时,MySQL会报错!

 

一、 基本查询

例如:

例如:

5 外键(外键正是用来约束这一列的值必得是另一张表的主键值)

主外键是组成表与表关联的无可比拟路线!

外键是另一张表的主键!举例职员和工人表与部门表之间就存在涉嫌关系,当中职员和工人表中的机关编号字段就是外键,是对峙部门表的外键。

大家再来看BBS系统中:顾客表(t_user)、分类表(t_section)、帖子表(t_topic)三者之间的涉嫌。Topic id    user id  section id

 

 

 

例如在t_section表中sid为1的记录表明有一个分类叫java,版主是t_user表中uid为1的用户,即zs!

例如在t_topic表中tid为2的记录是名称叫“Java是咖啡”的帖子,它是java版块的帖子,它的小编是ww。

外键正是用来约束这一列的值必须是另一张表的主键值!!!

 

l  创建t_user表,钦命uid为主键列:

CREATE TABLE t_user(

         uid   INT PRIMARY KEY AUTO_INCREMENT,

         uname     VARCHAR(20) UNIQUE NOT NULL

);

 

l  创建t_section表,钦定sid为主键列,u_id为相对t_user表的uid列的外键:

CREATE TABLE t_section(

                   sid    INT PRIMARY KEY AUTO_INCREMENT,

                   sname      VARCHAR(30),

                   u_id INT,

                   CONSTRAINT fk_t_user FOREIGN KEY(u_id) REFERENCES t_user(uid)

);

l  修改t_section表,指定u_id为相对t_user表的uid列的外键:

ALTER TABLE t_section

ADD CONSTRAINT fk_t_user (自定义外键小名)

FOREIGN KEY(u_id)

REFERENCES t_user(uid);

l  修改t_section表,删除u_id的外键约束:

ALTER TABLE t_section

DROP FOREIGN KEY fk_t_user;

 

5 外键(外键正是用来约束这一列的值必需是另一张表的主键值)

主外键是整合表与表关联的独一路子!

外键是另一张表的主键!举例职员和工人表与机关表之间就存在涉嫌关系,个中职员和工人表中的机构编号字段正是外键,是相对部门表的外键。

大家再来看BBS系统中:客商表(t_user)、分类表(t_section)、帖子表(t_topic)三者之间的涉及。Topic id    user id  section id

 

 

 

例如在t_section表中sid为1的笔录作证有二个分拣叫java,版主是t_user表中uid为1的用户,即zs!

例如在t_topic表中tid为2的记录是名称叫“Java是咖啡”的帖子,它是java版块的帖子,它的笔者是ww。

外键就是用来约束这一列的值必需是另一张表的主键值!!!

 

l  创建t_user表,钦点uid为主键列:

CREATE TABLE t_user(

         uid   INT PRIMARY KEY AUTO_INCREMENT,

         uname     VARCHAR(20) UNIQUE NOT NULL

);

 

l  创建t_section表,钦赐sid为主键列,u_id为相对t_user表的uid列的外键:

CREATE TABLE t_section(

                   sid    INT PRIMARY KEY AUTO_INCREMENT,

                   sname      VARCHAR(30),

                   u_id INT,

                   CONSTRAINT fk_t_user FOREIGN KEY(u_id) REFERENCES t_user(uid)

);

l  修改t_section表,指定u_id为相对t_user表的uid列的外键:

ALTER TABLE t_section

ADD CONSTRAINT fk_t_user (自定义外键别称)

FOREIGN KEY(u_id)

REFERENCES t_user(uid);

l  修改t_section表,删除u_id的外键约束:

ALTER TABLE t_section

DROP FOREIGN KEY fk_t_user;

 

  1. 字段(列)控制
    1) 查询全体列
     SELECT * FROM 表名;
     SELECT * FROM emp;
     --> 其中“*”表示查询全数列
CREATE TABLE stu (
   sid INT PRIMARY KEY AUTO_INCREMENT,
   sname  VARCHAR(20) NOT NULL UNIQUE,
   age   INT,
   sex  VARCHAR(10)
);
CREATE TABLE stu (
   sid INT PRIMARY KEY AUTO_INCREMENT,
   sname  VARCHAR(20) NOT NULL UNIQUE,
   age   INT,
   sex  VARCHAR(10)
);
6 表与表之间的涉嫌(看录制)

l  一对一:例如t_person表和t_card表,即人和居民身份证。这种情形供给搜索主从关系,即何人是主表,什么人是从表。人得以未有居民身份证,但身份ID必要求有人才行,所以人是主表,而居民身份证是从表。设计从表能够有二种方案:

  • 在t_card表中加多外键列(相对t_person表),而且给外键增添独一约束;
  • 给t_card表的主键增添外键约束(相对t_personr表),即t_card表的主键也是外键。

 

l  一对多(多对一):最为常见的正是一对多!一对多和多对一,那是从哪个角度去看得出来的。t_user和t_section的关系,从t_user来看正是一对多,而从t_section的角度来看正是多对一!这种情状都以在多方成立外键!

 

l  多对多(中间表):例如t_stu和t_teacher表,即叁个学生能够有四个助教,而多少个民间兴办教师也得以有多少个学生。这种情形普通须要创建中间表来管理多对多关系。比如再次创下制一张表t_stu_tea表,给出七个外键,三个相对t_stu表的外键,另三个相对t_teacher表的外键。

 

6 表与表之间的涉嫌(看录像)

l  一对一:例如t_person表和t_card表,即人和居民身份证。这种景观须要搜索主从关系,即何人是主表,哪个人是从表。人得以未有居民身份证,但身份证应当要有人才行,所以人是主表,而身份ID是从表。设计从表能够有二种方案:

  • 在t_card表中增加外键列(相对t_person表),而且给外键增加独一约束;
  • 给t_card表的主键加多外键约束(相对t_personr表),即t_card表的主键也是外键。

 

l  一对多(多对一):最为常见的便是一对多!一对多和多对一,这是从哪个角度去看得出来的。t_user和t_section的关系,从t_user来看正是一对多,而从t_section的角度来看就是多对一!这种情状都以在大举创制外键!

 

l  多对多(中间表):例如t_stu和t_teacher表,即叁个上学的小孩子能够有多少个教授,而二个教师的资质也能够有五个学生。这种景观无独有偶必要创设中间表来管理多对多涉及。举例再次创下设一张表t_stu_tea表,给出多个外键,三个相对t_stu表的外键,另三个相对t_teacher表的外键。

 

2) 查询钦命列
 SELECT 列1 [, 列2, ... 列N] FROM 表名;
 SELECT empno, ename, sal, comm FROM 表名;

二、概念模型

二、概念模型

5、编码

 

5、编码

 

3) 完全重复的记录只叁次
 当查问结果中的多行记录千篇一律时,只彰显一行。平日查询全数列时少之甚少会有这种景观,但只询问一列(或几列)时,那总也许就大了!
 SELECT DISTINCT * | 列1 [, 列2, ... 列N] FROM 表名;
 SELECT DISTINCT sal FROM emp;
 --> 保查询职员和工人表的工资,假使存在同样的薪资只彰显贰次!

1、对象模型:在Java中是domain ,举例:User、Student .

1、对象模型:在Java中是domain ,例如:User、Student .

1 查看MySQL编码(SHOW VARIABLES LIKE 'char%')

  SHOW VARIABLES LIKE 'char%';

 

 

因为那儿设置时钦命了字符集为UTF8,所以具有的编码都是UTF8。

l  character_set_client:你发送的多寡必须与client钦定的编码一致!!!服务器会利用该编码来解读顾客端发送过来的数量;

l  character_set_connection:通过该编码与client一致!该编码不会变成乱码!当施行的是查询语句时,客商端发送过来的数量会先转换到connection内定的编码。但假使客商端发送过来的数目与client钦赐的编码一致,那么调换就不会并发难题;

l  character_set_database:数据库私下认可编码,在开创数据库时,若无一点点名编码,那么私下认可使用database编码;

l  character_set_server:MySQL服务器暗许编码;

l  character_set_results:响应的编码,即查询结果回到给顾客端的编码。那注脚客商端必得选用result内定的编码来解码;

 

1 查看MySQL编码(SHOW VARIABLES LIKE 'char%')

  SHOW VARIABLES LIKE 'char%';

 

 

因为那儿设置时钦点了字符集为UTF8,所以具备的编码都以UTF8。

l  character_set_client:你发送的数码必得与client钦点的编码一致!!!服务器会动用该编码来解读客商端发送过来的多少;

l  character_set_connection:通过该编码与client一致!该编码不会导致乱码!当实施的是查询语句时,客商端发送过来的多少会先转换来connection钦命的编码。但一旦顾客端发送过来的数据与client钦定的编码一致,那么转换就不会出现难点;

l  character_set_database:数据库暗中认可编码,在创建数据库时,若无一些名编码,那么暗中同意使用database编码;

l  character_set_server:MySQL服务器暗中认可编码;

l  character_set_results:响应的编码,即查询结果回到给客户端的编码。那申明顾客端必需利用result钦定的编码来解码;

 

4) 列运算
 I 数量类型的列能够做加、减、乘、除运算
   SELECT sal*1.5 FROM emp;
   SELECT sal comm FROM emp;

2、关系模型:在数据库中表,1对多,1对1,多对多。

2、关系模型:在数据库中表,1对多,1对1,多对多。

2 调控台编码

修改character_set_client、character_set_results、character_set_connection为GBK,就不会出现乱码了。但实质上只供给修改character_set_client和character_set_results。

 

调整台的编码只可以是GBK,而无法改改为UTF8,那就涌出三个标题。客商端发送的数量是GBK,而character_set_client为UTF8,那就印证顾客端数据到了劳动器端后一定会产出乱码。既然无法修改调整台的编码,那么只好修改character_set_client为GBK了。

服务器发送给顾客端的数据编码为character_set_result,它假设是UTF8,那么调控台使用GBK解码也确定会见世乱码。因为不能够修改决定台编码,所以只可以把character_set_result修改为GBK。

l  修改character_set_澳门新萄京官方网站:多表查询。client变量:set character_set_client=gbk;

l  修改character_set_results变量:set character_set_results=gbk;

 

安装编码只对现阶段连日有效,这表达每一次登入MySQL提示符后都要去修改那四个编码,但足以由此退换配置文件来拍卖这一难点:配置文件路线:D:Program FilesMySQLMySQL Server 5.1 my.ini

 

 

2 调节台编码

修改character_set_client、character_set_results、character_set_connection为GBK,就不会油不过生乱码了。但骨子里只须求修改character_set_client和character_set_results。

 

调节台的编码只可以是GBK,而无法改改为UTF8,那就涌出多少个标题。客户端发送的多寡是GBK,而character_set_client为UTF8,那就证实客商端数据到了劳动器端后自然会并发乱码。既然不能够改改调节台的编码,那么只可以修改character_set_client为GBK了。

服务器发送给顾客端的数据编码为character_set_result,它一旦是UTF8,那么调整台使用GBK解码也确定会产出乱码。因为不只怕修改决定台编码,所以只可以把character_set_result修改为GBK。

l  修改character_set_client变量:set character_set_client=gbk;

l  修改character_set_results变量:set character_set_results=gbk;

 

安装编码只对当前连年有效,那表明每一次登陆MySQL提醒符后都要去修改那多个编码,但能够通过改换配置文件来处理这一主题素材:配置文件路线:D:Program FilesMySQLMySQL Server 5.1 my.ini

 

 

澳门新萄京官方网站:多表查询。 II 字符串类型能够做三番五次运算
   SELECT CONCAT('$', sal) FROM emp;

三、外键约束

三、外键约束

3 MySQL工具

运用MySQL工具是不会冒出乱码的,因为它们会每便延续时都修改character_set_client、character_set_results、character_set_connection的编码。那样对my.ini上的配置覆盖了,也就不会出现乱码了。

 

3 MySQL工具

运用MySQL工具是不会产出乱码的,因为它们会每一次一连时都修改character_set_client、character_set_results、character_set_connection的编码。那样对my.ini上的布署覆盖了,也就不会冒出乱码了。

 

 III 转换NULL值
   不时须求把NULL转变来另外值,譬喻com 一千时,纵然com列存在NULL值,那么NULL 1000要么NULL,而作者辈那时候希望把NULL当前0来运算。
   SELECT IFNULL(comm, 0) 1000 FROM emp;
   --> IFNULL(comm, 0):假使comm中留存NULL值,那么当成0来运算。

  • 外键必得是另一表的主键的值(外键要引用主键。)
  • 外键能够重复
  • 外键可以为空
  • 外键必得是另一表的主键的值(外键要引用主键。)
  • 外键能够重新
  • 外键可认为空

6、MySQL数据库备份与回复

 

6、MySQL数据库备份与回复

 

 IV 给列起小名
   你恐怕已经注意到了,当使用列运算后,查询出的结果集中的列名称很倒霉看,这时我们需求给列名起分外号,那样在结果聚焦列名就展现别称了
   SELECT IFNULL(comm, 0) 1000 AS 奖金 FROM emp;
   --> 个中AS能够轻松

1、成立时加多外键约束

1、创制时加多外键约束

1、备份和出山小草数据

 

1 生成SQL脚本(不加分号;)

在调整台使用mysqldump命令能够用来变化钦定数据库的脚本文本,但要注意,脚本文本中只含有数据库的内容,而不会存在创造数据库的话语!所以在还原数据时,还必要自已手动创立二个数据库之后再去恢复生机数据。

  mysqldump –u用户名 –p密码 数据库名>生成的脚本文件路径

 

 

 

现行能够在C盘下找到mydb1.sql文本了!

静心,mysqldump命令是在Windows调控台下推行,无需登陆mysql!!!

 

2 执行SQL脚本

进行SQL脚本需求登陆mysql,然后步向内定数据库,技巧够实行SQL脚本!!!

试行SQL脚本不只是用来回复数据库,也足以在平日编制SQL脚本,然后使用举办SQL 脚本来操作数据库!大家都理解,在黑屏下编写制定SQL语句时,固然开掘了不当,大概也无法修改了。所以自身建议我们利用脚本文件来编排SQL代码,然后奉行之!

SOURCE C:mydb1.sql

 

 

 

  注意,在实行脚本时索要事先核实当前数据库中的表是或不是与剧本文件中的语句有争执!比方在本子文件中存在create table a的话语,而前段时间数据库中早已存在了a表,那么就能够出错!

 

仍是能够通过下边包车型客车措施来推行脚本文件:

mysql -uroot -p123 mydb1<c:mydb1.sql

mysql –u用户名 –p密码 数据库<要执行脚本文件路径

 

 

这种方式没有须要登入mysql!

 

 

1、备份和回复数据

 

1 生成SQL脚本(不加分号;)

在调控台使用mysqldump命令可以用来变化钦命数据库的台本文本,但要注意,脚本文本中只蕴含数据库的剧情,而不会存在创造数据库的讲话!所以在平复数据时,还须要自已手动创造一个数据库之后再去复苏数据。

  mysqldump –u用户名 –p密码 数据库名>生成的脚本文件路径

 

 

 

现行反革命能够在C盘下找到mydb1.sql文本了!

小心,mysqldump命令是在Windows调控台下实践,无需登陆mysql!!!

 

2 执行SQL脚本

执行SQL脚本须求报到mysql,然后踏入钦命数据库,才得以实施SQL脚本!!!

实践SQL脚本不只是用来复苏数据库,也得以在平日编写制定SQL脚本,然后选用举办SQL 脚本来操作数据库!我们都知道,在黑屏下编写制定SQL语句时,就算发掘了不当,也许也不能够修改了。所以自个儿提出我们利用脚本文件来编排SQL代码,然后推行之!

SOURCE C:mydb1.sql

 

 

 

  注意,在实行脚本时索要事先核准当前数据库中的表是还是不是与剧本文件中的语句有争论!举例在本子文件中留存create table a的讲话,而当前数据库中曾经存在了a表,那么就可以出错!

 

仍是能够透过上边的章程来实行脚本文件:

mysql -uroot -p123 mydb1<c:mydb1.sql

mysql –u用户名 –p密码 数据库<要执行脚本文件路径

 

 

这种艺术没有必要登陆mysql!

 

 

  1. 规格决定
    1) 条件查询
      与后面介绍的UPDATE和DELETE语句相同,SELECT语句也得以行使WHERE子句来调节记录。
      * SELECT empno,ename,sal,comm FROM emp WHERE sal > 10000 AND comm IS NOT NULL;
      * SELECT empno,ename,sal FROM emp WHERE sal BETWEEN 20000 AND 30000;
      * SELECT empno,ename,job FROM emp WHERE job IN ('经理', '董事长');
    2) 模糊查询
      当您想询问姓张,並且姓名一共四个字的职工作时间,那时就能够行使模糊查询
      * SELECT * FROM emp WHERE ename LIKE '张_';
      --> 模糊查询必要使用运算符:LIKE,在那之中_相称叁个自由字符,注意,只异常一个字符并非多个。
      --> 上面语句询问的是姓张,名字由多少个字组合的职工。
      * SELECT * FROM emp WHERE ename LIKE '___'; /*姓名由3个字组合的职员和工人*/
CREATE TABLE dept (
    deptno INT PRIMARY KEY AUTO_INCREMENT,
    dname VARCHAR(50)
);
insert into dept values(10,'研发部');
insert into dept values(20,'人力部');
insert into dept values(30,'财务部');

CREATE TABLE emp (
    empno INT PRIMARY KEY AUTO_INCREMENT,
    ename VARCHAR(50),
    deptno INT,
    CONSTRAINT fk_emp_dept FOREIGN KEY(dno) REFERENCES dept(deptno) 
);

CREATE TABLE dept (
    deptno INT PRIMARY KEY AUTO_INCREMENT,
    dname VARCHAR(50)
);
INSERT INTO dept VALUES(10,'研发部');
INSERT INTO dept VALUES(20,'人力部');
INSERT INTO dept VALUES(30,'财务部');

INSERT INTO emp(empno,ename) VALUES(null,'zhangsan');
INSERT INTO emp(empno,ename,deptno) VALUES(null,'lisi',10);


INSERT INTO emp(empno,ename,deptno) VALUES(null,'zhangsan',80);
/* Error Code: 1452. Cannot add or update a child row: a foreign key constraint fails 
(`mydb2`.`emp`, CONSTRAINT `fk_emp_dept` FOREIGN KEY (`deptno`) REFERENCES `dept` (`deptno`))
*/
CREATE TABLE dept (
    deptno INT PRIMARY KEY AUTO_INCREMENT,
    dname VARCHAR(50)
);
insert into dept values(10,'研发部');
insert into dept values(20,'人力部');
insert into dept values(30,'财务部');

CREATE TABLE emp (
    empno INT PRIMARY KEY AUTO_INCREMENT,
    ename VARCHAR(50),
    deptno INT,
    CONSTRAINT fk_emp_dept FOREIGN KEY(dno) REFERENCES dept(deptno) 
);

CREATE TABLE dept (
    deptno INT PRIMARY KEY AUTO_INCREMENT,
    dname VARCHAR(50)
);
INSERT INTO dept VALUES(10,'研发部');
INSERT INTO dept VALUES(20,'人力部');
INSERT INTO dept VALUES(30,'财务部');

INSERT INTO emp(empno,ename) VALUES(null,'zhangsan');
INSERT INTO emp(empno,ename,deptno) VALUES(null,'lisi',10);


INSERT INTO emp(empno,ename,deptno) VALUES(null,'zhangsan',80);
/* Error Code: 1452. Cannot add or update a child row: a foreign key constraint fails 
(`mydb2`.`emp`, CONSTRAINT `fk_emp_dept` FOREIGN KEY (`deptno`) REFERENCES `dept` (`deptno`))
*/

7、多表查询(首要)

多表查询有如下三种:

l  合併结果集;

l  连接查询

  • 内连接
  • 外连接

²  左外连接

²  右外接连

²  全外连接(MySQL不协助)

  • 理所必然连接

l  子查询

 

7、多表查询(主要)

多表查询有如下两种:

l  合併结果集;

l  连接查询

  • 内连接
  • 外连接

²  左外连接

²  右外接连

²  全外连接(MySQL不援助)

  • 本来连接

l  子查询

 

  假诺大家想询问姓张,名字多少个字能够的职工作时间将在动用“%”了。
  SELECT * FROM emp WHERE ename LIKE '张%';
  --> 其中%匹配0~N个随机字符,所以地点语句询问的是姓张的持有职员和工人。
  SELECT * FROM emp WHERE ename LIKE '%阿%';
  --> 千万毫不以为下面语句是在询问姓名中间含有阿字的职员和工人,因为%相配0~N个字符,所以姓名以阿开首和最后的职员和工人也都会询问到。
  SELECT * FROM emp WHERE ename LIKE '%';
  --> 那么些规格等同与不设有,但假如姓名称为NULL的查询不出来!

2、修改表时加多外键约束:

2、修改表时增添外键约束:

1 合併结果集(UNION , UNION ALL列数、列类型必需一致。)
  1. 成效:合併结果集正是把四个select语句的询问结果合併到共同!
  2. 联合结果集有三种方法:

l  UNION:去除重复记录,比如:SELECT * FROM t1 UNION SELECT * FROM t2;

l  UNION ALL:不去除重复记录,举个例子:SELECT * FROM t1 UNION ALL SELECT * FROM t2。

(两个4d)

 

 

  1. 务求:被联合的四个结实:列数、列类型必需一致。
1 合併结果集(UNION , UNION ALL列数、列类型必须一致。)
  1. 功用:合并结果集正是把三个select语句的询问结果合併到一道!
  2. 联合结果集有二种方法:

l  UNION:去除重复记录,比方:SELECT * FROM t1 UNION SELECT * FROM t2;

l  UNION ALL:不去除重复记录,举个例子:SELECT * FROM t1 UNION ALL SELECT * FROM t2。

(两个4d)

 

 

  1. 必要:被合併的七个结果:列数、列类型必须一律。

二、排序
1) 升序
  SELECT * FROM WHERE emp ORDER BY sal ASC;
  --> 按sal排序,升序!
  --> 在这之中ASC是足以归纳的
2) 降序
  SELECT * FROM WHERE emp ORDER BY comm DESC;
  --> 按comm排序,降序!
  --> 在那之中DESC不可能轻巧
3) 使用多列作为排序条件
  SELECT * FROM WHERE emp ORDER BY sal ASC, comm DESC;
  --> 使用sal升序排,假如sal同样有时间,使用comm的降序排

ALTER TABLE emp ADD CONSTRAINT fk_emp_dept FOREIGN KEY(dno) REFERNCES dept(deptno);

1 alter table t_student1 add constraint 外键名 foreign key(作为外键的列名) references t_class1(主键列名);
2 ALTER TABLE emp ADD CONSTRAINT fk_emp_dept FOREIGN KEY(dno) REFERNCES dept(deptno);
2 连接查询

接二连三查询正是求出四个表的乘积,比方t1连接t2,那么查询出的结果正是t1*t2。(4*3条记录)

 

 

总是查询会发出笛Carl积,假如集结A={a,b},集合B={0,1,2},则四个聚众的笛Carl积为{(a,0),(a,1),(a,2),(b,0),(b,1),(b,2)}。能够扩展到四个汇集的场所。

那便是说多表查询发生这么的结果并不是我们想要的,那么怎么去除重复的,不想要的笔录呢,当然是通过标准过滤。平常要查询的八个表之间都设有涉嫌关系,那么就透过涉及关系去除笛卡尔积。

你能想像到emp和dept表连接查询的结果么?emp一共14行记录,dept表一共4行记录,那么连接后查询出的结果是56行记录。

也就你只是想在查询emp表的还要,把各类职员和工人的所在单位新闻展现出来,那么就供给利用主外键来去除无用音讯了。

 

 

  行使主外键关系做为条件来去除无用音讯

SELECT * FROM emp,dept WHERE emp.deptno=dept.deptno[q8] ;

 

 

 

地点查询结果会把两张表的全体列都查询出来,可能你无需那么多列,那时就可以钦点要查询的列了。张三没了

SELECT emp.ename,emp.sal,emp.comm,dept.dname

FROM emp,dept

WHERE emp.deptno=dept.deptno;

 

 

 

还足感觉表内定别名,然后在援引列时选择别称就能够。

SELECT e.ename,e.sal,e.comm,d.dname

FROM emp AS e,dept AS d

WHERE e.deptno=d.deptno;[q9] 

 

2.1 内连接(…inner join… on ..=..)

地点的连年语句就是内接连,但它不是SQL标准中的查询艺术,可以了然为方言!SQL规范的内连续为:

SELECT *

FROM emp e

INNER[q10]  JOIN dept d

ON[q11]  e.deptno=d.deptno;

 

内延续的风味:查询结果必须满足条件。举个例子大家向emp表中插入一条记下:

 

  当中deptno为50,而在dept表中只有10、20、30、40机关,那么地点的询问结果中就不会油可是生“张三”那条记下,因为它不可能满意e.deptno=d.deptno那么些条件。

 

2.2 外连接(左连接、右连接)

外接连的特色:查询出的结果存在不满意条件的大概。

左连接:

SELECT * FROM emp e

LEFT OUTER[q12]  JOIN dept d

ON e.deptno=d.deptno;

 

左连接是先查询出左表(即以左表为主),然后查询右表,右表中满意条件的呈现出来,不知足条件的显得NULL。

这么说您只怕不太知道,大家照旧用地点的例证来证实。当中emp表中“张三”那条记下中,部门编号为50,而dept表中不真实机构编号为50的笔录,所以“张三”那条记下,不可能满意e.deptno=d.deptno那规范。但在左连接中,因为emp表是左表,所以左表中的记录都会询问出来,即“张三”那条记下也会查出,但对应的右表部分显得NULL。

 

 

2.3 右连接  …right outer join ..on…=…

右连接就是先把右表中装有记录都询问出来,然后左表满足条件的体现,不满意展现NULL。比如在dept表中的40机关并不设有职员和工人,但在右连接中,若是dept表为右表,那么还是会意识到40单位,但对应的职员和工人新闻为NULL。

SELECT * FROM emp e

RIGHT OUTER JOIN dept d

ON e.deptno=d.deptno;

 

 

 

 

连年查询心得

三番五次不限与两张表,连接查询也足以是三张、四张,以致N张表的连天查询。日常连接查询不或然供给任何笛Carl积,而只是内需中间一些,那么此时就要求运用条件来去除没有须求的记录。那么些准绳大许多情状下都是应用主外键关系去除。

两张表的接连查询一定有贰个主外键关系,三张表的连接查询就必定有七个主外键关系,所以在大家不是很熟识连接查询时,首先要学会去除无用笛Carl积,那么固然用主外键关系作为规范来拍卖。假如两张表的询问,那么最少有一个主外键条件,三张表连接起码有四个主外键条件。

 

2 连接查询

连年查询就是求出多少个表的乘积,比如t1连接t2,那么查询出的结果便是t1*t2。(4*3条记录)

 

 

连续查询会生出笛Carl积,假如集结A={a,b},集结B={0,1,2},则八个聚众的笛Carl积为{(a,0),(a,1),(a,2),(b,0),(b,1),(b,2)}。能够扩充到八个汇聚的事态。

那就是说多表查询发生如此的结果并不是我们想要的,那么怎么去除重复的,不想要的笔录呢,当然是因此规范过滤。经常要查询的多少个表之间都存在涉嫌关系,那么就经过关系关系去除笛Carl积。

您能想像到emp和dept表连接查询的结果么?emp一共14行记录,dept表一共4行记录,那么连接后查询出的结果是56行记录。

也就你只是想在查询emp表的同期,把每一个职员和工人的所在机构音信显示出来,那么就须求选择主外键来去除无用音讯了。

 

 

  行使主外键关系做为条件来去除无用新闻

SELECT * FROM emp,dept WHERE emp.deptno=dept.deptno[q8] ;

 

 

 

地点查询结果会把两张表的具有列都查询出来,可能你无需那么多列,那时就足以钦定要查询的列了。张三没了

SELECT emp.ename,emp.sal,emp.comm,dept.dname

FROM emp,dept

WHERE emp.deptno=dept.deptno;

 

 

 

还足感觉表钦赐别名,然后在引用列时选择别称就可以。

SELECT e.ename,e.sal,e.comm,d.dname

FROM emp AS e,dept AS d

WHERE e.deptno=d.deptno;[q9] 

 

2.1 内连接(…inner join… on ..=..)

地方的连接语句正是内接连,但它不是SQL规范中的查询艺术,能够知道为方言!SQL标准的内一而再为:

SELECT *

FROM emp e

INNER[q10]  JOIN dept d

ON[q11]  e.deptno=d.deptno;

 

内一而再的性状:查询结果必得知足条件。举例大家向emp表中插入一条记下:

 

  个中deptno为50,而在dept表中唯有10、20、30、40部门,那么地点的查询结果中就不会出现“张三”那条记下,因为它无法满意e.deptno=d.deptno这些条件。

 

2.2 外连接(左连接、右连接)

外接连的表征:查询出的结果存在不满意条件的大概。

左连接:

SELECT * FROM emp e

LEFT OUTER[q12]  JOIN dept d

ON e.deptno=d.deptno;

 

左连接是先查询出左表(即以左表为主),然后查询右表,右表中满意条件的显示出来,不满意条件的展现NULL。

与上述同类说你大概不太通晓,我们照旧用地点的例证来评释。个中emp表中“张三”那条记下中,部门编号为50,而dept表中不设有机构编号为50的记录,所以“张三”那条记下,不能够知足e.deptno=d.deptno那标准。但在左连接中,因为emp表是左表,所以左表中的记录都会询问出来,即“张三”那条记下也会意识到,但相应的右表部分显得NULL。

 

 

2.3 右连接  …right outer join ..on…=…

右连接就是先把右表中负有记录都询问出来,然后左表满意条件的来得,不满意展现NULL。举个例子在dept表中的40部门并子虚乌有职员和工人,但在右连接中,假设dept表为右表,那么照旧会查出40机构,但相应的职工音信为NULL。

SELECT * FROM emp e

RIGHT OUTER JOIN dept d

ON e.deptno=d.deptno;

 

 

 

 

接连查询心得

连日不限与两张表,连接查询也足以是三张、四张,乃至N张表的连年查询。平日连接查询不容许须要方方面面笛Carl积,而只是急需中间一些,那么此时就必要使用标准来去除不必要的记录。那一个准则大非常多情况下都以利用主外键关系去除。

两张表的连续查询一定有三个主外键关系,三张表的连天查询就势必有四个主外键关系,所以在我们不是很熟谙连接查询时,首先要学会去除无用笛Carl积,那么就算用主外键关系当做标准来管理。如若两张表的询问,那么起码有一个主外键条件,三张表连接起码有五个主外键条件。

 

三、聚合函数
  聚合函数用来做某列的纵向运算。
1) COUNT
  SELECT COUNT(*) FROM emp;
  --> 计算emp表中具有列都不为NULL的记录的行数
  SELECT COUNT(comm) FROM emp;
  --> 云总结emp表中comm列不为NULL的笔录的行数
2) MAX
  SELECT MAX(sal) FROM emp;
  --> 查询最高级程序猿资
3) MIN
  SELECT MIN(sal) FROM emp;
  --> 查询最低薪给
4) SUM
  SELECT SUM(sal) FROM emp;
  --> 查询报酬合
5) AVG
  SELECT AVG(sal) FROM emp;
  --> 查询平均薪资

四、数据库关系模型

3、删除了这一个之外键约束语法

3 自然连接(natural join ,natural left join ,natural right join)

世家也都清楚,连接查询会发出无用笛卡尔积,大家常见采用主外键关系等式来去除它。而当然连接无需你去给出主外键等式,它会活动找到这一等式:

l  两张连接的表中名称和档案的次序造成一样的列作为条件,例如emp和dept表都留存deptno列,何况类型一致,所以会被自然连接找到!

自然自然连接还应该有别的的查找条件的点子,但其余办法都只怕存在难题!

SELECT * FROM emp NATURAL JOIN dept;[q13] 

SELECT * FROM emp NATURAL LEFT JOIN dept;[q14] 

SELECT * FROM emp NATURAL RIGHT JOIN dept;[q15] 

 

3 自然连接(natural join ,natural left join ,natural right join)

我们也都精晓,连接查询会生出无用笛Carl积,大家普通使用主外键关系等式来去除它。而自然连接无需你去给出主外键等式,它会自行找到这一等式:

l  两张连接的表中名称和等级次序产生一样的列作为条件,比方emp和dept表都留存deptno列,並且类型一致,所以会被自然连接找到!

本来自然连接还有任何的搜索条件的点子,但其他措施都大概存在难点!

SELECT * FROM emp NATURAL JOIN dept;[q13] 

SELECT * FROM emp NATURAL LEFT JOIN dept;[q14] 

SELECT * FROM emp NATURAL RIGHT JOIN dept;[q15] 

 

四、分组查询
  分组查询是把记录使用某一列进行分组,然后查询组消息。
  举例:查看全数单位的记录数。
  SELECT deptno, COUNT(*) FROM emp GROUP BY deptno;
  --> 使用deptno分组,查询部门编号和各类机关的记录数
  SELECT job, MAX(SAL) FROM emp GROUP BY job;
  --> 使用job分组,查询种种专门的工作的最高级技术员资

1、一对一涉嫌

-- MySql 语法
alter table t_student1 drop foreign key 外键名;
4 子查询

子查询就是嵌套查询,即SELECT中含有SELECT,假如一条语句中存在四个,或四个以上SELECT,那么正是子查询语句了。

l  子查询出现的职责:

  • where后,作为基准的一有的;
  • from后,作为被询问的一条表;

l  当子查询出以后where后作为标准时,仍是可以够使用如下主要字:

  • any
  • all

l  子查询结果集的花样:(上面包车型地铁例证分别对应那4种状态)

  • 单行单列(用于规范)
  • 单行多列(用于标准)
  • 多行单列(用于规范)
  • 多行多列(用于表)

条件

 * (***)单行单列:SELECT * FROM 表1 别名1 WHERE 列1 [=、>、<、>=、<=、!=] (SELECT 列 FROM 表2 别名2 WHERE 条件)

* (**)多行单列:SELECT * FROM 表1 别名1 WHERE 列1 [IN, ALL, ANY] (SELECT 列 FROM 表2 别名2 WHERE 条件)

* (*)单行多列:SELECT * FROM 表1 别名1 WHERE (列1,列2) IN (SELECT 列1, 列2 FROM 表2 别名2 WHERE 条件)

* (***)多行多列:SELECT * FROM 表1 别名1 , (SELECT ....) 别名2 WHERE 条件

练习:

  1. 薪俸高于甘宁的职工。

分析:

查询条件:薪俸>甘宁薪金,其中甘宁薪给供给一条子查询。

 

率先步:查询甘宁的工薪

SELECT sal FROM emp WHERE ename='甘宁'

 

第二步:查询高于甘宁薪给的职工

SELECT * FROM emp WHERE sal > (${第一步})

 

结果:

SELECT * FROM emp WHERE sal > (SELECT sal FROM emp WHERE ename='甘宁')

总结:

l  子查询作为条件

l  子查询方式为单行单列

 

  1. 工资高于30部门全体人的职工消息(ALL)

分析:

询问条件:工资高于30机关全体人工资,个中30机关全体人薪水是子查询。高于全数须求利用all关键字。

 

首先步:查询30机构有着人薪俸

SELECT sal FROM emp WHERE deptno=30;

 

其次步:查询高于30机关全数人薪俸的职工音讯

SELECT * FROM emp WHERE sal > ALL (${第一步})

 

结果:

SELECT * FROM emp WHERE sal > ALL [q16] (SELECT sal FROM emp WHERE deptno=30)

 

总结:

l  子查询作为标准

l  子查询形式为多行单列(当子查询结果集情势为多行单列时能够采取ALL或ANY关键字)

 

  1. 询问专门的工作和薪金与殷天正千篇一律的职工音讯

分析:

询问条件:职业和报酬与殷天正完全同样,那是子查询

 

首先步:查询出殷天正的做事和薪给

SELECT job,sal FROM emp WHERE ename='殷天正'

 

其次步:查询出与殷天正职业和薪给同样的人 in(….)相配

SELECT * FROM emp WHERE (job,sal) IN (${第一步})

 

结果:

SELECT * FROM emp WHERE (job,sal) IN (SELECT job,sal FROM emp WHERE ename='殷天正')

总结:

l  子查询作为条件

l  子查询格局为单行多列

 

  1. 查询职员和工人编号为1006的职工名称、职员和工人工资、部门名称、部门地址(表中取结果)

分析:

查询列:职员和工人名称、职员和工人工资、部门名称、部门地址

查询表:emp和dept,深入分析得出,没有需求外接连(外接连的性状:某一行(或一些行)记录上会出现八分之四有值,四分之二为NULL值)

规范化:员工编号为1006

 

第一步:去除多表,只查一张表,这里去除部门表,只查职员和工人表

SELECT ename, sal FROM emp e WHERE empno=1006

 

其次步:让第一步与dept做内一而再查询,加多主外键条件去除无用笛Carl积

SELECT e.ename, e.sal, d.dname, d.loc

FROM emp e, dept d

WHERE e.deptno=d.deptno AND empno=1006

 

其次步中的dept表表示具备行有所列的一张完整的表,这里可以把dept替换到全数行,但独有dname和loc列的表,那必要子查询。

 

其三步:查询dept表中dname和loc两列,因为deptno会被看成标准,用来去除无用笛Carl积,所以须要查询它。

SELECT dname,loc,deptno FROM dept;

 

第四步:替换第二步中的dept

SELECT e.ename, e.sal, d.dname, d.loc

FROM emp e, (SELECT dname,loc,deptno FROM dept)  d

WHERE e.deptno=d.deptno AND e.empno=1006

 

l  子查询作为表

l  子查询情势为多行多列

 

 

 

4 子查询

子查询就是嵌套查询,即SELECT中包含SELECT,倘使一条语句中设有五个,或多少个以上SELECT,那么就是子查询语句了。

l  子查询出现的职位:

  • where后,作为标准的一有些;
  • from后,作为被询问的一条表;

l  当子查询出现在where后作为基准时,还足以行使如下首要字:

  • any
  • all

l  子查询结果集的情势:(上边包车型大巴例子分别对应那4种意况)

  • 单行单列(用于标准)
  • 单行多列(用于标准)
  • 多行单列(用于标准)
  • 多行多列(用于表)

条件

 * (***)单行单列:SELECT * FROM 表1 别名1 WHERE 列1 [=、>、<、>=、<=、!=] (SELECT 列 FROM 表2 别名2 WHERE 条件)

* (**)多行单列:SELECT * FROM 表1 别名1 WHERE 列1 [IN, ALL, ANY] (SELECT 列 FROM 表2 别名2 WHERE 条件)

* (*)单行多列:SELECT * FROM 表1 别名1 WHERE (列1,列2) IN (SELECT 列1, 列2 FROM 表2 别名2 WHERE 条件)

* (***)多行多列:SELECT * FROM 表1 别名1 , (SELECT ....) 别名2 WHERE 条件

练习:

  1. 工薪当先甘宁的职工。

分析:

询问条件:工资>甘宁工资,当中甘宁薪金须求一条子查询。

 

第一步:查询甘宁的薪水

SELECT sal FROM emp WHERE ename='甘宁'

 

第二步:查询高于甘宁薪俸的职员和工人

SELECT * FROM emp WHERE sal > (${第一步})

 

结果:

SELECT * FROM emp WHERE sal > (SELECT sal FROM emp WHERE ename='甘宁')

总结:

l  子查询作为规范

l  子查询形式为单行单列

 

  1. 薪俸当先30机关全部人的职工新闻(ALL)

分析:

询问条件:薪资超越30机关全数人薪金,当中30机构有着人薪俸是子查询。高于全数要求使用all关键字。

 

率先步:查询30机构有着人工资

SELECT sal FROM emp WHERE deptno=30;

 

第二步:查询高于30机关全体人薪俸的职员和工人消息

SELECT * FROM emp WHERE sal > ALL (${第一步})

 

结果:

SELECT * FROM emp WHERE sal > ALL [q16] (SELECT sal FROM emp WHERE deptno=30)

 

总结:

l  子查询作为条件

l  子查询格局为多行单列(当子查询结果集方式为多行单列时得以接纳ALL或ANY关键字)

 

  1. 查询工作和薪给与殷天正一模二样的员工音讯

分析:

询问条件:工作和薪酬与殷天正完全同样,这是子查询

 

率先步:查询出殷天正的干活和报酬

SELECT job,sal FROM emp WHERE ename='殷天正'

 

第二步:查询出与殷天正职业和薪资一律的人 in(….)相称

SELECT * FROM emp WHERE (job,sal) IN (${第一步})

 

结果:

SELECT * FROM emp WHERE (job,sal) IN (SELECT job,sal FROM emp WHERE ename='殷天正')

总结:

l  子查询作为标准

l  子查询情势为单行多列

 

  1. 查询职员和工人编号为1006的职员和工人名称、职员和工人工资、部门名称、部门地址(表中取结果)

分析:

查询列:员工名称、职员和工人薪金、部门名称、部门地址

查询表:emp和dept,深入分析得出,无需外接连(外接连的特征:某一行(或少数行)记录上会出现八分之四有值,二分一为NULL值)

法则:职员和工人编号为1006

 

率先步:去除多表,只查一张表,这里去除部门表,只查职员和工人表

SELECT ename, sal FROM emp e WHERE empno=1006

 

其次步:让第一步与dept做内接二连三查询,添加主外键条件去除无用笛Carl积

SELECT e.ename, e.sal, d.dname, d.loc

FROM emp e, dept d

WHERE e.deptno=d.deptno AND empno=1006

 

第二步中的dept表表示全体行有所列的一张完整的表,这里能够把dept替换来全数行,但唯有dname和loc列的表,那需求子查询。

 

其三步:查询dept表中dname和loc两列,因为deptno会被用作标准,用来去除无用笛Carl积,所以供给查询它。

SELECT dname,loc,deptno FROM dept;

 

第四步:替换第二步中的dept

SELECT e.ename, e.sal, d.dname, d.loc

FROM emp e, (SELECT dname,loc,deptno FROM dept)  d

WHERE e.deptno=d.deptno AND e.empno=1006

 

l  子查询作为表

l  子查询情势为多行多列

 

 

 

  组条件
  以机构分组,查询每组记录数。条件为记录数大于3
  SELECT deptno, COUNT(*) FROM emp GROUP BY deptno HAVING COUNT(*) > 3;

  在表中创建一对一涉嫌相比较特出,必要让在那之中一张表的主键,正是主键又是外键。

四、数据库关系模型

五、limit子句(方言)
  LIMIT用来界定查询结果的胚胎行,以及总行数。
  比方:查询发轫行为第5行,一共查询3行记录
  SELECT * FROM emp LIMIT 4, 3;
  --> 在那之中4意味着从第5行伊始,当中3意味着一共查询3行。即第5、6、7行记录。

CREATE TABLE hasband (
    hid INT PRIMARY KEY AUTO_INCREMENT,
    hname VARCHAR(50)
);

CREATE TABLE wife (
    wid INT PRIMARY KEY AUTO_INCREMENT,
    wname VARCHAR(50),
    CONSTRAINT fk_wife_hasband FOREIGN KEY (wid)  REFERENCES hasband(hid) 
);

1、一对一关联

 约束
* 约束是增添在列上的,用来约束列的!

2、多对多涉及

  在表中确立一对一关系比较特殊,要求让内部一张表的主键,正是主键又是外键。

  1. 主键约束(唯一标记)
      ****非空***
      ****唯一***
      ****被引用****(学习外键时)

在表中创设多对多关系须要采纳中间表,即须要三张表,在中间表中利用多个外键,分别引用别的两张表的主键。

CREATE TABLE hasband (
    hid INT PRIMARY KEY AUTO_INCREMENT,
    hname VARCHAR(50)
);

CREATE TABLE wife (
    wid INT PRIMARY KEY AUTO_INCREMENT,
    wname VARCHAR(50),
    CONSTRAINT fk_wife_hasband FOREIGN KEY (wid)  REFERENCES hasband(hid) 
);

  * 当表的某一列被指定为主键后,该列就无法为空,无法有重复值出现。
  * 创设表时钦点主键的三种格局:
    >
    CREATE TABLE stu(
    sid        CHAR(6) PRIMARY KEY,
    sname    VARCHAR(20),
    age        INT,
    gender    VARCHAR(10)
    );
    钦赐sid列为主键列,即为sid列增多主键约束
    >
    CREATE TABLE stu(
    sid        CHAR(6),
    sname    VARCHAR(20),
    age        INT,
    gender    VARCHAR(10),
    PRIMARY KEY(sid)
    );
    内定sid列为主键列,即为sid列加多主键约束
  * 修改表时钦定主键:ALTE路虎极光 TABLE stu ADD PHighlanderIMAEscortY KEY(sid);
  * 删除主键:ALTEMurano TABLE stu DROP P兰德福特ExplorerIMACR-VY KEY;

CREATE TABLE student (
    sid INT PRIMARY KEY ,
    ......
);

CREATE TABLE teacher(
    tid INT PRIMARY KEY ,
    ......
);

CREATE TABLE stu_tea (
    sid INT,
    tid INT,
    ADD CONSTRAINT fk_stu_tea_sid FOREIGN KEY (sid)  REFERENCES student(sid) ,
    ADD CONSTRAINT fk_stu_tea_tid FOREIGN KEY (tid)  REFERENCES teacher(tid) 
);

2、多对多涉及

  1. 主键自增加
      * 因为主键列的表征是:必需独一、无法为空,所以咱们普通会钦命主键类为整型,然后设置其机动增加,那样能够保险在插入数据时主键列的不二法门和非空天性。
      * 创设表时钦命主键自增加
      CREATE TABLE stu(
            sid INT PRIMARY KEY AUTO_INCREMENT,
            sname    VARCHAR(20),
            age        INT,
            gender    VARCHAR(10)
      );
      * 修改表时设置主键自增加:ALTE奇骏 TABLE stu CHANGE sid sid INT AUTO_INCREMENT;
      * 修改表时去除主键自增加:ALTEPAJERO TABLE stu CHANGE sid sid INT;
      * 测试主键自增加:
        > INSERT INTO stu VALUES(NULL, 'zhangSan',23,'male');
        > INSERT INTO stu(sname,age,gender) VALUES('zhangSan',23,'male');

  2. 非空约束
      * 因为一些列不能安装为NULL值,所以能够对列增多非空约束。
      * 例如:
      CREATE TABLE stu(
            sid INT PRIMARY KEY AUTO_INCREMENT,
            sname    VARCHAR(20) NOT NULL,
            age        INT,
            gender    VARCHAR(10)
      );
      * 对sname列设置了非空约束

  3. 独一约束
      * 车库有个别列不能够安装双重的值,所以能够对列增添独一约束。
      * 例如:
      CREATE TABLE stu(
            sid INT PRIMARY KEY AUTO_INCREMENT,
            sname    VARCHAR(20) NOT NULL UNIQUE,
            age        INT,
            gender    VARCHAR(10)
      );
      * 对sname列设置了非空约束

  4. 概念模型

在中间表中国建工业总会公司立关联,如:

在表中确立多对多涉及须要使用中间表,即必要三张表,在中间表中央银行使五个外键,分别援引别的两张表的主键。

目的模型:能够双向关联,而且援用的是指标,实际不是四个主键!
提到模型:只好多方引用一方,而且引用的只是主键,并不是一整行记录。

INSERT INTO stu_tea VALUES(5,1);

INSERT INTO stu_tea VALUES(2,2);

INSERT INTO stu_tea VALUES(3,2);

CREATE TABLE student (
    sid INT PRIMARY KEY ,
    ......
);

CREATE TABLE teacher(
    tid INT PRIMARY KEY ,
    ......
);

CREATE TABLE stu_tea (
    sid INT,
    tid INT,
    ADD CONSTRAINT fk_stu_tea_sid FOREIGN KEY (sid)  REFERENCES student(sid) ,
    ADD CONSTRAINT fk_stu_tea_tid FOREIGN KEY (tid)  REFERENCES teacher(tid) 
);

目的模型:在java中是domain!!!比方:User、Student
is a
has a(关联)
  > 1对1
  > 1对多
  > 多对多
use a  

五、多表查询

在中间表中树立关系,如:

关联模型:在数据库中表!!!

1、分类

INSERT INTO stu_tea VALUES(5,1);

INSERT INTO stu_tea VALUES(2,2);

INSERT INTO stu_tea VALUES(3,2);

  当我们要完毕贰个软件系统时,须求把系统中的实体收收取来,产生概念模型。
  举例部门、职员和工人都以系统中的实体。概念模型中的实体最后会形成Java中的类、数据库中表。
  实体之间还留存着关系,关系有三种:
  * 1对多:譬喻各个职工都从属三个部门,而贰个部门得以有四个职工,当中员工是多方面,而单位是一方。
  * 1对1:举个例子老头子和相爱的人便是非常的关联,贰个先生只好有叁个妻妾,而八个妻妾只可以有叁个老头子。
  * 多对多:老师与学员的涉嫌便是多对多,二个教育工笔者能够有七个学生,多个学员能够有多个名师。

  • 联合结果集
  • 连日查询
  • 子查询

五、多表查询

  概念模型在Java中形成实体类(javaBean)
  类就动用成员变量来成功关系,常常都是双向关联!
  多对一双向中涉及,即职工涉嫌部门,部门也关系职员和工人
  class Employee {//多方关联一方
     ...
     private Department department;
  }
  class Department {//一方关联多方
     ...
     private List<Employee> employees;
  }

2、合併结果查询

1、分类

  class Husband {
     ...
     private Wife wife;
  }
  class Wife {
     ...
     private Husband
  }

  • 供给被统一表中,结果集列的系列和列数同样
  • UNION,去除重复行
  • UNION ALL,不去除重复行
  • 统一结果集
  • 连日查询
  • 子查询

  class Student {
     ...
     private List<Teacher> teachers
  }
  class Teacher {
     ...
     private List<Student> students;
  }

SELECT * FROM 表1名

UNION ALL

SELECT * FROM 表2名;

2、合併结果查询

  1. 外键约束
      * 外键必需是另一表的主键的值(外键要援引主键!)
      * 外键能够另行
      * 外键可认为空
      * 一张表中得以有多少个外键!

3、连接查询

  • 务求被联合表中,结果集列的档期的顺序和列数同样
  • UNION,去除重复行
  • UNION ALL,不去除重复行

  概念模型在数据库中成为表
  数据库表中的多对一涉嫌,只供给在多方使用一个单身的列来援用1方的主键就能够
  /*员工表*/
  create talbe emp (
    empno int primary key,/*员工编号*/
    ...
    deptno int/*所属单位的号码*/
  );
  /*部门表*/
  create table dept (
    deptno int  primary key,/*机构编号*/
    ...
  );
  emp表中的deptno列的值表示如今职工所从属的机构编号。也正是说emp.deptno必需在dept表中是真正存在!
  可是大家务供给去对它实行约束,不然可能会出现职工所属的部门编号是空头支票的。这种约束就是外键约束。
  我们需求给emp.deptno增添外键约束,约束它的值必得在dept.deptno中设有。外键必须是另贰个表的主键!

①分类

SELECT * FROM 表1名

UNION ALL

SELECT * FROM 表2名;

  语法:CONSTRAINT 约束名称 FOREIGN KEY(外键列名) REFERENCES 关联表(关联表的主键)
  创立表时钦定外键约束
  create talbe emp (
    empno int primary key,
    ...
    deptno int,
    CONSTRAINT fk_emp FOREIGN KEY(mgr) REFERENCES emp(empno)  
  );

  • 内连接
  • 外连接
    • 左外连接
    • 右外连接
    • 全外连接(mysql不补助)
    • 当然连接(属于一种简化情势)

3、连接查询

  修改表时增添外键约束
  ALERT TABLE emp
  ADD CONSTRAINT fk_emp_deptno FOREIGN KEY(deptno) REFERENCES dept(deptno);

②内连接

①分类

  修改表时去除了那几个之外键约束
  ALTER TABLE emp
  DROP FOREIGN KEY fk_emp_deptno;/*封锁名称*/  

  • 方言:SELECT * FROM 表1 别名1,表2 别名2 WHERE 别名1.xx=别名2.xx;
  • 内连接
  • 外连接
    • 左外连接
    • 右外连接
    • 全外连接(mysql不扶助)
    • 当然连接(属于一种简化情势)
  1. 数据库一对一提到
      在表中成立一对一关联相比特别,必要让里面一张表的主键,就是主键又是外键。
      create table husband(
        hid int PRIMARY KEY,
        ...
      );
      create table wife(
        wid int PRIMARY KEY,
        ...
        ADD CONSTRAINT fk_wife_wid FOREIGN KEY(wid) REFERENCES husband(hid)
      );
      在那之中wife表的wid正是主键,又是对峙husband表的外键!
      husband.hid是主键,不可能重新!
      wife.wid是主键,无法重新,又是外键,必得来自husband.hid。
      所以假设在wife表中有一条记下的wid为1,那么wife表中的其余记录的wid就不可能再是1了,因为它是主键。
      同期在husband.hid中必得存在1这么些值,因为wid是外键。那就做到了一对一关系。

SELECT * FROM emp,dept WHERE emp.deptno=dept.deptno;

SELECT e.ename, e.sal, d.dname FROM emp e, dept d WHERE e.deptno=d.deptno;

②内连接

  *****从表的主键正是外键!

     以准则筛选去除笛卡尔积中没用的音信。

  • 方言:SELECT * FROM 表1 别名1,表2 别名2 WHERE 别名1.xx=别名2.xx;
  1. 数据库多对多关系
      在表中树立多对多关系须要运用中间表,即要求三张表,在中间表中运用八个外键,分别援用其余五个表的主键。
      create table student(
        sid int PRIMARY KEY,
        ...
      );
      create table teacher(
        tid int PRIMARY KEY,
        ...
      );
  • 标准:SELECT * FROM 表1 别名1 INNER JOIN 表2 别名2 ON 别名1.xx=别名2.xx;

SELECT * FROM emp,dept WHERE emp.deptno=dept.deptno;

SELECT e.ename, e.sal, d.dname FROM emp e, dept d WHERE e.deptno=d.deptno;

  create table stu_tea(
    sid int,
    tid int,
    ADD CONSTRAINT fk_stu_tea_sid FOREIGN KEY(sid) REFERENCES student(sid),
    ADD CONSTRAINT fk_stu_tea_tid FOREIGN KEY(tid) REFERENCES teacher(tid)
  );
  这时在stu_tea那些个中表中的每条记下都以来证实student和teacher表的关联
  例如在stu_tea表中的记录:sid为1001,tid为二零零三,那表明编号为1001的上学的小孩子有叁个编号为2000的良师
  sid    tid
  101    201 /*编号为101的上学的儿童有一个号码为201的教授*/
  101    202 /*号码为101的学员有贰个号码为202的教师的资质*/
  101    203 /*号码为101的学生有三个号码为203的先生*/
  102    201 /*号码为102的学习者有多个数码为201的教师职员和工人*/
  102    204 /*号码为102的上学的小孩子有叁个数码为204的教育工小编*/
select *
from emp, dept, (select * from emp)
where
group by
having
order by
limit

SELECT e.ename, e.sal , d.dname  FROM emp e INNER JOIN dept d ON  e.deptno=d.deptno;

     以标准筛选去除笛Carl积中没用的信息。

多表查询
  1. 分类:
    * 合併结果集(精晓)
    * 连接查询
    * 子查询

  • 自然:SELECT * FROM 表1 别名1 NATURAL JOIN 表2 别名2 ;
  • 标准:SELECT * FROM 表1 别名1 INNER JOIN 表2 别名2 ON 别名1.xx=别名2.xx;

统一结果集
  * 必要被联合的表中,列的等级次序和列数一样
  * UNION,去除重复行
  * UNION ALL,不去除重复行

SELECT e.ename, e.sal , d.dname  FROM emp e NATURAL JOIN dept d;

SELECT e.ename, e.sal , d.dname  FROM emp e INNER JOIN dept d ON  e.deptno=d.deptno;

SELECT * FROM cd
UNION ALL
SELECT * FROM ab;

  • 内延续查询出的具备记录都满意条件
  • 自然:SELECT * FROM 表1 别名1 NATURAL JOIN 表2 别名2 ;

连日查询
  1. 分类
    * 内连接
    * 外连接
      > 左外连接
      > 右外接连
      > 全外连接(MySQL不帮衬)
    * 自然连接(属于一种简化情势)

③外连接

SELECT e.ename, e.sal , d.dname  FROM emp e NATURAL JOIN dept d;

  2. 内连接
    * 方言:SELECT * FROM 表1 别名1, 表2 别名2 WHERE 别名1.xx=别名2.xx
    * 标准:SELECT * FROM 表1 别名1 INNER JOIN 表2 别名2 ON 别名1.xx=别名2.xx
    * 自然:SELECT * FROM 表1 别名1 NATURAL JOIN 表2 别名2
    * 内连接查询出的具有记录都知足条件。
 
  3. 外连接
    * 左外:SELECT * FROM 表1 别名1 LEFT OUTER JOIN 表2 别名2 ON 别名1.xx=别名2.xx
      > 左表记录随意是不是满意条件都会询问出来,而右表唯有知足条件本事出来。左表中不满意条件的笔录,右表部分都为NULL
    * 左外自然:SELECT * FROM 表1 别名1 NATURAL LEFT OUTER JOIN 表2 别名2 ON 别名1.xx=别名2.xx
    * 右外:SELECT * FROM 表1 别名1 RIGHT OUTER JOIN 表2 别名2 ON 别名1.xx=别名2.xx
      > 右表记录随意是还是不是满意条件都会询问出来,而左表独有满意条件本领出来。右表不满足条件的笔录,其左表部分都为NULL
    * 右外自然:SELECT * FROM 表1 别名1 NATURAL RIGHT OUTER JOIN 表2 别名2 ON 别名1.xx=别名2.xx
    * 全链接:能够动用UNION来形成全链接

  • 左外:SELECT * FROM 表1 别名1 LEFT OUTER JOIN 表2 别名2 ON 别名1.xx=别名2.xx;
    • 左表记录随意是还是不是满足条件都会询问出来,而右表唯有满足条件技巧出去。左表中不满足条件的笔录,右表部分都为null。
  • 内连接查询出的兼具记录都满足条件

子查询
  :查询中有询问(查看select关键字的个数!)
  1. 面世的职位:
    * where后当做标准存在
    * from后当做表存在(多行多列)

SELECT e.ename, e.sal , IFNULL(d.dname,'无部门') AS dname  FROM emp e LEFT OUTER JOIN dept d ON  e.deptno=d.deptno;

③外连接

  2. 条件
    * (***)单行单列:SELECT * FROM 表1 别名1 WHERE 列1 [=、>、<、>=、<=、!=] (SELECT 列 FROM 表2 别名2 WHERE 条件)
    * (**)多行单列:SELECT * FROM 表1 别名1 WHERE 列1 [IN, ALL, ANY] (SELECT 列 FROM 表2 别名2 WHERE 条件)
    * (*)单行多列:SELECT * FROM 表1 别名1 WHERE (列1,列2) IN (SELECT 列1, 列2 FROM 表2 别名2 WHERE 条件)
    * (***)多行多列:SELECT * FROM 表1 别名1 , (SELECT ....) 别名2 WHERE 条件

  • 左外自然:SELECT * FROM 表1 别名1 NATURAL LEFT OUTER JOIN 表2 别名2 ON 别名1.xx=别名2.xx;
  • 右外:SELECT * FROM 表1 别名1 RIGHT OUTER JOIN 表2 别名2 ON 别名1.xx=别名2.xx;
    • 右表记录随意是不是满意条件都会询问出来,而左表唯有满意条件本领出去。右表中不满意条件的笔录,左表部分都为null。
  • 右外自然:SELECT * FROM 表1 别名1 NATURAL RIGHT OUTER JOIN 表2 别名2 ON 别名1.xx=别名2.xx;
  • 全链接:能够运用UNION来产生全连接。
  • 左外:SELECT * FROM 表1 别名1 LEFT OUTER JOIN 表2 别名2 ON 别名1.xx=别名2.xx;
    • 左表记录随意是不是满足条件都会询问出来,而右表唯有知足条件才具出去。左表中不满意条件的记录,右表部分都为null。

 

SELECT e.ename, e.sal , d.dname 
FROM emp e LEFT OUTER JOIN dept d 
ON e.deptno=d.deptno
UNION
SELECT e.ename, e.sal , d.dname 
FROM emp e RIGHT OUTER JOIN dept d 
ON e.deptno=d.deptno;

SELECT e.ename, e.sal , IFNULL(d.dname,'无部门') AS dname  FROM emp e LEFT OUTER JOIN dept d ON  e.deptno=d.deptno;

4、子查询

  • 左外自然:SELECT * FROM 表1 别名1 NATURAL LEFT OUTER JOIN 表2 别名2 ON 别名1.xx=别名2.xx;
  • 右外:SELECT * FROM 表1 别名1 RIGHT OUTER JOIN 表2 别名2 ON 别名1.xx=别名2.xx;
    • 右表记录随便是还是不是满意条件都会询问出来,而左表唯有满意条件技艺出去。右表中不满意条件的记录,左表部分都为null。
  • 右外自然:SELECT * FROM 表1 别名1 NATURAL RIGHT OUTER JOIN 表2 别名2 ON 别名1.xx=别名2.xx;
  • 全链接:能够选取UNION来产生全连接。

询问中有询问(查看select关键字的个数)

SELECT e.ename, e.sal , d.dname 
FROM emp e LEFT OUTER JOIN dept d 
ON e.deptno=d.deptno
UNION
SELECT e.ename, e.sal , d.dname 
FROM emp e RIGHT OUTER JOIN dept d 
ON e.deptno=d.deptno;

①出现的职位

4、子查询

  • WHERE后当做标准存在
  • FROM后当做表存在(多行多列)

询问中有询问(查看select关键字的个数)

②条件

①现身的岗位

  • 单行单列:SELECT * FROM 表1 别名1 WHERE 列1 [=、>、<、>=、<=、!=] (SELECT 列 FROM 表2 别名2 WHERE 条件) ;
  • WHERE后作为基准存在
  • FROM后作为表存在(多行多列)

SELECT * FROM emp WHERE sal=(SELECT MAX(sal) FROM emp);

②条件

  • 多行单列:SELECT * FROM 表1 别名1 WHERE 列1 [IN,ALL,ANY] (SELECT 列 FROM 表2 别名2 WHERE 条件);
  • 单行单列:SELECT * FROM 表1 别名1 WHERE 列1 [=、>、<、>=、<=、!=] (SELECT 列 FROM 表2 别名2 WHERE 条件) ;

SELECT * FROM emp WHERE sal > ANY (SELECT sal FROM emp WHERE job='经理') ;

SELECT * FROM emp WHERE sal=(SELECT MAX(sal) FROM emp);

  • 单行多列:SELECT * FROM 表1 别名1 WHERE (列1,列2)IN (SELECT 列1,列2 FROM 表2 别名2 WHERE 条件);
  • 多行单列:SELECT * FROM 表1 别名1 WHERE 列1 [IN,ALL,ANY] (SELECT 列 FROM 表2 别名2 WHERE 条件);

SELECT * FROM emp WHERE (job,deptno) IN (SELECT job,deptno from emp WHERE deptno=30) ;

SELECT * FROM emp WHERE sal > ANY (SELECT sal FROM emp WHERE job='经理') ;

  • 多行多列:SELECT * FROM 表1 别名1,(SELECT......)表2 别名2 WHERE 条件;
  • 单行多列:SELECT * FROM 表1 别名1 WHERE (列1,列2)IN (SELECT 列1,列2 FROM 表2 别名2 WHERE 条件);

 

SELECT * FROM emp WHERE (job,deptno) IN (SELECT job,deptno from emp WHERE deptno=30) ;

  • 多行多列:SELECT * FROM 表1 别名1,(SELECT......)表2 别名2 WHERE 条件;

 

本文由澳门新萄京官方网站发布于数据库网络,转载请注明出处:澳门新萄京官方网站:多表查询

关键词: