mysql

--  修改字段

alter  table  emp  MODIFY  dept_id int;

--  删除字段

alter  table  emp  drop  COLUMN dept_id;

之前就当是 热身了,跟着这个老师 你会觉得 真的能学到很多东西。要好好努力了!

上面两个语句是通用性很强的语句。是 在 oracle 里面也支持的语法。

今天要练习的点:

主外键, 多表联查,内连接 外链接 -左外链接 右外链接 全外链接

以及一些 通用性语法规则。感觉点不是特别多。应该 可以的。

给不会的点,做标记就可以了。

Point 1

这个里面varchar 和 char 两种方式 都是代表字符串,varchar 可变长度字符串。char 不可变长度字符串。 

两者各有优势,char 不可变则可以让 查询速度更快。

Varchar 长度可变,所以可以节省空间,但是 查询速度会相应降低

举例:

Create table stu(

Name char(10);

);

Create table stu(

Name varchar(10);

);

Insert into stu values ('nihao');

char类型中仍然占用10个字符。

但是varchar里面只占用5个字符。

所以结果是char中更浪费空间,但是查询效率更高,因为在

varchar里面是按位 n i h a o   就是 一个 字符 一个 字符 来进行比较,所以查询效率会很低。

  modify只能用来更改字段属性。

而change 既可以更改字段名 也可以为字段更改字段类型 以及字段的约束。

2015.10.27练习题:

一、

1、创建emp表:

emp_id int, 员工编号 

emp_name varchar(20),员工姓名

emp_age int,员工年龄

emp_address varchar(50),员工住址

emp_date varchar(20)入职时间

2、删除该表 (因为 

规范的命名是:数据库后缀名为:db 表名后缀名是 tb

字段名的前部分是表名 ,后部分是属性名中间用 下划线链接。举例

emp_tb_id

emp_tb_name)

3、重新添加该表,表名为emp_tb

4、为了操作方便,为表改名 为emp

5、创建dept表:

dept_id  int,

dept_name  varchar(20)

6、添加字段 为emp表 添加一个 dept_id 字段。

7、修改此字段为 varchar20)。利用 modify关键字

8、将此字段属性值改回为int类型。利用change关键字

区别:

modify只能用来更改字段属性。

change 既可以更改字段名 也可以为字段更改 字段类型 以及字段的约束。

9、*删除字段 删除 入职时间列。

 最好是用alter table emp drop column 列名。这个 columnmysql里面可写可不写,但是但是在其他语法结构里面,就十分重要。所以最好记住这个关键字。 

10、插入数据:

11、修改数据:

(1)将地址为空的员工的地址改为北京,(2)部门号设置为2.

12、删除数据:

二、

我们常见的约束有哪些?至少写出6个。行级约束和列级约束分别指什么,请对这六个约束,进行相应分类。约束的意义在哪里?

三、

Char 和 varchar 有什么异同点?

四、约束的三种添加方式?

-- 1

create table emp(

emp_id int,

emp_name varchar(20),

emp_age int,

emp_address varchar(20),

emp_date date

);

-- 2

drop table emp;

-- 3

create table emp_tb(

emp_id int,

emp_name varchar(20),

emp_age int,

emp_address varchar(20),

emp_date date

);

-- 4

alter table emp_tb rename emp;

-- 5 

create table dept(

dept_id int,

dept_name varchar(20)

);

-- 6

alter table emp add column dept_id int;

-- 7

alter table emp modify dept_id varchar(20);

-- 8

alter table emp change dept_id dept_id int;

-- 9

alter table emp drop column emp_date;

-- 10

SELECT * from emp;

insert into emp (emp_id,emp_name, emp_age, emp_address)values (1,'张三',23,'北京');

insert into emp (emp_id,emp_name,emp_age) values (2,'wangwu',45)

-- 11

update emp set emp_address='北京' where emp_address is null;

update emp set dept_id=2;

-- 12 

delete from emp;

数据库的约束操作:为了保持数据的完整性:

我们知道的关键字有:

 not null, primary key, unique   foreign key   default   CHECK(这个 mysql语法里面没有)

他们可以分成行级约束 和列级约束。

两者的区别在于,行级约束是指,行与行之间存在制约关系,即:某一行取值为另一行的取值收到a的制约,不可以再为a。这就属于行级约束。

列级约束,是相对于自身的一种约束,比如 不能为空,即 只跟自己有关系的约束条件。

根据这种定义:我们可以将上面六种关键字进行如下分类:

行级约束:primary keyunique

列级约束:not nullforeign keydefaultCHECK

针对约束有两种添加方式,有一种我们已经熟知的直接在属性后面添加。

举例:

Create table student(

Stuid int primary key,

Stuname varchar(20)

);

第二种,在创建表的最后一行进行添加。

Create table student(

Stuid int,

Stuname varchar (20),

Constraint pk_student_id primary key (stuid)

);

四个部分来修饰  括号 千万万千 注意了!

约束 给出需要系统知道的名称 约束类型 (列名)

constraint pk_emp_tb3_address default '北京' (emp_address) 结尾添加 默认值约束 并不容易。

数据库错误 150 是什么?  怎么解决

constraint unique (emp_address)   这也是可行的。

外键约束添加方式:

好吧 也是 醉了 在外面可以 添加,在创建的里面 就是 添加不上。

这个 地方还要多巩固

约束 的添加方式

