mysql 约束

本课程今日要描述一下有关,苦恼使用mysql教程数据库教程的情侣的贰个大面积的难题,mysql
group by 先排序与分组同临时间接选举取方法,下边看实例。

select UTL_RAW.CAST_TO_VARCHAR2(DBMS_LOB.SUBSTR(BLOBField)) from
TableName;

接下去的部分内容,大家必要超前学一些粗略的sql语句,方便我们知道接下去的学识。

–按某一字段分组取最大(小)值所在行的多寡

看排序

 

DDL—数据定义语言(Create,Alter,Drop,DECLARE)
DML—数据垄断(monopoly)语言(Select,Delete,Update,Insert)
DCL—数据调控语言(GRANT,REVOKE,COMMIT,ROLLBACK)
DQL—数据查询语言(select)

复制代码 代码如下:

select * from (select * from posts order by dateline desc) group by 
tid order by dateline desc limit 10

图片 1图片 2出处:

DML(data manipulation language):
它们是SELECT、UPDATE、INSERT、DELETE,就象它的名字千篇一律,那4条命令是用来对数据Curry的数目开始展览操作的语言
DDL(data definition language):
DDL比DML要多,首要的一声令下有CREATE、ALTEPAJERO、DROP等,DDL首倘诺用在概念或改换表(TABLE)的协会,数据类型,表之间的链接和封锁等专门的学问上,他们基本上在确立表时使用
DCL(Data Control Language):
是数据库调节机能。是用来安装或改动数据库用户或角色权限的言辞,包含(grant,deny,revoke等)语句。在私下认可状态下,唯有sysadmin,dbcreator,db_owner或db_securityadmin等人口才有权力试行DCL

/*
数据如下:
name val memo
a 2 a2(a的第2个值)
a 1 a1–a的率先个值
a 3 a3:a的第多少个值
b 1 b1–b的第一个值
b 3 b3:b的第多个值
b 2 b2b2b2b2
b 4 b4b4
b 5 b5b5b5b5b5
*/

这么功用应该高点。撤废了order   by   的filesort进度。

oracle解析函数 


–创设表并插入数据:

select   *   from   t   where     logtime     in   (select  
max(logtime   )   from   t   group   by   username)

=========================================================== 
作者: zhouwf0726()
发表于:2006.07.25 12:51
分类: oracle开发 
出处:
————————————————————— 

接下去大家慢慢学习SQL语句,在念书从前大家先留神一下SQL语句的专注事项.
1.每条SQL语句甘休时要以;做为截止符.(除了use命令)
2.SQL语句的基本点字不区分轻重缓急写(除了库名字和表名字)
3.在查询数据库音讯还是表消息时,能够以\G做为甘休符,表示以文件情势输出
4.当您无需一条语句输出的结果以\c结束,无法运用ctrl+c,不然登出mysql.
5.大家得以在命令行实践sql语句,要由此mysql -e参数
mysql -e “show databases /G” 显示到shell上
6.假如要求获得SQL语句的相助能够用help命令
如:help create
如若急需进一步得到援救,能够一而再应用help命令
如:help create database

复制代码 代码如下:

 

oracle深入分析函数–SQL*PLUS环境
–1、GROUP BY子句 


create table tb(name varchar(10),val int,memo varchar(20))
insert into tb values(‘a’, 2, ‘a2(a的第四个值)’)
insert into tb values(‘a’, 1, ‘a1–a的首先个值’)
insert into tb values(‘a’, 3, ‘a3:a的第多少个值’)
insert into tb values(‘b’, 1, ‘b1–b的首先个值’)
insert into tb values(‘b’, 3, ‘b3:b的第三个值’)
insert into tb values(‘b’, 2, ‘b2b2b2b2’)
insert into tb values(‘b’, 4, ‘b4b4’)
insert into tb values(‘b’, 5, ‘b5b5b5b5b5’)
go

也可能有网上朋友使用自连接达成的
,这样的频率应该比上边的子查询功用高,不过,为了简单明了,就只用那样一种了,group
by未有排序功效,也许是mysql弱智的地点,大概是自家还未曾发觉

–CREATE TEST TABLE AND INSERT TEST DATA.
create table students
(id number(15,0),
area varchar2(10),
stu_type varchar2(2),
score number(20,2));

1.DDL数据库定义语句
树立数据库以及查询
create database db;
create database db CHARACTER SET = ‘utf8’
show databases;
show create database db;
alter database db CHARACTER SET = ‘latin1’;
修改库名只要求改数据库目录名称
drop database db;

–一、按name分组取val最大的值所在行的多少。

insert into students values(1, ‘111’, ‘g’, 80 );
insert into students values(1, ‘111’, ‘j’, 80 );
insert into students values(1, ‘222’, ‘g’, 89 );
insert into students values(1, ‘222’, ‘g’, 68 );
insert into students values(2, ‘111’, ‘g’, 80 );
insert into students values(2, ‘111’, ‘j’, 70 );
insert into students values(2, ‘222’, ‘g’, 60 );
insert into students values(2, ‘222’, ‘j’, 65 );
insert into students values(3, ‘111’, ‘g’, 75 );
insert into students values(3, ‘111’, ‘j’, 58 );
insert into students values(3, ‘222’, ‘g’, 58 );
insert into students values(3, ‘222’, ‘j’, 90 );
insert into students values(4, ‘111’, ‘g’, 89 );
insert into students values(4, ‘111’, ‘j’, 90 );
insert into students values(4, ‘222’, ‘g’, 90 );
insert into students values(4, ‘222’, ‘j’, 89 );
commit;

创建表以及询问
use db
类型
create table t1(id int(6),name char(10));
create table t1(id int(6),name varchar(10));
日猴时间档案的次序
date类型
create table t4(aa date);
insert into t4 values(‘2010-04-01’),(20100401);
select * from t4;
+————+
| aa |
+————+
| 2010-04-01 |
| 2010-04-01 |
+————+
time类型
create table t5(showttime time);
insert into t5 values (’11:11:11′),(’11:11′),(‘111111’);
select * from t5;
+———–+
| showttime |
+———–+
| 11:11:11 |
| 11:11:00 |
| 11:11:11 |
+———–+
并发的主题材料
create table t6 (a_data data,a_time time);
insert into t6 values(‘1978-4-6′,123412),(651212,’3:5:6’);
select * from t6;
+————+———-+
| a_date | a_time |
+————+———-+
| 1978-04-06 | 12:34:12 |
| 2065-12-12 | 03:05:06 |
+————+———-+
寒暑的范围00-69为两千-2069&&70-99为一九七零-壹玖玖陆
year类型
create table t7 (year year);
insert into t7 values(2003),(04),(53),(89),(90);
select * from t7;
+——+
| year |
+——+
| 2003 |
| 2004 |
| 2053 |
| 1989 |
| 1990 |
+——+

复制代码 代码如下:

— 表的结构 `test`

create table if not exists `test` (
  `id` int(11) not null auto_increment,
  `name` varchar(16) not null,
  `month` int(11) not null,
  `serial` int(11) not null,
  `other` varchar(20) not null,
  primary key (`id`)
) engine=myisam  default charset=utf8;

col score format 999999999999.99

datetime和timestamp类型
timestamp 时间戳类型,输入null,展现当前时刻。datetime则会凸显null
datetime 倘诺name改换,时间不转移。譬喻:QQ的报名时间
timestamp 假设name改动,时间会变动成未来日子。譬如:提醒上次登入时间
values(now()) now()函数,当前时间函数,申请帐号时能够接触。