在表结尾 添加的方式

以及在表外添加的方式。

这里写笔记吧,我觉得 我会的!!!

 emp_age Between A and B

等价于:emp_age >=A and emp_age<=B

Select * from emp where id in (20,8,4,2)

查询emp中的所有信息 当id 为 20或者8或者 4或者 

反向查询 select * from emp where id not in (20,8, 4,2)

查询emp表中 id 不等于 20  8 4 2 的员工的所有信息

Between and 和 in  之间 是有区别的。

Between and是一个 区间 

In 是一个 我们自己定义的范围

模糊查询

Select * from emp where name like 'a%';

emp表中查找 name a打头的名字

Select * from emp where name like '%a'

emp表中 查找 以a结尾的名字

Select * from emp where name like '%a%'

emp表中 查找 名字中包含a的名字

Select * from emp where name like '_a%'

emp表中 查找 名字为“空格哒哒哒”形式的名字

换句话说 “_” 是占位符

%” 是通配符

通过 我们的理解易得:

Select from where 的查询顺序是:

From where select

Order by 的顺序:

Select * from  TABLE where COLUMN1=? Order by COLUMN2 descCOLUMN3

Asc

从表中查找列名1等于问号 的所有信息 以COLUMN2 降序排序 当COLUMN2的值相等时,以COLUMN3 进行排序。

根据这个套路 所以 先做 select from where order by 四者的顺序是

from where select order 进行的。

所以 现在给出这样一张表:

Create table emp(

Emp_id int,

Emp_name varchar(20),

Salary int//月薪

);

现在题目为:按照年薪对emp查询出的结果进行排序:

Select *,salary*12 年薪 from emp where 1=1 order by 年薪;

聚合函数:

Select count (*) from emp;查询一共有多少条记录

Select  max(emp_age) from emp;查询 员工的最大年龄

Select min(emp_age) from emp;查询员工的最小年龄

Select avg(sal) from emp;查询员工的平均工资

Select sum(sal),avg(sal) max(sal)from emp;查询emp表中 的每月工资总和 平均工资 和工资最大值

!!!

如果有分组查询 select 后面只能显示 分组字段 或者分组函数。

例如下面这条语句:

Select avg(sal)max(sal),dept_id from emp group by dept_id;

查询平均工资 和最大工资 还有部门编号 从员工表中,通过 部门编号进行分组。

际上并未拥有次最大工资,这样在其他数据库中认为是不安全的。当然最初设计这款数据库的人认为,我就要显示某个人举例平均工资和最大工资的一个数量上的关系,可能这样他就允许了这样一种情况。

其实,在mysql里面是可以显示*的。但是 这样会出现奇怪的数据集合,在其他的数据库里面是不允许这样的语句出现的。所以 在这里 就要记住,如果有分组查询那么select后面只能显示 分组字段或者分组函数。

!!!

聚合和分组查询一起使用的时候,函数计算数据是分组后的数据

举例:

Select avg(sal),max(sal),dept_id from emp group by dept_id having avg(sal)>1800

emp表中 查询平均工资 最大工资 部门编号 通过 部门编号来分组 其中显示 平均工资大于1800的数据。

什么时候 会分组这个要多做一些练习才能分析出来

关于分组查询的问题:

我们想要挑选不同部门的最大工资:然后发现在第二个部门里面,最高工资是3300,如果此时 我们将salary列去掉。

就会发现张三得到了最高工资。这样的语法结构在mysql里面是被允许的。但是在其他数据库系统里面是不被允许的。其他数据库认为这样做 不安全。

所以 这可以算是一个语法特性。

所以这就是 我们记录的笔记:

如果有分组查询,那么分组查询的显示条件只能有:分组字段或者分组函数(聚合函数)

也即是 select 后面只能是 分组字段 或者 分组函数或者叫聚合函数。

所以下面这句话看着,就很顺眼,也很好理解:

前面是部门编号 后面是部门对应的最高工资。

聚合函数 (分组函数)一起使用的时候函数计算数据是分组后的数据。

聚合函数 就是 分组函数

所以 我们可以排一下序了

From  where  group by   having   select   order by 

看到我们的排序,你发现 having select 前面,所以 在having 里面不可能有 “平均工资”  这个 条目,这样做是非法的。

也就是说: 这也是mysql的一个特性。在其他数据库里面,是不允许这样做的。

而且 能很清晰的知道 这条语法的意义:

找到不同部门里面的平均工资 和最高工资。

我们可以完善一下 对应一下部门表得到 完整的想要的 数据:

那种写法并不存在,或者 就应该起一个别名。因为程序也不打算算两次 既然我们在前面已经得到了相关数据的话。

后面用到的所有数据 应该是 已经出现过了的!!!

好吧 脑袋有点儿 浆糊了 主要是 太乱了,一直在吵吵,或者 一上午 都在干同一件事,真的可能体力不支了。

好吧 编一个 场景:

要举办联谊会了,要求找到不同部门之间同年龄的员工。

最全查询顺序:

Select from where  group by having order by limit

七者的执行顺序:

From where group by having  select  order by limit

符合这个规范执行的就是 绝对通用的数据库查询与法。

其次加一个 

分组查询的显示部分只能有 分组条件 或者分组函数。

内外联:

 

posted on 2016-02-08 15:20  木鸟飞  阅读(490)  评论(0编辑  收藏  举报

导航