–方法1:select a.* from tb a where val = (select max(val) from tb
where name = a.name) order by a.name
–方法2:
select a.* from tb a where not exists(select 1 from tb where name =
a.name and val > a.val)
–方法3:
select a.* from tb a,(select name,max(val) val from tb group by name) b
where a.name = b.name and a.val = b.val order by a.name
–方法4:
select a.* from tb a inner join (select name , max(val) val from tb
group by name) b on a.name = b.name and a.val = b.val order by a.name
–方法5
select a.* from tb a where 1 > (select count(*) from tb where name
= a.name and val > a.val ) order by a.name
/*
name val memo

— 导出表中的数据 `test`

insert into `test` (`id`, `name`, `month`, `serial`,
`other`) values
(1, ‘a’, 200807, 2, ‘aaa1’),
(2, ‘a’, 200805, 2, ‘aaa2’),
(3, ‘b’, 200805, 3, ‘bbb3’),
(4, ‘b’, 200805, 4, ‘bbb4’),
(5, ‘a’, 200805, 1, ‘aaa5’),
(6, ‘c’, 200807, 5, ‘ccc6’),
(7, ‘b’, 200807, 8, ‘bbb7’),
(8, ‘c’, 200807, 3, ‘ccc8’),
(9, ‘a’, 200805, 6, ‘aaa9’);

查询
select * from (select * from test order by month desc,serial desc) t
group by name
得到
id     name     month     serial     other
1     a     200807     2     aaa1
7     b     200807     8     bbb7
6     c     200807     5     ccc6
换一下排序形式
select * from (select * from test order by month asc,serial desc) t
group by name
得到
id     name     month     serial     other
9     a     200805     6     aaa9
4     b     200805     4     bbb4
6     c     200807     5     ccc6
都按我们的渴求出示了结果

group by 先排序与分组同临时候接纳办法,上面看实例…

–A、GROUPING SETS

create table t8(f_datetime datetime,f_timestamp timestamp);
insert into t8 values(‘1999-11-11 11:11:11′,’2002-11-111:11:11’);
insert into t8 values(19991111111111,20021111111111);
insert into t8 values(now(),null);
select * from t8;
+———————+———————+
| f_datetime | f_timestamp |
+———————+———————+
| 1999-11-11 11:11:11 | 2002-11-11 11:11:11 |
| 1999-11-11 11:11:11 | 2002-11-11 11:11:11 |
| 2012-03-21 21:05:21 | 2012-03-21 21:05:21 |
+———————+———————+
ENUM和SET类型
create table t10(sex ENUM(‘M’,’F’));
insert into t10 values(‘M’),(‘m’),(‘F’),(‘aa’),(null);
select * from t10;
+——+
| sex |
+——+
| M |
| M |
| F |
| |
| NULL |
+——+
create table t11 (type SET(‘a’,’b’,’c’,’d’,’e’));
insert into t11 values(a);
insert into t11 values(‘b,c’);
insert into t11 values(‘J’);
select * from t11;
+——+
| type |
+——+
| a |
| b,c |
| |
+——+
insert into t11 values(‘b,c,e,f’);既有法定字符又有不合法字符
select * from t11;
+——-+
| type |
+——-+
| a |
| b,c |
| |
| b,c,e |
+——-+


select id,area,stu_type,sum(score) score 
from students
group by grouping sets((id,area,stu_type),(id,area),id)
order by id,area,stu_type;

练习:
创建表test id name money sex hobby email qq shenfezheng jointime
create table test(id tinyint,name char(10),money float(10,2),sex
enum(‘M’,’F’),hobby set(‘a’,’b’,’c’),email varchar(50),qq
char(15),shenfenzheng char(18),jointime datetime);

a 3 a3:a的第多个值
b 5 b5b5b5b5b5

/*——–理解grouping sets
select a, b, c, sum( d ) from t
group by grouping sets ( a, b, c )

mysql> rename table test to newtest;
mysql> alter table test change id uid smallint;
mysql> alter table test modify id smallint;

*/

等效于


自个儿推荐使用1,3,4,结果展现1,3,4功用同样,2,5功能差些,不过小编3,4频率同样无庸置疑,1就不相同等了,想不搞了。

select * from (
select a, null, null, sum( d ) from t group by a
union all
select null, b, null, sum( d ) from t group by b 
union all
select null, null, c, sum( d ) from t group by c 
)
*/

修饰符(约束)
无符号 unsigned
用0补齐 zerofill

–二、按name分组取val最小的值所在行的数目。

–B、ROLLUP

desc t11;
+——-+————————–+——+—–+———+——-+
| Field | Type | Null | Key | Default | Extra |
+——-+————————–+——+—–+———+——-+
| type | set(‘a’,’b’,’c’,’d’,’e’) | YES | | NULL | |
+——-+————————–+——+—–+———+——-+

复制代码 代码如下:

select id,area,stu_type,sum(score) score 
from students
group by rollup(id,area,stu_type)
order by id,area,stu_type;

not null约束
create table t12 (id int,sex enum(‘M’,’W’) NOT NULL );
desc t12;
+——-+—————————+——+—–+———+——-+
| Field | Type | Null | Key | Default | Extra |
+——-+—————————+——+—–+———+——-+
| id | int(10) unsigned zerofill | YES | | NULL | |
| sex | enum(‘M’,’W’) | YES | | NULL | |
+——-+—————————+——+—–+———+——-+
insert into t12(id) values(1);
Query OK, 1 row affected (0.00 sec)
select * from t12;
+—+—–+
|id | sex |
+—+—–+
| 1 | NULL|
+—+—–+

–方法1:select a.* from tb a where val = (select min(val) from tb
where name = a.name) order by a.name
–方法2:
select a.* from tb a where not exists(select 1 from tb where name =
a.name and val < a.val)
–方法3:
select a.* from tb a,(select name,min(val) val from tb group by name) b
where a.name = b.name and a.val = b.val order by a.name
–方法4:
select a.* from tb a inner join (select name , min(val) val from tb
group by name) b on a.name = b.name and a.val = b.val order by a.name
–方法5
select a.* from tb a where 1 > (select count(*) from tb where name
= a.name and val < a.val) order by a.name
/*
name val memo

/*——–理解rollup
select a, b, c, sum( d )
from t
group by rollup(a, b, c);

DEFAULT约束
create table t13 (id int ,sex enum(‘M’,’W’) NOT NULL default ‘M’ );
desc t13;
+——-+—————+——+—–+———+——-+
| Field | Type | Null | Key | Default | Extra |
+——-+—————+——+—–+———+——-+
| id | int(11) | YES | | NULL | |
| sex | enum(‘M’,’W’) | YES | | M | |
+——-+—————+——+—–+———+——-+
insert into t13(id) values(3);
select * from t13;
+——+——+
| id | sex |
+——+——+
| 2 | M |
| 3 | M |
+——+——+


等效于

AUTO_INCREMENT修饰符自动拉长只适用于int字段 一般用于主键
三个表只可以有叁个
create table t14(id int auto_increment primary key,name char(10) not
ll);
desc t14
+——-+———-+——+—–+———+—————-+
| Field | Type | Null | Key | Default | Extra |
+——-+———-+——+—–+———+—————-+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | char(10) | NO | | NULL | |
+——-+———-+——+—–+———+—————-+
insert into t14(name) values(zhb);
insert into t14(name) values(‘haha’);
select * from t14;
+—-+——+
| id | name |
+—-+——+
| 1 | zhb |
| 2 | haha |
+—-+——+

a 1 a1–a的第三个值
b 1 b1–b的率先个值

select * from (
select a, b, c, sum( d ) from t group by a, b, c 
union all
select a, b, null, sum( d ) from t group by a, b
union all
select a, null, null, sum( d ) from t group by a
union all
select null, null, null, sum( d ) from t
)
*/

索引增多删除
show index from t20\G
show create table t20;

*/

–C、CUBE

drop index index_name on table_name;

–三、按name分组取第二回面世的行所在的数额。

select id,area,stu_type,sum(score) score 
from students
group by cube(id,area,stu_type)
order by id,area,stu_type;

create index index_name on table_name(列名);
alter table table_name add index(列名);

复制代码 代码如下:

/*——–理解cube
select a, b, c, sum( d ) from t
group by cube( a, b, c)

目录建构
create table t15(id int not null ,name char(10),index(id));
desc t15;
+——-+———-+——+—–+———+——-+
| Field | Type | Null | Key | Default | Extra |
+——-+———-+——+—–+———+——-+
| id | int(11) | NO | MUL | NULL | |
| name | char(10) | YES | | NULL | |
+——-+———-+——+—–+———+——-+
向已有表加多索引
create table t16(id int not null ,name char(10));
desc t16;
+——-+———-+——+—–+———+——-+
| Field | Type | Null | Key | Default | Extra |
+——-+———-+——+—–+———+——-+
| id | int(11) | NO | | NULL | |
| name | char(10) | YES | | NULL | |
+——-+———-+——+—–+———+——-+
create index id on t16 (id);
alter table t17 add index(id);

select a.* from tb a where val = (select top 1 val from tb where name =
a.name) order by a.name
/*
name val memo

等效于

desc t16;
+——-+———-+——+—–+———+——-+
| Field | Type | Null | Key | Default | Extra |
+——-+———-+——+—–+———+——-+
| id | int(11) | NO | MUL | NULL | |
| name | char(10) | YES | | NULL | |
+——-+———-+——+—–+———+——-+
剔除索引
drop index id on t16;
desc t16;
+——-+———-+——+—–+———+——-+
| Field | Type | Null | Key | Default | Extra |
+——-+———-+——+—–+———+——-+
| id | int(11) | NO | | NULL | |
| name | char(10) | YES | | NULL | |
+——-+———-+——+—–+———+——-+
查询索引
show index from t16;


select a, b, c, sum( d ) from t
group by grouping sets( 
( a, b, c ), 
( a, b ), ( a ), ( b, c ), 
( b ), ( a, c ), ( c ), 
() )
*/

UNIQUE索引(允许空值,null != null)

a 2 a2(a的第贰个值)
b 1 b1–b的第叁个值
*/

–D、GROUPING

create unique index id on table_name(id);

–四、按name分组随机取一条数据。

/*从上边的结果中我们很轻巧觉察,种种总计数据所对应的行都会并发null,
如何来区分到底是依据这个字段做的汇聚呢,grouping函数判定是还是不是合计列!*/

create table t17(id int ,name char(10),unique(id));
desc t17;
+——-+———-+——+—–+———+——-+
| Field | Type | Null | Key | Default | Extra |
+——-+———-+——+—–+———+——-+
| id | int(11) | YES | UNI | NULL | |
| name | char(10) | YES | | NULL | |
+——-+———-+——+—–+———+——-+
insert into t17 values(null,’zhb’);
select * from t17;
+——+——+
| id | name |
+——+——+
| NULL | zhb |
+——+——+

复制代码 代码如下:

select decode(grouping(id),1,’all id’,id) id,
decode(grouping(area),1,’all area’,to_char(area)) area,
decode(grouping(stu_type),1,’all_stu_type’,stu_type) stu_type,
sum(score) score
from students
group by cube(id,area,stu_type)
order by id,area,stu_type; 

P奇骏IMA奥迪Q5Y KEY(主键约束 值唯一 uniq和not null的整合 可效果多列
不可两列同偶然间一样,单列重复可以)

select a.* from tb a where val = (select top 1 val from tb where name =
a.name order by newid()) order by a.name/*
name val memo

–2、OVEENCORE()函数的利用
–1、RANK()、DENSE_RANK() 的、ROW_NUMBER()、CUME_DIST()、MAX()、AVG()

alter table t22 drop primary key;
alter table t22 add primary key(id);


break on id skip 1
select id,area,score from students order by id,area,score desc;

create table t18(id int,name char(10),primary key(id));
desc t18;
+——-+———-+——+—–+———+——-+
| Field | Type | Null | Key | Default | Extra |
+——-+———-+——+—–+———+——-+
| id | int(11) | NO | PRI | 0 | |
| name | char(10) | YES | | NULL | |
+——-+———-+——+—–+———+——-+
insert into t18 values(1,’zhb’);
select * from t18;
+—-+——+
| id | name |
+—-+——+
| 1 | zhb |
+—-+——+
insert into t18 values(1,’zhb’);
EOdysseyROXC90 1062 (23000): Duplicate entry ‘1’ for key ‘P凯雷德IMAOdysseyY’ 不容许再一次

a 1 a1–a的率先个值
b 5 b5b5b5b5b5

select id,rank() over(partition by id order by score desc) rk,score from students;

删除主键
mysql> alter table t19 drop primary key;
向已有表增添主键
mysql> alter table t19 add primary key(id);

*/

–允许并列排行、排名不间断
select id,dense_rank() over(partition by id order by score desc) rk,score from students;

在多少个列上建设构造主键,不可多次加上主键
create table t19(id int,name char(10),primary key(id,name));
desc t19;
+——-+———-+——+—–+———+——-+
| Field | Type | Null | Key | Default | Extra |
+——-+———-+——+—–+———+——-+
| id | int(11) | NO | PRI | 0 | |
| name | char(10) | NO | PRI | | |
+——-+———-+——+—–+———+——-+
insert into t19 values(1,’zhb’);
insert into t19 values(1,’zorro’);
select * from t19;
+—-+——-+
| id | name |
+—-+——-+
| 1 | zhb |
| 1 | zorro |
+—-+——-+

–五、按name分组取最小的多个(N个)val

–即使SCORE相同,ROW_NUMBE凯雷德()结果也是例外
select id,row_number() over(partition by ID order by SCORE desc) rn,score from students;

外键myisam引擎不协助只好用innodb引擎
create table dpmnt(id int not null,name char(10) not null,primary
key(id)) type = INNODB;
desc dpmnt;
+——-+———-+——+—–+———+——-+
| Field | Type | Null | Key | Default | Extra |
+——-+———-+——+—–+———+——-+
| id | int(11) | NO | PRI | NULL | |
| name | char(10) | NO | | NULL | |
+——-+———-+——+—–+———+——-+
创造外键
create table emp (id int not null, name char(10) not null,fk_dpmnt int
not null ,primary key(id),index (fk_dpmnt),foreign key (fk_dpmnt)
references dpmnt(id)) type=innodb;
desc emp;
+———-+———-+——+—–+———+——-+
| Field | Type | Null | Key | Default | Extra |
+———-+———-+——+—–+———+——-+
| id | int(11) | NO | PRI | NULL | |
| name | char(10) | NO | | NULL | |
| fk_dpmnt | int(11) | NO | MUL | NULL | |
+———-+———-+——+—–+———+——-+
insert into dpmnt values(1,hr);
insert into dpmnt values(2,’yw’);
insert into emp values(10,’zhb’,3);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key
constraint fails (db.emp, CONSTRAINT emp_ibfk_1 FOREIGN KEY
(fk_dpmnt) REFERENCES dpmnt (id))

复制代码 代码如下:

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图