GROUP BY + 字段,对该字段进行分组查询。MySQL查询语句是先执行GROUP BY再执行ORDER BY的。默认查询规则原生表默认排序下各自组别的第一条数据。还是理解不了?啥叫原生表默认排序?=>打开数据库表展示的结果就是原生表默认排序,可以理解成每条记录的创建时间。...
前情提示:
Mac OS10.14;
MySQL
8.0.18;localhost;这里插一句,
MySQL
高版本5.7以后,sql_mode有变化,其中之一体现为,
group
by写法。可查看文章了解:
远程centOS6.8final,
MySQL
5.6;
表结构,
数据
都是一样;
测试SQL语句:
SELECT SwipeID,MemberID,AddTime FROM
SELECT * FROM front_membercardswipe fmcs
ORDER
BY fmcs.AddTime AS
alter table user modify tel varchar(15) default ‘02087654321’;
修改tel列的位置,在第一列显示
alter table user modify tel varchar(15) default '02087654321' first;
修改tel列的位置,在指定列之后显示
alter table user modify tel varchar(15) default '02087654321' after age;
注意:alter modify不支持一次修改多个列,但是Oracle支持多列修改
但是
MySQL
可以通过多个modify的方式完成:
alter table user
modify tel varchar(15) default '02087654321' first,
modify name varchar(20) after tel;
11、 删除指定字段
alter table user drop photo;
12、 重命名表
数据
alter table user rename to users;
字段重命名
alter table users change name u_name varchar(10);
alter table users change sex u_sex varchar(10) after u_name;
如果需要改变列名建议使用change,如果需要改变
数据
类型和显示位置可以使用modify
13、 删除表
drop table users;
drop删除表会删除表结构,表对象将不存在
数据
中;
数据
也不会存在;表内的对象也不存在,如:索引、视图、约束;
truncate删除表
truncate都被当成DDL出来,truncate的作用就是删除该表里的全部
数据
,保留表结构。相当于DDL中的delete语句,
但是truncate比delete语句的速度要快得多。但是truncate不能带条件删除指定
数据
,只会删除所有的
数据
。如果删除的表有外键,
删除的速度类似于delete。但新版本的
MySQL
中truncate的速度比delete速度快。
MySQL
中约束保存在information_schema
数据
库的table_constraints中,可以通过该表
查询
约束信息;
约束主要完成对
数据
的检验,保证
数据
库
数据
的完整性;如果有相互依赖
数据
,保证该
数据
不被删除。
常用五类约束:
not null:非空约束,指定某列不为空
unique: 唯一约束,指定某列和几列组合的
数据
不能重复
primary key:主键约束,指定某列的
数据
不能重复、唯一
foreign key:外键,指定该列记录属于主表中的一条记录,参照另一条
数据
check:检查,指定一个表达式,用于检验指定
数据
MySQL
不支持check约束,但可以使用check约束,而没有任何效果;
根据约束
数据
列限制,约束可分为:
单列约束:每个约束只约束一列
多列约束:每个约束约束多列
数据
MySQL
中约束保存在information_schema
数据
库的table_constraints中,可以通过该表
查询
约束信息;
1、 not null约束
非空约束用于确保当前列的值不为空值,非空约束只能出现在表对象的列上。
Null类型特征:
所有的类型的值都可以是null,包括int、float等
数据
类型
空字符串“”是不等于null,0也不等于null
create table temp(
id int not null,
name varchar(255) not null default ‘abc’,
sex char null
上面的table加上了非空约束,也可以用alter来修改或增加非空约束
增加非空约束
alter table temp
modify sex varchar(2) not null;
取消非空约束
alter table temp modify sex varchar(2) null;
取消非空约束,增加
默认
值
alter table temp modify sex varchar(2) default ‘abc’ null;
2、 unique
唯一约束是指定table的列或列组合不能重复,保证
数据
的唯一性。虽然唯一约束不允许出现重复的值,但是可以为多个null
同一个表可以有多个唯一约束,多个列组合的约束。在创建唯一约束的时候,如果不给唯一约束名称,就
默认
和列名相同。
唯一约束不仅可以在一个表内创建,而且可以同时多表创建组合唯一约束。
MySQL
会给唯一约束的列上
默认
创建一个唯一索引;
create table temp (
id int not null,
name varchar(25),
password varchar(16),
--使用表级约束语法,
constraint uk_name_pwd unique(name, password)
表示用户名和密码组合不能重复
添加唯一约束
alter table temp add unique(name, password);
alter table temp modify name varchar(25) unique;
alter table temp drop index name;
3、 primary key
主键约束相当于唯一约束+非空约束的组合,主键约束列不允许重复,也不允许出现空值;如果的多列组合的主键约束,
那么这些列都不允许为空值,并且组合的值不允许重复。
每个表最多只允许一个主键,建立主键约束可以在列级别创建,也可以在表级别上创建。
MySQL
的主键名总是PRIMARY,
当创建主键约束时,系统
默认
会在所在的列和列组合上建立对应的唯一索引。
create table temp(
/*主键约束*/
id int primary key,
name varchar(25)
create table temp2(
id int not null,
name varchar(25),
pwd varchar(15),
constraint pk_temp_id primary key(id)
组合模式:
create table temp2(
id int not null,
name varchar(25),
pwd varchar(15),
constraint pk_temp_id primary key(name, pwd)
alter删除主键约束
alter table temp drop primary key;
alter添加主键
alter table temp add primary key(name, pwd);
alter修改列为主键
alter table temp modify id int primary key;
设置主键自增
create table temp(
id int auto_increment primary key,
name varchar(20),
pwd varchar(16)
auto_increment自增模式,设置自增后在插入
数据
的时候就不需要给该列插入值了。
4、 foreign key 约束
外键约束是保证一个或两个表之间的参照完整性,外键是构建于一个表的两个字段或是两个表的两个字段之间的参照关系。
也就是说从表的外键值必须在主表中能找到或者为空。
当主表的记录被从表参照时,主表的记录将不允许删除,如果要删除
数据
,需要先删除从表中依赖该记录的
数据
,
然后才可以删除主表的
数据
。还有一种就是级联删除子表
数据
。
注意:外键约束的参照列,在主表中引用的只能是主键或唯一键约束的列,假定引用的主表列不是唯一的记录,
那么从表引用的
数据
就不确定记录的位置。同一个表可以有多个外键约束。
创建外键约束:
create table classes(
id int auto_increment primary key,
name varchar(20)
create table student(
id int auto_increment,
name varchar(22),
constraint pk_id primary key(id),
classes_id int references classes(id)
通常先建主表,然后再建从表,这样从表的参照引用的表才存在。
表级别创建外键约束:
create table student(
id int auto_increment primary key,
name varchar(25),
classes_id int,
foreign key(classes_id) references classes(id)
上面的创建外键的方法没有指定约束名称,系统会
默认
给外键约束分配外键约束名称,命名为student_ibfk_n,
其中student是表名,n是当前约束从1开始的整数。
指定约束名称:
create table student(
id int auto_increment primary key,
name varchar(25),
classes_id int,
/*指定约束名称*/
constraint fk_classes_id foreign key(classes_id) references classes(id)
多列外键组合,必须用表级别约束语法:
create table classes(
id int,
name varchar(20),
number int,
primary key(name, number)
create table student(
id int auto_increment primary key,
name varchar(20),
classes_name varchar(20),
classes_number int,
/*表级别联合外键*/
foreign key(classes_name, classes_number) references classes(name, number)
删除外键约束:
alter table student drop foreign key student_ibfk_1;
alter table student drop foreign key fk_student_id;
增加外键约束
alter table student add foreign key(classes_name, classes_number) referencesclasses(name, number);
自引用、自关联(递归表、树状表)
create table tree(
id int auto_increment primary key,
name varchar(50),
parent_id int,
foreign key(parent_id) references tree(id)
级联删除:删除主表的
数据
时,关联的从表
数据
也删除,则需要在建立外键约束的后面增加on deletecascade
或on delete set null,前者是级联删除,后者是将从表的关联列的值设置为null。
create table student(
id int auto_increment primary key,
name varchar(20),
classes_name varchar(20),
classes_number int,
/*表级别联合外键*/
foreign key(classes_name, classes_number) references classes(name, number) on deletecascade
5、 check约束
MySQL
可以使用check约束,但check约束对
数据
验证没有任何作用。
create table temp(
id int auto_increment,
name varchar(20),
age int,
primary key(id),
/*check约束*/
check(age > 20)
上面check约束要求age必须大于0,但没有任何作用。但是创建table的时候没有任何错误或警告。
索引是存放在模式(schema)中的一个
数据
库对象,索引的作用就是提高对表的检索
查询
速度,
索引是通过快速访问的方法来进行快速定位
数据
,从而减少了对磁盘的读写操作。
索引是
数据
库的一个对象,它不能独立存在,必须对某个表对象进行依赖。
提示:索引保存在information_schema
数据
库里的STATISTICS表中。
创建索引方式:
自动:当表上定义主键约束、唯一、外键约束时,该表会被系统自动添加上索引。
手动:手动在相关表或列上增加索引,提高
查询
速度。
删除索引方式:
自动:当表对象被删除时,该表上的索引自动被删除
手动:手动删除指定表对象的相关列上的索引
索引类似于书籍的目录,可以快速定位到相关的
数据
,一个表可以有多个索引。
创建索引:
create index idx_temp_name on temp(name);
组合索引:
create index idx_temp_name$pwd on temp(name, pwd);
删除索引:
drop index idx_temp_name on temp;
视图就是一个表或多个表的
查询
结果,它是一张虚拟的表,因为它并不能存储
数据
。
视图的作用、优点:
限制对
数据
的访问
让复杂
查询
变得简单
提供
数据
的独立性
可以完成对相同
数据
的不同显示
创建、修改视图
create or replace view view_temp
select name, age from temp;
通常我们并不对视图的
数据
做修改操作,因为视图是一张虚拟的表,它并不存储实际
数据
。如果想让视图不被修改,可以用with check option来完成限制。
create or replace view view_temp
select * from temp
with check option;
修改视图:
alter view view_temp
select id, name from temp;
删除视图:
drop view view_temp;
显示创建语法:
show create view v_temp;
Ø DML语句
DML主要针对
数据
库表对象的
数据
而言的,一般DML完成:
插入新
数据
修改已添加的
数据
删除不需要的
数据
1、 insert into 插入语句
insert into temp values(null, ‘jack’, 25);
主键自增可以不插入,所以用null代替
insert into temp(name, age) values(‘jack’, 22);
在表面后面带括号,括号中写列名,values中写指定列名的值即可。当省略列名就表示插入全部
数据
,
注意插入值的顺序和列的顺序需要保持一致。
Set方式插入,也可以指定列
insert into temp set id = 7, name = 'jason';
MySQL
中外键的table的外键引用列可以插入
数据
可以为null,不参照主表的
数据
。
使用子
查询
插入
数据
insert into temp(name) select name from classes;
insert into temp values(null, ‘jack’, 22), (null, ‘jackson’ 23);
2、 update 修改语句
update主要完成对
数据
的修改操作,可以修改一条或多条
数据
。修改多条或指定条件的
数据
,需要用where条件来完成。
修改所有
数据
update temp set name = ‘jack2’;
所有的
数据
的name会被修改,如果修改多列用“,”分开
update temp set name = ‘jack’, age = 22;
修改指定条件的记录需要用where
update temp set name = ‘jack’ where age > 22;
3、 delete 删除语句
删除table中的
数据
,可以删除所有,带条件可以删除指定的记录。
删除所有
数据
delete from temp;
删除指定条件
数据
delete from temp where age > 20;
Ø select
查询
、function 函数
select
查询
语句用得最广泛、功能也最丰富。可以完成单条记录、多条记录、单表、多表、子
查询
等。
1、
查询
某张表所有
数据
select * from temp;
*代表所有列,temp代表表名,不带条件就
查询
所有
数据
2、
查询
指定列和条件的
数据
select name, age from temp where age = 22;
查询
name和age这两列,age 等于22的
数据
。
3、 对
查询
的
数据
进行运算操作
select age + 2, age / 2, age – 2, age * 2 from temp where age – 2 > 22;
4、 concat函数,字符串连接
select concat(name, ‘-eco’) from temp;
concat和null进行连接,会导致连接后的
数据
成为null
5、 as 对列重命名
select name as ‘名称’ from temp;
as也可以省略不写,效果一样
如果重命名的列名出现特殊字符,如“‘”单引号,那就需要用双引号引在外面
select name as “名’称” from temp;
6、 也可以给table去别名
select t.name Name from temp as t;
7、
查询
常量
类似于SQL Server
select 5 + 2;
select concat('a', 'bbb');
8、 distinct 去掉重复
数据
select distinct id from temp;
多列将是组合的重复
数据
select distinct id, age from temp;
9、 where 条件
查询
大于>、大于等于>=、小于<、小于等于<=、等于=、不等于<>
都可以出现在where语句中
select * from t where a > 2 or a >= 3 or a < 5 or a <= 6 or a = 7 or a <> 0;
10、 and 并且
select * from temp where age > 20 and name = ‘jack’;
查询
名称等于jack并且年龄大于20的
11、 or 或者
满足一个即可
select * from tmep where name = ‘jack’ or name = ‘jackson’;
12、 between v and v2
大于等于v且小于等于v2
select * form temp where age between 20 and 25;
13、 in
查询
可以多个条件 类似于or
select * from temp where id in (1, 2, 3);
查询
id在括号中出现的
数据
14、 like 模糊
查询
查询
name以j开头的
select * from temp where name like ‘j%’;
查询
name包含k的
select * from temp where name like ‘%k%’;
escape转义
select * from temp where name like ‘/_%’ escape ‘/’;
指定/为转义字符,上面的就可以
查询
name中包含“_”的
数据
15、 is null、is not null
查询
为null的
数据
select * from temp where name is null;
查询
不为null的
数据
select * from temp where name is not null;
16、 not
select * from temp where not (age > 20);
取小于等于20的
数据
select * from temp where id not in(1, 2);
17、
order
by
排序,有desc、asc升序、降序
select * from temp
order
by id;
默认
desc排序
select * from temp
order
by id asc;
select * from temp
order
by id, age;
Ø function 函数
函数的作用比较大,一般多用在select
查询
语句和where条件语句之后。按照函数返回的结果,
可以分为:多行函数和单行函数;所谓的单行函数就是将每条
数据
进行独立的计算,然后每条
数据
得到一条结果。
如:字符串函数;而多行函数,就是多条记录同时计算,得到最终只有一条结果记录。如:sum、avg等
多行函数也称为聚集函数、分组函数,主要用于完成一些统计功能。
MySQL
的单行函数有如下特征:
单行函数的参数可以是变量、常量或
数据
列。单行函数可以接受多个参数,但返回一个值。
单行函数就是它会对每一行单独起作用,每一行(可能包含多个参数)返回一个结果。
单行函数可以改变参数的
数据
类型。单行函数支持嵌套使用:内层函数的返回值是外层函数的参数。
单行函数可以分为:
类型转换函数;
流程控制语句;
加密解密函数;
1、 char_length字符长度
select char_length(tel) from user;
2、 sin函数
select sin(age) from user;
select sin(1.57);
3、 添加日期函数
select date_add('2010-06-21', interval 2 month);
interval是一个关键字,2 month是2个月的意思,2是数值,month是单位
select addDate('2011-05-28', 2);
在前面的日期上加上后面的天数
4、 获取当前系统时间、日期
select curdate();
select curtime();
5、 加密函数
select md5('zhangsan');
6、 Null 处理函数
select ifnull(birthday, 'is null birthday') from user;
如果birthday为null,就返回后面的字符串
select nullif(age, 245) from user;
如果age等于245就返回null,不等就返回age
select isnull(birthday) from user;
判断birthday是否为null
select if(isnull(birthday), 'birthday is null', 'birthday not is null') from user;
如果birthday为null或是0就返回birthday is null,否则就返回birthday not is null;类似于三目运算符
7、 case 流程函数
case函数是一个流程控制函数,可以接受多个参数,但最终只会返回一个结果。
select name,
(case sex
when 1 then '男'
when 0 then '女'
else '火星人'
) sex
from user;
组函数就是多行函数,组函数是完成一行或多行结果集的运算,最后返回一个结果,而不是每条记录返回一个结果。
1、 avg平均值运算
select avg(age) from user;
select avg(distinct age) from user;
2、 count 记录条数统计
select count(*), count(age), count(distinct age) from user;
3、 max 最大值
select max(age), max(distinct age) from user;
4、 min 最小值
select min(age), min(distinct age) from user;
5、 sum 求和、聚和
select sum(age), sum(distinct age) from user;
select sum(ifnull(age, 0)) from user;
6、
group
by 分组
select count(*), sex from user
group
by sex;
select count(*) from user
group
by age;
select * from user
group
by sex, age;
7、 having进行条件过滤
不能在where子句中过滤组,where子句仅用于过滤行。过滤
group
by需要having
不能在where子句中用组函数,having中才能用组函数
select count(*) from user
group
by sex having sex <> 2;
Ø 多表
查询
和子
查询
数据
库的
查询
功能最为丰富,很多时候需要用到
查询
完成一些事物,而且不是单纯的对一个表进行操作。而是对多个表进行联合
查询
,
MySQL
中多表连接
查询
有两种规范,较早的SQL92规范支持,如下几种表连接
查询
:
非等值连接
广义笛卡尔积
SQL99规则提供了可读性更好的多表连接语法,并提供了更多类型的连接
查询
,SQL99支持如下几种多表连接
查询
:
使用using子句的连接
使用on子句连接
全部连接或者左右外连接
SQL92的连接
查询
SQL92的连接
查询
语法比较简单,多将多个table放置在from关键字之后,多个table用“,”隔开;
连接的条件放在where条件之后,与
查询
条件直接用and逻辑运算符进行连接。如果条件中使用的是相等,
则称为等值连接,相反则称为非等值,如果没有任何条件则称为广义笛卡尔积。
广义笛卡尔积:select s.*, c.* from student s, classes c;
等值:select s.*, c.* from student s, classes c where s.cid = c.id;
非等值:select s.*, c.* from student s, classes c where s.cid <> c.id;
select s.*, c.name classes from classes c, student s where c.id = s.classes_id ands.name is not null;
SQL99连接
查询
1、交叉连接cross join,类似于SQL92的笛卡尔积
查询
,无需条件。如:
select s.*, c.name from student s cross join classes c;
2、自然连接 natural join
查询
,无需条件,
默认
条件是将2个table中的相同字段作为连接条件,如果没有相同字段,
查询
的结果就是空。
select s.*, c.name from student s natural join classes c;
3、using子句连接
查询
:using的子句可以是一列或多列,显示的指定两个表中同名列作为连接条件。
如果用natural join的连接
查询
,会把所有的相同字段作为连接
查询
。而using可以指定相同列及个数。
select s.*, c.name from student s join classes c using(id);
4、 join … on连接
查询
,
查询
条件在on中完成,每个on语句只能指定一个条件。
select s.*, c.name from student s join classes c on s.classes_id = c.id;
5、 左右外连接:3种外连接,left [outer] join、right [outer] join,连接条件都是通过用on子句来指定,条件可以等值、非等值。
select s.*, c.name from student s left join classes c on s.classes_id = c.id;
select s.*, c.name from student s right join classes c on s.classes_id = c.id;
子
查询
就是指在
查询
语句中嵌套另一个
查询
,子
查询
可以支持多层嵌套。子
查询
可以出现在2个位置:
from关键字之后,被当做一个表来进行
查询
,这种用法被称为行内视图,因为该子
查询
的实质就是一个临时视图
出现在where条件之后作为过滤条件的值
子
查询
注意点:
子
查询
用括号括起来,特别情况下需要起一个临时名称
子
查询
当做临时表时(在from之后的子
查询
),可以为该子
查询
起别名,尤其是要作为前缀来限定
数据
列名时
子
查询
用作过滤条件时,将子
查询
放在比较运算符的右边,提供可读性
子
查询
作为过滤条件时,单行子
查询
使用单行运算符,多行子
查询
用多行运算符
将from后面的子
查询
当做一个table来用:
select * from (select id, name from classes) s where s.id in (1, 2);
当做条件来用:
select * from student s where s.classes_id in (select id from classes);
select * from student s where s.classes_id = any (select id from classes);
select * from student s where s.classes_id > any (select id from classes);
Ø 操作符和函数
1、 boolean只判断
select 1 is true, 0 is false, null is unknown;
select 1 is not unknown, 0 is not unknown, null is not unknown;
2、 coalesce函数,返回第一个非null的值
select coalesce(null, 1);
select coalesce(1, 1);
select coalesce(null, 1);
select coalesce(null, null);
3、 当有2个或多个参数时,返回最大的那个参数值
select greatest(2, 3);
select greatest(2, 3, 1, 9, 55, 23);
select greatest('D', 'A', 'B');
4、 Least函数,返回最小值,如果有null就返回null值
select least(2, 0);
select least(2, 0, null);
select least(2, 10, 22.2, 35.1, 1.1);
5、 控制流函数
select case 1 when 1 then 'is 1' when 2 then 'is 2' else 'none' end;
select case when 1 > 2 then 'yes' else 'no' end;
6、 ascii字符串函数
select ascii('A');
select ascii('1');
7、 二进制函数
select bin(22);
8、 返回二进制字符串长度
select bit_length(11);
9、 char将值转换成字符,小数取整四舍五入
select char(65);
select char(65.4);
select char(65.5);
select char(65.6);
select char(65, 66, 67.4, 68.5, 69.6, '55.5', '97.3');
10、 using改变字符集
select charset(char(0*65)), charset(char(0*65 using utf8));
11、 得到字符长度char_length,character_length
select char_length('abc');
select character_length('eft');
12、 compress压缩字符串、uncompress解压缩
select compress('abcedf');
select uncompress(compress('abcedf'));
13、 concat_ws分隔字符串
select concat_ws('#', 'first', 'second', 'last');
select concat_ws('#', 'first', 'second', null, 'last');
Ø 事务处理
开始事务:start transaction
提交事务:commit
回滚事务:rollback
设置自动提交:set autocommit 1 | 0
atuoCommit系统
默认
是1立即提交模式;如果要手动控制事务,需要设置set autoCommit 0;
这样我们就可以用commit、rollback来控制事务了。
在一段语句块中禁用autocommit 而不是set autocommit
start transaction;
select @result := avg(age) from temp;
update temp set age = @result where id = 2;
select * from temp where id = 2;//值被改变
rollback;//回滚
select * from temp where id = 2;//变回来了
在此期间只有遇到commit、rollback,start Transaction的禁用autocommit才会结束。然后就恢复到原来的autocommit模式;
不能回滚的语句
有些语句不能被回滚。通常,这些语句包括
数据
定义语言(DDL)语句,比如创建或取消
数据
库的语句,
和创建、取消或更改表或存储的子程序的语句。
您在设计事务时,不应包含这类语句。如果您在事务的前部中发布了一个不能被回滚的语句,
则后部的其它语句会发生错误,在这些情况下,通过发布ROLLBACK语句不能 回滚事务的全部效果。
一些操作也会隐式的提交事务
如alter、create、drop、rename table、lock table、set autocommit、starttransaction、truncate table 等等,
在事务中出现这些语句也会提交事务的
事务不能嵌套事务
事务的保存点
Savepoint pointName/Rollback to savepoint pointName
一个事务可以设置多个保存点,rollback可以回滚到指定的保存点,恢复保存点后面的操作。
如果有后面的保存点和前面的同名,则删除前面的保存点。
Release savepoint会删除一个保存点,如果在一段事务中执行commit或rollback,则事务结束,所以保存点删除。
Set Transaction设计
数据
库隔离级别
SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL
{ READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE }
本语句用于设置事务隔离等级,用于下一个事务,或者用于当前会话。
在
默认
情况下,SET TRANSACTION会为下一个事务(还未开始)设置隔离等级。
如果您使用GLOBAL关键词,则语句会设置全局性的
默认
事务等级,
用于从该点以后创建的所有新连接。原有的连接不受影响。使用SESSION关键测可以设置
默认
事务等级,
用于对当前连接执行的所有将来事务。
默认
的等级是REPEATABLE READ全局隔离等级。
select 1+1; # 单行注释
select 1+1; -- 单行注释
select 1 /* 多行注释 */ + 1;
Ø 基本
数据
类型操作
select 'hello', '"hello"', '""hello""', 'hel''lo', '/'hello';
select "hello", "'hello'", "''hello''", "hel""lo", "/"hello";
select 'This/nIs/nFour/nLines';
select 'hello / world!';
select 'hello /world!';
select 'hello // world!';
select 'hello /' world!';
Ø 设置
数据
库mode模式
SET sql_mode='ANSI_QUOTES';
create table t(a int);
create table "tt"(a int);
create table "t""t"(a int);
craate talbe tab("a""b" int);
Ø 用户变量
set @num1 = 0, @num2 = 2, @result = 0;
select @result := (@num1 := 5) + @num2 := 3, @num1, @num2, @result;
Ø 存储过程
创建存储过程:
delimiter //
create procedure get(out result int)
begin
select max(age) into result from temp;
end//
调用存储过程:
call get(@temp);
查询
结果:
select @temp;
删除存储过程:
drop procedure get;
查看存储过程创建语句:
show create procedure get;
select…into 可以完成单行记录的赋值:
create procedure getRecord(sid int)
begin
declare v_name varchar(20) default 'jason';
declare v_age int;
declare v_sex bit;
select name, age, sex into v_name, v_age, v_sex from temp where id = sid;
select v_name, v_age, v_sex;
call getRecord(1);
函数类似于存储过程,只是调用方式不同
例如:select max(age) from temp;
创建函数:
create function addAge(age int) returns int
return age + 5;
使用函数:
select addAge(age) from temp;
删除函数:
drop function if exists addAge;
drop function addAge;
显示创建语法:
show create function addAge;
声明游标:declare cur_Name cursor for select name from temp;
打开游标:open cur_Name;
Fetch游标:fetch cur_Name into @temp;
关闭游标:close cur_Name;
CREATE PROCEDURE cur_show()
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE v_id, v_age INT;
DECLARE v_name varchar(20);
DECLARE cur_temp CURSOR FOR SELECT id, name, age FROM temp;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
OPEN cur_temp;
REPEAT
FETCH cur_temp INTO v_id, v_name, v_age;
IF NOT done THEN
IF isnull(v_name) THEN
update temp set name = concat('test-json', v_id) where id = v_id;
ELSEIF isnull(v_age) THEN
update temp set age = 22 where id = v_id;
END IF;
END IF;
UNTIL done END REPEAT;
CLOSE cur_temp;
Ø 触发器
触发器分为insert、update、delete三种触发器事件类型
还有after、before触发时间
创建触发器:
create trigger trg_temp_ins
before insert
on temp for each row
begin
insert into temp_log values(NEW.id, NEW.name);
end//
删除触发器:
drop trigger trg_temp_ins
查询
数据
指从
数据
库中获取所需要的
数据
。
查询
数据
是
数据
库操作中最常用,也是最重要的操作。用户可以根据自己对
数据
的需求,使用不同的
查询
方式。通过不同的
查询
方式,可以获得不同的
数据
。
MySQL
中是使用SELECT语句来
查询
数据
的。在这一章中将讲解的内容包括。
1、
查询
语句的基本语法
2、在单表上
查询
数据
3、使用聚合函数
查询
数据
4、多表上联合
查询
5、子
查询
6、合并
查询
结果
7、为表和字段取别名
8、使用正则表达式
查询
什么是
查询
?
怎么查的?
数据
的准备如下:
[sql] view plain copy
create table STUDENT(
STU_ID int primary KEY,
STU_NAME char(10) not null,
STU_AGE smallint unsigned not null,
STU_SEX char(2) not null
insert into STUDENT values(2001,'小王',13,'男');
insert into STUDENT values(2002,'明明',12,'男');
insert into STUDENT values(2003,'红红',14,'女');
insert into STUDENT values(2004,'小花',13,'女');
insert into STUDENT values(2005,'天儿',15,'男');
insert into STUDENT values(2006,'阿猎',13,'女');
insert into STUDENT values(2007,'阿猫',16,'男');
insert into STUDENT values(2008,'阿狗',17,'男');
insert into STUDENT values(2009,'黑子',14,'男');
insert into STUDENT values(2010,'小玉',13,'女');
insert into STUDENT values(2011,'头头',13,'女');
insert into STUDENT values(2012,'冰冰',14,'女');
insert into STUDENT values(2013,'美丽',13,'女');
insert into STUDENT values(2014,'神乐',12,'男');
insert into STUDENT values(2015,'天五',13,'男');
insert into STUDENT values(2016,'小三',11,'男');
insert into STUDENT values(2017,'阿张',13,'男');
insert into STUDENT values(2018,'阿杰',13,'男');
insert into STUDENT values(2019,'阿宝',13,'女');
insert into STUDENT values(2020,'大王',14,'男');
然后这是学生成绩表,其中定义了外键约束
[sql] view plain copy
create table GRADE(
STU_ID INT NOT NULL,
STU_SCORE INT,
foreign key(STU_ID) references STUDENT(STU_ID)
insert into GRADE values(2001,90);
insert into GRADE values(2002,89);
insert into GRADE values(2003,67);
insert into GRADE values(2004,78);
insert into GRADE values(2005,89);
insert into GRADE values(2006,78);
insert into GRADE values(2007,99);
insert into GRADE values(2008,87);
insert into GRADE values(2009,70);
insert into GRADE values(2010,71);
insert into GRADE values(2011,56);
insert into GRADE values(2012,85);
insert into GRADE values(2013,65);
insert into GRADE values(2014,66);
insert into GRADE values(2015,77);
insert into GRADE values(2016,79);
insert into GRADE values(2017,82);
insert into GRADE values(2018,88);
insert into GRADE values(2019,NULL);
insert into GRADE values(2020,NULL);
一、
查询
语句的基本语法
查询
数据
是指从
数据
库中的
数据
表或视图中获取所需要的
数据
,在
mysql
中,可以使用SELECT语句来
查询
数据
。根据
查询
条件的不同,
数据
库系统会找到不同的
数据
。
SELECT语句的基本语法格式如下:
[sql] view plain copy
SELECT 属性列表
FROM 表名或视图列表
[WHERE 条件表达式1]
[
GROUP
BY 属性名1 [HAVING 条件表达式2]]
[
ORDER
BY 属性名2 [ASC|DESC]]
属性列表:表示需要
查询
的字段名。
表名或视图列表:表示即将进行
数据
查询
的
数据
表或者视图,表或视图可以有多个。
条件表达式1:设置
查询
的条件。
属性名1:表示按该字段中的
数据
进行分组。
条件表达式2:表示满足该表达式的
数据
才能输出。
属性2:表示按该字段中的
数据
进行排序,排序方式由ASC或DESC参数指定。
ASC:表示按升序的顺序进行排序。即表示值按照从小到大的顺序排列。这是
默认
参数。
DESC:表示按降序的顺序进行排序。即表示值按照从大到小的顺序排列。
如果有WHERE子句,就按照“条件表达式1”指定的条件进行
查询
;如果没有WHERE子句,就
查询
所有记录。
如果有
GROUP
BY子句,就按照“属性名1”指定的字段进行分组;如果
GROUP
BY子句后面带着HAVING关键字,那么只有满足“条件表达式2”中指定的条件的记录才能够输出。
GROUP
BY子句通常和COUNT()、SUM()等聚合函数一起使用。
如果有
ORDER
BY子句,就按照“属性名2”指定的字段进行排序。排序方式由ASC或DESC参数指定。
默认
的排序方式为ASC。
二、在单表上
查询
数据
2.1、
查询
所有字段
[sql] view plain copy
select * from STUDENT;
2.2、按条件
查询
(1) 比较运算符
> , < ,= , != (),>= , 13;
in(v1,v2..vn) ,符合v1,v2,,,vn才能被查出
IN关键字可以判断某个字段的值是否在指定的集合中。如果字段的值在集合中,则满足
查询
条件,该纪录将被
查询
出来。如果不在集合中,则不满足
查询
条件。其语法规则如下:[ NOT ] IN ( 元素1, 元素2, …, 元素n )
[sql] view plain copy
select * from STUDENT where STU_AGE in(11,12);
between v1 and v2 在v1至v2之间(包含v1,v2)
BETWEEN AND关键字可以判读某个字段的值是否在指定的范围内。如果字段的值在指定范围内,则满足
查询
条件,该纪录将被
查询
出来。如果不在指定范围内,则不满足
查询
条件。其语法规则如下:
[ NOT ] BETWEEN 取值1 AND 取值2
[sql] view plain copy
select * from STUDENT where STU_AGE between 13 and 15;
or ( || ) 逻辑或
OR关键字也可以用来联合多个条件进行
查询
,但是与AND关键字不同。使用OR关键字时,只要满足这几个
查询
条件的其中一个,这样的记录将会被
查询
出来。如果不满足这些
查询
条件中的任何一个,这样的记录将被排除掉。OR关键字的语法规则如下:
条件表达式1 OR 条件表达式2 [ …OR 条件表达式n ]
其中,OR可以用来连接两个条件表达式。而且,可以同时使用多个OR关键字,这样可以连接更多的条件表达式。
[sql] view plain copy
select * from STUDENT where STU_ID2015;
and ( && ) 逻辑与
AND关键字可以用来联合多个条件进行
查询
。使用AND关键字时,只有同时满足所有
查询
条件的记录会被
查询
出来。如果不满足这些
查询
条件的其中一个,这样的记录将被排除掉。AND关键字的语法规则如下:
条件表达式1 AND 条件表达式2 [ … AND 条件表达式n ]
其中,AND可以连接两个条件表达式。而且,可以同时使用多个AND关键字,这样可以连接更多的条件表达式。
(3)模糊
查询
like 像
LIKE关键字可以匹配字符串是否相等。如果字段的值与指定的字符串相匹配,则满足
查询
条件,该纪录将被
查询
出来。如果与指定的字符串不匹配,则不满足
查询
条件。其语法规则如下:[ NOT ] LIKE '字符串'
“NOT”可选参数,加上 NOT表示与指定的字符串不匹配时满足条件;“字符串”表示指定用来匹配的字符串,该字符串必须加单引号或双引号。
% 任意字符
[sql] view plain copy
select * from STUDENT where STU_NAME LIKE '%王';
表示匹配任何以王结尾的
[sql] view plain copy
select * from STUDENT where STU_NAME LIKE '阿%';
表示匹配任何以阿开头的
_ 单个字符
比如说插入
[sql] view plain copy
insert into STUDENT values(2021,'天下无镜',14,'男');
[sql] view plain copy
select * from STUDENT where STU_NAME LIKE '_下_';
查询
的结果为空
但是如果下后面加两个_符号
[sql] view plain copy
select * from STUDENT where STU_NAME LIKE '_下__';
查询
结果不为空
“字符串”参数的值可以是一个完整的字符串,也可以是包含百分号(%)或者下划线(_)的通配字符。二者有很大区别
“%”可以代表任意长度的字符串,长度可以为0;
“_”只能表示单个字符。
如果要匹配姓张且名字只有两个字的人的记录,“张”字后面必须要有两个“_”符号。因为一个汉字是两个字符,而一个“_”符号只能代表一个字符。
(4)空值
查询
IS NULL关键字可以用来判断字段的值是否为空值(NULL)。如果字段的值是空值,则满足
查询
条件,该记录将被
查询
出来。如果字段的值不是空值,则不满足
查询
条件。其语法规则如下:
IS [ NOT ] NULL
其中,“NOT”是可选参数,加上NOT表示字段不是空值时满足条件。
IS NULL是一个整体,不能将IS换成”=”.
三、使用聚合函数
查询
数据
3.1、
group
by 分组
[sql] view plain copy
select * from STUDENT
group
by STU_SEX;
不加条件,那么就只取每个分组的
第一条
。
如果想看分组的内容,可以加groub_concat
[sql] view plain copy
select STU_SEX,
group
_concat(STU_NAME) from STUDENT
group
by STU_SEX;
3.2、一般情况下
group
需与统计函数(聚合函数)一起使用才有意义
先准备一些
数据
:
[sql] view plain copy
create table EMPLOYEES(
EMP_NAME CHAR(10) NOT NULL,
EMP_SALARY INT unsigned NOT NULL,
EMP_DEP CHAR(10) NOT NULL
insert into EMPLOYEES values('小王',5000,'销售部');
insert into EMPLOYEES values('阿小王',6000,'销售部');
insert into EMPLOYEES values('工是不',7000,'销售部');
insert into EMPLOYEES values('人人乐',3000,'资源部');
insert into EMPLOYEES values('满头大',4000,'资源部');
insert into EMPLOYEES values('天生一家',5500,'资源部');
insert into EMPLOYEES values('小花',14500,'资源部');
insert into EMPLOYEES values('大玉',15000,'研发部');
insert into EMPLOYEES values('条条',12000,'研发部');
insert into EMPLOYEES values('笨笨',13000,'研发部');
insert into EMPLOYEES values('我是天才',15000,'研发部');
insert into EMPLOYEES values('无语了',6000,'审计部');
insert into EMPLOYEES values('什么人',5000,'审计部');
insert into EMPLOYEES values('不知道',4000,'审计部');
mysql
中的五种统计函数:
(1)max:求最大值
求每个部门的最高工资:
[sql] view plain copy
select EMP_NAME,EMP_DEP,max(EMP_SALARY) from EMPLOYEES
group
by EMP_DEP;
(2)min:求最小值
求每个部门的最仰工资:
[sql] view plain copy
select EMP_NAME,EMP_DEP,min(EMP_SALARY) from EMPLOYEES
group
by EMP_DEP;
(3)sum:求总数和
求每个部门的工资总和:
[sql] view plain copy
select EMP_DEP,sum(EMP_SALARY) from EMPLOYEES
group
by EMP_DEP
(4)avg:求平均值
求每个部门的工资平均值
[sql] view plain copy
select EMP_DEP,avg(EMP_SALARY) from EMPLOYEES
group
by EMP_DEP;
(5)count:求总行数
求每个部门工资大于一定金额的人数
[sql] view plain copy
select EMP_DEP,count(*) from EMPLOYEES where EMP_SALARY>=500
group
by EMP_DEP;
3.3、带条件的groub by 字段 having,利用HAVING语句过滤分组
数据
having 子句的作用是筛选满足条件的组,即在分组之后过滤
数据
,条件中经常包含聚组函数,使用having 条件显示特定的组,也可以使用多个分组标准进行分组。
having 子句被限制子已经在SELECT语句中定义的列和聚合表达式上。通常,你需要通过在HAVING子句中重复聚合函数表达式来引用聚合值,就如你在SELECT语句中做的那样。
[sql] view plain copy
select EMP_DEP,avg(EMP_SALARY),
group
_concat(EMP_NAME)from EMPLOYEES
group
by EMP_DEP HAVING avg(EMP_SALARY) >=6000;
查找平均工资大于6000的部门,并把部门里的人全部列出来
四、多表上联合
查询
多表上联合
查询
分为内连接
查询
和外连接
查询
(1)隐式内连接
查询
[sql] view plain copy
select STUDENT.STU_ID,STUDENT.STU_NAME,STUDENT.STU_AGE,STUDENT.STU_SEX,GRADE.STU_SCORE from STUDENT,GRADE WHERE STUDENT.STU_ID=GRADE.STU_ID AND GRADE.STU_SCORE >=90;
查找大于90分的学生信息:
(2)显式内连接
查询
[sql] view plain copy
select STUDENT.STU_ID,STUDENT.STU_NAME,STUDENT.STU_AGE,STUDENT.STU_SEX,GRADE.STU_SCORE from STUDENT inner join GRADE on STUDENT.STU_ID=GRADE.STU_ID AND GRADE.STU_SCORE >=90;
用法:select .... from 表1 inner join 表2 on 条件表达式
(3)外连接
查询
left join.左连接
查询
。
用法 :select .... from 表1 left join 表2 on 条件表达式
意思是表1查出来的
数据
不能为null,但是其对应表2的
数据
可以为null
[sql] view plain copy
select STUDENT.STU_ID,STUDENT.STU_NAME,STUDENT.STU_AGE,STUDENT.STU_SEX,GRADE.STU_SCORE from STUDENT left join GRADE on STUDENT.STU_ID=GRADE.STU_ID;
right join就是相反的了,用法相同
用left join的时候,left join操作符左侧表里的信息都会被
查询
出来,右侧表里没有的记录会填空(NULL).right join亦然;inner join的时候则只有条件合适的才会显示出来
full join()
完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的
数据
仅当至少有一个同属于两表的行符合联接条件时,内联接才返回行。内联接消除与另一个表中的任何行不匹配的行。而外联接会返回 FROM 子句中提到的至少一个表或
视图的所有行,只要这些行符合任何 WHERE 或 HAVING 搜索条件。将检索通过左向外联接引用的左表的所有行,以及通过右向外联接引用的右表的所有行。完整外
部联接中两个表的所有行都将返回。
五、子
查询
以一个
查询
select的结果作为另一个
查询
的条件
语法:select * from 表1 wher 条件1(select ..from 表2 where 条件2)
1、与In结合
[sql] view plain copy
select * from STUDENT where STU_ID IN(select STU_ID from GRADE where STU_SCORE>85);
查找大于85分的学生信息
2、与EXISTS结合
EXISTS和NOT EXISTS操作符只测试某个子
查询
是否返回了
数据
行。如果是,EXISTS将是true,NOT EXISTS将是false。
[sql] view plain copy
select * from STUDENT where EXISTS (select STU_ID from GRADE where STU_SCORE>=100);
如果有学生成绩大于100,才
查询
所有的学生信息
3、ALL、ANY和SOME子
查询
any和all的操作符常见用法是结合一个相对比较操作符对一个
数据
列子
查询
的结果进行测试。它们测试比较值是否与子
查询
所返回的全部或一部分值匹配。比方说,如果比较值小于或等于子
查询
所返回的每一个值,<=all将是true,只要比较值小于或等于子
查询
所返回的任何一个值,<=any将是true。some是any的一个同义词。
[sql] view plain copy
select STU_ID from GRADE where STU_SCORE = any (select STU_ID from GRADE where STU_SCORE 80
order
by STU_SCORE;
默认
是按升序的,
也可以这么写
[sql] view plain copy
select * from GRADE where STU_SCORE >80
order
by STU_SCORE ASC;
结果如下:
如果想换成降序的:
[sql] view plain copy
select * from GRADE where STU_SCORE >80
order
by STU_SCORE desc;
7.2、limit
limit [offset,] N
offset 偏移量,可选,不写则相当于limit 0,N
N 取出条目
取分数最高的前5条
[sql] view plain copy
select * from GRADE
order
by STU_SCORE desc limit 5;
取分数最低的前5条
[sql] view plain copy
select * from GRADE
order
by STU_SCORE asc limit 5;
取分数排名在10-15之间的5条
[sql] view plain copy
select * from GRADE
order
by STU_SCORE desc limit 10,5
九、使用正则表达式
查询
正则表达式是用某种模式去匹配一类字符串的一个方式。例如,使用正则表达式可以
查询
出包含A、B、C其中任一字母的字符串。正则表达式的
查询
能力比通配字符的
查询
能力更强大,而且更加的灵活。正则表达式可以应用于非常复杂
查询
。
MySQL
中,使用REGEXP关键字来匹配
查询
正则表达式。其基本形式如下:
属性名 REGEXP '匹配方式'
在使用前先插入一些
数据
:
[sql] view plain copy
insert into STUDENT values(2022,'12wef',13,'男');
insert into STUDENT values(2023,'faf_23',13,'男');
insert into STUDENT values(2024,'fafa',13,'女');
insert into STUDENT values(2025,'ooop',14,'男');
insert into STUDENT values(2026,'23oop',14,'男');
insert into STUDENT values(2027,'woop89',14,'男');
insert into STUDENT values(2028,'abcdd',11,'男');
(1)使用字符“^”可以匹配以特定字符或字符串开头的记录。
查询
所有以阿头的
[sql] view plain copy
select * from STUDENT where STU_NAME REGEXP '^阿';
以数字开头
[sql] view plain copy
select * from STUDENT where STU_NAME REGEXP '^[0-9]';
(2)使用字符“$”可以匹配以特定字符或字符串结尾的记录
以数字结尾
[sql] view plain copy
select * from STUDENT where STU_NAME REGEXP '[0-9]$';
(3)用正则表达式来
查询
时,可以用“.”来替代字符串中的任意一个字符。
[sql] view plain copy
select * from STUDENT where STU_NAME REGEXP '^w....[0-9]$';
以w开头,以数字结束,中间有4个
(4)使用方括号([])可以将需要
查询
字符组成一个字符集。只要记录中包含方括号中的任意字符,该记录将会被
查询
出来。
例如,通过“[abc]”可以
查询
包含a、b、c这三个字母中任何一个的记录。
使用方括号可以指定集合的区间。
“[a-z]”表示从a-z的所有字母;
“[0-9]”表示从0-9的所有数字;
“[a-z0-9]”表示包含所有的小写字母和数字。
“[a-zA-Z]”表示匹配所有字母。
[sql] view plain copy
select * from STUDENT where STU_NAME REGEXP '[0-9a-z]';
查询
所有包含有数字和小写字母的
使用“[^字符集合]”可以匹配指定字符以外的字符
(5){}表示出现的次数
正则表达式中,“字符串{M}”表示字符串连续出现M次;“字符串{M,N}”表示字符串联连续出现至少M次,最多N次。例如,“ab{2}”表示字符串“ab”连续出现两次。“ab{2,4}”表示字符串“ab”连续出现至少两次,最多四次。
o出现2次
[sql] view plain copy
select * from STUDENT where STU_NAME REGEXP 'o{2}';
(6)+表示到少出现一次
fa至少出现一次
[sql] view plain copy
select * from STUDENT where STU_NAME REGEXP '(fa)+';
正则表达式可以匹配字符串。当表中的记录包含这个字符串时,就可以将该记录
查询
出来。如果指定多个字符串时,需要用符号“|”隔开。只要匹配这些字符串中的任意一个即可。每个字符串与”|”之间不能有空格。因为,
查询
过程中,
数据
库系统会将空格也当作一个字符。这样就
查询
不出想要的结果。
正则表达式中,“*”和“+”都可以匹配多个该符号之前的字符。但是,“+”至少表示一个字符,而“*”可以表示零个字符。
1.表中有id和name 两个字段,
查询
出name重复的所有
数据
select * from xi a where (a.username) in (select username from xi
group
by username having count(*) > 1)
2、
查询
出所有
数据
进行分组之后,和重复
数据
的重复次数的
查询
数据
,先列下:
select count(username) as '重复次数',username from xi
group
by username having count(*)>1
order
by userna
考虑这样一个情景:比如你每天下班要打卡,不打卡就会扣钱,因此不管加不加班,你每天六点都先打一次卡,如果加班就得下班在打一次卡。考勤系统统计上班时长时怎么取你最后打卡时间那条记录呢?
比如有这样一个表记录着员工的上下班打卡时间
我们SELECT * FROM work_time a WHERE deleted=0
GROUP
BY a.name,a.user_id
......
mysql
同一字段使用
group
by 后实现
order
by 取值
众所周知
group
by 和
order
by 一起使用时,会先使用
group
by 分组,
group
by
默认
取
第一条
记录(
mysql
默认
升序),而后面的
order
by 排序是
group
by执行之后的排序结果,所以如果只使用groub by 并不能获取最新的
数据
。
网上常见的解决方案是通过子
查询
,先进行
order
by desc, 然后
group
by 获取的
第一条
就是最新的.
后来,我发现了还有一种比较懒的写法
SELEC
MYSQL
常用命令
1.导出整个
数据
库
mysql
dump -u 用户名 -p --default-character-set=latin1
数据
库名 > 导出的文件名(
数据
库
默认
编码是latin1)
mysql
dump -u wcnc -p smgp_apps_wcnc > wcnc.sql
2.导出一个表
mysql
dump -u 用户名 -p
数据
库名 表名> 导出的文件名
mysql
dump -u wcnc -p smgp_apps_wcnc users> wcnc_users.sql
3.导出一个
数据
库结构
mysql
dump -u wcnc -p -d –add-drop-table smgp_apps_wcnc >d:wcnc_db.sql
-d 没有
数据
–add-drop-table 在每个create语句之前增加一个drop table
4.导入
数据
库
A:常用source 命令
进入
mysql
数据
库控制台,
如
mysql
-u root -p
mysql
>use
数据
库
然后使用source命令,后面参数为脚本文件(如这里用到的.sql)
mysql
>source wcnc_db.sql
B:使用
mysql
dump命令
mysql
dump -u username -p dbname < filename.sql
C:使用
mysql
命令
mysql
-u username -p -D dbname
2、退出
MySQL
:quit或exit
二、库操作
1、、创建
数据
库
命令:create database
例如:建立一个名为xhkdb的
数据
库
mysql
> create database xhkdb;
2、显示所有的
数据
库
命令:show databases (注意:最后有个s)
mysql
> show databases;
3、删除
数据
库
命令:drop database
例如:删除名为 xhkdb的
数据
库
mysql
> drop database xhkdb;
4、连接
数据
库
命令: use
例如:如果xhkdb
数据
库存在,尝试存取它:
mysql
> use xhkdb;
屏幕提示:Database changed
5、查看当前使用的
数据
库
mysql
> select database();
6、当前
数据
库包含的表信息:
mysql
> show tables; (注意:最后有个s)
三、表操作,操作之前应连接某个
数据
库
命令:create table ( [,.. ]);
mysql
> create table MyClass(
> id int(4) not null primary key auto_increment,
> name char(20) not null,
> sex int(4) not null default '0',
> degree double(16,2));
2、获取表结构
命令: desc 表名,或者show columns from 表名
mysql
>DESCRIBE MyClass
mysql
> desc MyClass;
mysql
> show columns from MyClass;
3、删除表
命令:drop table
例如:删除表名为 MyClass 的表
mysql
> drop table MyClass;
4、插入
数据
命令:insert into [( [,.. ])] values ( 值1 )[, ( 值n )]
例如,往表 MyClass中插入二条记录, 这二条记录表示:编号为1的名为Tom的成绩为96.45, 编号为2 的名为Joan 的成绩为82.99,编号为3 的名为Wang 的成绩为96.5.
mysql
> insert into MyClass values(1,'Tom',96.45),(2,'Joan',82.99), (2,'Wang', 96.59);
5、
查询
表中的
数据
1)、
查询
所有行
命令: select from where
例如:查看表 MyClass 中所有
数据
mysql
> select * from MyClass;
2)、
查询
前几行
数据
例如:查看表 MyClass 中前2行
数据
mysql
> select * from MyClass
order
by id limit 0,2;
mysql
> select * from MyClass limit 0,2;
6、删除表中
数据
命令:delete from 表名 where 表达式
例如:删除表 MyClass中编号为1 的记录
mysql
> delete from MyClass where id=1;
7、修改表中
数据
:update 表名 set 字段=新值,… where 条件
mysql
> update MyClass set name='Mary' where id=1;
7、在表中增加字段:
命令:alter table 表名 add字段 类型 其他;
例如:在表MyClass中添加了一个字段passtest,类型为int(4),
默认
值为0
mysql
> alter table MyClass add passtest int(4) default '0'
8、更改表名:
命令:rename table 原表名 to 新表名;
例如:在表MyClass名字更改为YouClass
mysql
> rename table MyClass to YouClass;
更新字段内容
update 表名 set 字段名 = 新内容
update 表名 set 字段名 = replace(字段名,'旧内容','新内容');
文章前面加入4个空格
update article set content=concat(' ',content);
1.INT[(M)] 型: 正常大小整数类型
2.DOUBLE[(M,D)] [ZEROFILL] 型: 正常大小(双精密)浮点数字类型
3.DATE 日期类型:支持的范围是1000-01-01到9999-12-31。
MySQL
以YYYY-MM-DD格式来显示DATE值,但是允许你使用字符串或数字把值赋给DATE列
4.CHAR(M) 型:定长字符串类型,当存储时,总是是用空格填满右边到指定的长度
5.BLOB TEXT类型,最大长度为65535(2^16-1)个字符。
6.VARCHAR型:变长字符串类型
5.导入
数据
库表
(1)创建.sql文件
(2)先产生一个库如auction.c:
mysql
bin>
mysql
admin -u root -p creat auction,会提示输入密码,然后成功创建。
(2)导入auction.sql文件
c:
mysql
bin>
mysql
-u root -p auction grant select,insert,delete,create,drop
on *.* (或test.*/user.*/..)
to 用户名@localhost
identified by '密码';
如:新建一个用户帐号以便可以访问
数据
库,需要进行如下操作:
mysql
> grant usage
-> ON test.*
-> TO testuser@localhost;
Query OK, 0 rows affected (0.15 sec)
此后就创建了一个新用户叫:testuser,这个用户只能从localhost连接到
数据
库并可以连接到test
数据
库。下一步,我们必须指定testuser这个用户可以执行哪些操作:
mysql
> GRANT select, insert, delete,update
-> ON test.*
-> TO testuser@localhost;
Query OK, 0 rows affected (0.00 sec)
此操作使testuser能够在每一个test
数据
库中的表执行SELECT,INSERT和DELETE以及UPDATE
查询
操作。现在我们结束操作并退出
MySQL
客户程序:
mysql
> exit
Bye9!
1:使用SHOW语句找出在服务器上当前存在什么
数据
库:
mysql
> SHOW DATABASES;
2:2、创建一个
数据
库
MYSQL
DATA
mysql
> Create DATABASE
MYSQL
DATA;
3:选择你所创建的
数据
库
mysql
> USE
MYSQL
DATA; (按回车键出现Database changed 时说明操作成功!)
4:查看现在的
数据
库中存在什么表
mysql
> SHOW TABLES;
5:创建一个
数据
库表
mysql
> Create TABLE MYTABLE (name VARCHAR(20), sex CHAR(1));
6:显示表的结构:
mysql
> DESCRIBE MYTABLE;
7:往表中加入记录
mysql
> insert into MYTABLE values ("hyq","M");
8:用文本方式将
数据
装入
数据
库表中(例如D:/
mysql
.txt)
mysql
> LOAD DATA LOCAL INFILE "D:/
mysql
.txt" INTO TABLE MYTABLE;
9:导入.sql文件命令(例如D:/
mysql
.sql)
mysql
>use database;
mysql
>source d:/
mysql
.sql;
10:删除表
mysql
>drop TABLE MYTABLE;
11:清空表
mysql
>delete from MYTABLE;
12:更新表中
数据
mysql
>update MYTABLE set sex="f" where name='hyq';
以下是无意中在网络看到的使用
MySql
的管理心得,
摘自:http://www1.xjtusky.com/article/htmldata/2004_12/3/57/article_1060_1.html
在windows中
MySql
以服务形式存在,在使用前应确保此服务已经启动,未启动可用net start
mysql
命令启动。而Linux中启动时可用“/etc/rc.d/init.d/
mysql
d start"命令,注意启动者应具有管理员权限。
刚安装好的
MySql
包含一个含空密码的root帐户和一个匿名帐户,这是很大的安全隐患,对于一些重要的应用我们应将安全性尽可能提高,在这里应把匿名帐户删除、 root帐户设置密码,可用如下命令进行:
use
mysql
;
delete from User where User="";
update User set Password=PASSWORD('newpassword') where User='root';
如果要对用户所用的登录终端进行限制,可以更新User表中相应用户的Host字段,在进行了以上更改后应重新启动
数据
库服务,此时登录时可用如下类似命令:
mysql
-uroot -p;
mysql
-uroot -pnewpassword;
mysql
mydb -uroot -p;
mysql
mydb -uroot -pnewpassword;
上面命令参数是常用参数的一部分,详细情况可参考文档。此处的mydb是要登录的
数据
库的名称。
在进行开发和实际应用中,用户不应该只用root用户进行连接
数据
库,虽然使用root用户进行测试时很方便,但会给系统带来重大安全隐患,也不利于管理技术的提高。我们给一个应用中使用的用户赋予最恰当的
数据
库权限。如一个只进行
数据
插入的用户不应赋予其删除
数据
的权限。
MySql
的用户管理是通过 User表来实现的,添加新用户常用的方法有两个,一是在User表插入相应的
数据
行,同时设置相应的权限;二是通过GRANT命令创建具有某种权限的用户。其中GRANT的常用用法如下:
grant all on mydb.* to NewUserName@HostName identified by "password" ;
grant usage on *.* to NewUserName@HostName identified by "password";
grant select,insert,update on mydb.* to NewUserName@HostName identified by "password";
grant update,delete on mydb.TestTable to NewUserName@HostName identified by "password";
若要给此用户赋予他在相应对象上的权限的管理能力,可在GRANT后面添加WITH GRANT OPTION选项。而对于用插入User表添加的用户,Password字段应用PASSWORD 函数进行更新加密,以防不轨之人窃看密码。对于那些已经不用的用户应给予清除,权限过界的用户应及时回收权限,回收权限可以通过更新User表相应字段,也可以使用REVOKE操作。
下面给出本人从其它资料(www.cn-java.com)获得的对常用权限的解释:
全局管理权限:
FILE: 在
MySQL
服务器上读写文件。
PROCESS: 显示或杀死属于其它用户的服务线程。
RELOAD: 重载访问控制表,刷新日志等。
SHUTDOWN: 关闭
MySQL
服务。
数据
库/
数据
表/
数据
列权限:
Alter: 修改已存在的
数据
表(例如增加/删除列)和索引。
Create: 建立新的
数据
库或
数据
表。
Delete: 删除表的记录。
Drop: 删除
数据
表或
数据
库。
INDEX: 建立或删除索引。
Insert: 增加表的记录。
Select: 显示/搜索表的记录。
Update: 修改表中已存在的记录。
特别的权限:
ALL: 允许做任何事(和root一样)。
USAGE: 只允许登录--其它什么也不允许做。
---------------------
MYSQL
常用命令
有很多朋友虽然安装好了
mysql
但却不知如何使用它。在这篇文章中我们就从连接
MYSQL
、修改密码、增加用户等方面来学习一些
MYSQL
的常用命令。
有很多朋友虽然安装好了
mysql
但却不知如何使用它。在这篇文章中我们就从连接
MYSQL
、修改密码、增加用户等方面来学习一些
MYSQL
的常用命令。
一、连接
MYSQL
格式:
mysql
-h主机地址 -u用户名 -p用户密码
1、例1:连接到本机上的
MYSQL
首先在打开DOS窗口,然后进入目录
mysql
bin,再键入命令
mysql
-uroot -p,回车后提示你输密码,如果刚安装好
MYSQL
,超级用户root是没有密码的,故直接回车即可进入到
MYSQL
中了,
MYSQL
的提示符是:
mysql
>
2、例2:连接到远程主机上的
MYSQL
假设远程主机的IP为:110.110.110.110,用户名为root,密码为abcd123。则键入以下命令:
mysql
-h110.110.110.110 -uroot -pabcd123
(注:u与root可以不用加空格,其它也一样)
3、退出
MYSQL
命令: exit (回车)
二、修改密码
格式:
mysql
admin -u用户名 -p旧密码 password 新密码
1、例1:给root加个密码ab12。首先在DOS下进入目录
mysql
bin,然后键入以下命令
mysql
admin -uroot -password ab12
注:因为开始时root没有密码,所以-p旧密码一项就可以省略了。
2、例2:再将root的密码改为djg345
mysql
admin -uroot -pab12 password djg345
MYSQL
常用命令(下)
一、操作技巧
1、如果你打命令时,回车后发现忘记加分号,你无须重打一遍命令,只要打个分号回车就可以了。也就是说你可以把一个完整的命令分成几行来打,完后用分号作结束标志就OK。
2、你可以使用光标上下键调出以前的命令。但以前我用过的一个
MYSQL
旧版本不支持。我现在用的是
mysql
-3.23.27-beta-win。
二、显示命令
1、显示
数据
库列表。
show databases;
刚开始时才两个
数据
库:
mysql
和test。
mysql
库很重要它里面有
MYSQL
的系统信息,我们改密码和新增用户,实际上就是用这个库进行操作。
2、显示库中的
数据
表:
use
mysql
; //打开库,学过FOXBASE的一定不会陌生吧
show tables;
3、显示
数据
表的结构:
describe 表名;
4、建库:
create database 库名;
5、建表:
use 库名;
create table 表名 (字段设定列表);
6、删库和删表:
drop database 库名;
drop table 表名;
7、将表中记录清空:
delete from 表名;
8、显示表中的记录:
select * from 表名;
三、一个建库和建表以及插入
数据
的实例
drop database if exists school; //如果存在SCHOOL则删除
create database school; //建立库SCHOOL
use school; //打开库SCHOOL
create table teacher //建立表TEACHER
id int(3) auto_increment not null primary key,
name char(10) not null,
address varchar(50) default '深圳',
year date
); //建表结束
//以下为插入字段
insert into teacher values('','glchengang','深圳一中','1976-10-10');
insert into teacher values('','jack','深圳一中','1975-12-23');
注:在建表中(1)将ID设为长度为3的数字字段:int(3)并让它每个记录自动加一:auto_increment并不能为空:not null而且让他成为主字段primary key
(2)将NAME设为长度为10的字符字段
(3)将ADDRESS设为长度50的字符字段,而且缺省值为深圳。varchar和char有什么区别呢,只有等以后的文章再说了。
(4)将YEAR设为日期字段。
如果你在
mysql
提示符键入上面的命令也可以,但不方便调试。你可以将以上命令原样写入一个文本文件中假设为school.sql,然后复制到c:\下,并在DOS状态进入目录\
mysql
\bin,然后键入以下命令:
mysql
-uroot -p密码 school.bbb
注释:将
数据
库school备份到school.bbb文件,school.bbb是一个文本文件,文件名任取,打开看看你会有新发现。
一.SELECT语句的完整语法为:
SELECT[ALL|DISTINCT|DISTINCTROW|TOP]
{*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]}
FROM tableexpression[,…][IN externaldatabase]
[WHERE…]
[
GROUP
BY…]
[HAVING…]
[
ORDER
BY…]
[WITH OWNERACCESS OPTION]
用中括号([])括起来的部分表示是可选的,用大括号({})括起来的部分是表示必须从中选择其中的一个。
1 FROM子句
FROM 子句指定了SELECT语句中字段的来源。FROM子句后面是包含一个或多个的表达式(由逗号分开),其中的表达式可为单一表名称、已保存的
查询
或由 INNER JOIN、LEFT JOIN 或 RIGHT JOIN 得到的复合结果。如果表或
查询
存储在外部
数据
库,在IN 子句之后指明其完整路径。
例:下列SQL语句返回所有有定单的客户:
SELECT
Order
ID,Customer.customerID
FROM
Order
s Customers
WHERE
Order
s.CustomerID=Customers.CustomeersID
2 ALL、DISTINCT、DISTINCTROW、TOP谓词
(1) ALL 返回满足SQL语句条件的所有记录。如果没有指明这个谓词,
默认
为ALL。
例:SELECT ALL FirstName,LastName
FROM Employees
(2) DISTINCT 如果有多个记录的选择字段的
数据
相同,只返回一个。
(3) DISTINCTROW 如果有重复的记录,只返回一个
(4) TOP显示
查询
头尾若干记录。也可返回记录的百分比,这是要用 TOP N PERCENT子句(其中N 表示百分比)
例:返回5%定货额最大的定单
SELECT TOP 5 PERCENT*
FROM [
Order
Details]
ORDER
BY UnitPrice*Quantity*(1-Discount) DESC
3 用 AS 子句为字段取别名
如果想为返回的列取一个新的标题,或者,经过对字段的计算或总结之后,产生了一个新的值,希望把它放到一个新的列里显示,则用AS保留。
例:返回FirstName字段取别名为NickName
SELECT FirstName AS NickName ,LastName ,City
FROM Employees
例:返回新的一列显示库存价值
SELECT ProductName ,UnitPrice ,UnitsInStock ,UnitPrice*UnitsInStock AS valueInStock
FROM Products
二 .WHERE 子句指定
查询
条件
1 比较运算符
比较运算符 含义
= 大于等于
<= 小于等于
!> 不大于
!#1/1/96# AND
Order
Date#96-1-1#
也可以表示为:
WHERE
Order
Date>Datevalue(‘1/1/96’)
使用 NOT 表达式求反。
例:查看96年1月1日以后的定单
WHERE Not
Order
DateQuantity
另一种方法是用 Microsof JET SQL 独有的 JNNER JOIN
FROM table1 INNER JOIN table2
ON table1.field1 comparision table2.field2
其中comparision 就是前面WHERE子句用到的比较运算符。
SELECT FirstName,lastName,
Order
ID,CustomerID,
Order
Date
FROM Employees
INNER JOIN
Order
s ON Employees.EmployeeID=
Order
s.EmployeeID
INNER JOIN不能连接Memo OLE Object Single Double
数据
类型字段。
在一个JOIN语句中连接多个ON子句
SELECT fields
FROM table1 INNER JOIN table2
ON table1.field1 compopr table2.field1 AND
ON table1.field2 compopr table2.field2 OR
ON table1.field3 compopr table2.field3
SELECT fields
FROM table1 INNER JOIN
(table2 INNER JOIN [( ]table3
[INNER JOER] [( ]tablex[INNER JOIN]
ON table1.field1 compopr table2.field1
ON table1.field2 compopr table2.field2
ON table1.field3 compopr table2.field3
外部连接返回更多记录,在结果中保留不匹配的记录,不管存不存在满足条件的记录都要返回另一侧的所有记录。
FROM table [LEFT|RIGHT]JOIN table2
ON table1.field1comparision table.field2
用左连接来建立外部连接,在表达式的左边的表会显示其所有的
数据
例:不管有没有定货量,返回所有商品
SELECT ProductName ,
Order
ID
FROM Products
LEFT JOIN
Order
s ON Products.PrductsID=
Order
s.ProductID
右连接与左连接的差别在于:不管左侧表里有没有匹配的记录,它都从左侧表中返回所有记录。
例:如果想了解客户的信息,并统计各个地区的客户分布,这时可以用一个右连接,即使某个地区没有客户,也要返回客户信息。
空值不会相互匹配,可以通过外连接才能测试被连接的某个表的字段是否有空值。
SELECT *
FROM talbe1
LEFT JOIN table2 ON table1.a=table2.c
1 连接
查询
中使用Iif函数实现以0值显示空值
Iif表达式: Iif(IsNull(Amount,0,Amout)
例:无论定货大于或小于¥50,都要返回一个标志。
Iif([Amount]>50,?Big
order
?,?Small
order
?)
五. 分组和总结
查询
结果
在SQL的语法里,
GROUP
BY和HAVING子句用来对
数据
进行汇总。
GROUP
BY子句指明了按照哪几个字段来分组,而将记录分组后,用HAVING子句过滤这些记录。
GROUP
BY 子句的语法
SELECT fidldlist
FROM table
WHERE criteria
[
GROUP
BY
group
fieldlist [HAVING
group
criteria]]
注:Microsoft Jet
数据
库 Jet 不能对备注或OLE对象字段分组。
GROUP
BY字段中的Null值以备分组但是不能被省略。
在任何SQL合计函数中不计算Null值。
GROUP
BY子句后最多可以带有十个字段,排序优先级按从左到右的顺序排列。
例:在‘WA’地区的雇员表中按头衔分组后,找出具有同等头衔的雇员数目大于1人的所有头衔。
SELECT Title ,Count(Title) as Total
FROM Employees
WHERE Region = ‘WA’
GROUP
BY Title
HAVING Count(Title)>1
JET SQL 中的聚积函数
聚集函数 意义
SUM ( ) 求和
AVG ( ) 平均值
COUNT ( ) 表达式中记录的数目
COUNT (* ) 计算记录的数目
MAX 最大值
MIN 最小值
VAR 方差
STDEV 标准误差
FIRST 第一个值
LAST 最后一个值
六. 用Parameters声明创建参数
查询
Parameters声明的语法:
PARAMETERS name datatype[,name datatype[, …]]
其中name 是参数的标志符,可以通过标志符引用参数.
Datatype说明参数的
数据
类型.
使用时要把PARAMETERS 声明置于任何其他语句之前.
PARAMETERS[Low price] Currency,[Beginning date]datatime
SELECT
Order
ID ,
Order
Amount
FROM
Order
s
WHERE
Order
AMount>[low price]
AND
Order
Date>=[Beginning date]
七. 功能
查询
所谓功能
查询
,实际上是一种操作
查询
,它可以对
数据
库进行快速高效的操作.它以选择
查询
为目的,挑选出符合条件的
数据
,再对
数据
进行批处理.功能
查询
包括更新
查询
,删除
查询
,添加
查询
,和生成表
查询
.
1 更新
查询
UPDATE子句可以同时更改一个或多个表中的
数据
.它也可以同时更改多个字段的值.
更新
查询
语法:
UPDATE 表名
SET 新值
WHERE 准则
例:英国客户的定货量增加5%,货运量增加3%
UPDATE OEDERS
SET
Order
Amount =
Order
Amount *1.1
Freight = Freight*1.03
WHERE ShipCountry = ‘UK’
2 删除
查询
DELETE子句可以使用户删除大量的过时的或冗于的
数据
.
注:删除
查询
的对象是整个记录.
DELETE子句的语法:
DELETE [表名.*]
FROM 来源表
WHERE 准则
例: 要删除所有94年前的定单
DELETE *
FROM
Order
s
WHERE
Order
Data<#94-1-1#
3 追加
查询
INSERT子句可以将一个或一组记录追加到一个或多个表的尾部.
INTO 子句指定接受新记录的表
valueS 关键字指定新记录所包含的
数据
值.
INSERT 子句的语法:
INSETR INTO 目的表或
查询
(字段1,字段2,…)
valueS(数值1,数值2,…)
例:增加一个客户
INSERT INTO Employees(FirstName,LastName,title)
valueS(‘Harry’,’Washington’,’Trainee’)
4 生成表
查询
可以一次性地把所有满足条件的记录拷贝到一张新表中.通常制作记录的备份或副本或作为报表的基础.
SELECT INTO子句用来创建生成表
查询
语法:
SELECT 字段1,字段2,…
INTO 新表[IN 外部
数据
库]
FROM 来源
数据
库
WHERE 准则
例:为定单制作一个存档备份
SELECT *
INTO
Order
sArchive
FROM
Order
s
八. 联合
查询
UNION运算可以把多个
查询
的结果合并到一个结果集里显示.
UNION运算的一般语法:
[表]
查询
1 UNION [ALL]
查询
2 UNION …
例:返回巴西所有供给商和客户的名字和城市
SELECT CompanyName,City
FROM Suppliers
WHERE Country = ‘Brazil’
UNION
SELECT CompanyName,City
FROM Customers
WHERE Country = ‘Brazil’
缺省的情况下,UNION子句不返回重复的记录.如果想显示所有记录,可以加ALL选项
UNION运算要求
查询
具有相同数目的字段.但是,字段
数据
类型不必相同.
每一个
查询
参数中可以使用
GROUP
BY 子句 或 HAVING 子句进行分组.要想以指定的顺序来显示返回的
数据
,可以在最后一个
查询
的尾部使用OREER BY子句.
九. 交叉
查询
交叉
查询
可以对
数据
进行总和,平均,计数或其他总和计算法的计算,这些
数据
通过两种信息进行分组:一个显示在表的左部,另一个显示在表的顶部.
Microsoft Jet SQL 用TRANSFROM语句创建交叉表
查询
语法:
TRANSFORM aggfunction
SELECT 语句
GROUP
BY 子句
PIVOT pivotfield[IN(value1 [,value2[,…]]) ]
Aggfounction指SQL聚积函数,
SELECT语句选择作为标题的的字段,
GROUP
BY 分组
Pivotfield 在
查询
结果集中创建列标题时用的字段或表达式,用可选的IN子句限制它的取值.
value代表创建列标题的固定值.
例:显示在1996年里每一季度每一位员工所接的定单的数目:
TRANSFORM Count(
Order
ID)
SELECT FirstName&’’&LastName AS FullName
FROM Employees INNER JOIN
Order
s
ON Employees.EmployeeID =
Order
s.EmployeeID
WHERE DatePart(“yyyy”,
Order
Date)= ‘1996’
GROUP
BY FirstName&’’&LastName
ORDER
BY FirstName&’’&LastName
POVOT DatePart(“q”,
Order
Date)&’季度’
十 .子
查询
子
查询
可以理解为 套
查询
.子
查询
是一个SELECT语句.
1 表达式的值与子
查询
返回的单一值做比较
表达式 comparision [ANY|ALL|SOME](子
查询
)
ANY 和SOME谓词是同义词,与比较运算符(=,,,=)一起使用.返回一个布尔值True或 False.ANY的意思是,表达式与子
查询
返回的一系列的值逐一比较,只要其中的一次比较产生True结果,ANY测试的返回 True值(既WHERE子句的结果),对应于该表达式的当前记录将进入主
查询
的结果中.ALL测试则要求表达式与子
查询
返回的一系列的值的比较都产生 True结果,才回返回True值.
例:主
查询
返回单价比任何一个折扣大于等于25%的产品的单价要高的所有产品
SELECT * FROM Products
WHERE UnitPrice>ANY
(SELECT UnitPrice FROM[
Order
Details] WHERE Discount>0.25)
2 检查表达式的值是否匹配子
查询
返回的一组值的某个值
[NOT]IN(子
查询
)
例:返回库存价值大于等于1000的产品.
SELECT ProductName FROM Products
WHERE ProductID IN
(SELECT PrdoctID FROM [
Order
DEtails]
WHERE UnitPrice*Quantity>= 1000)
3检测子
查询
是否返回任何记录
[NOT]EXISTS (子
查询
)
例:用EXISTS检索英国的客户
SELECT ComPanyName,ContactName
FROM
Order
s
WHERE EXISTS
(SELECT *
FROM Customers
WHERE Country = ‘UK’ AND
Customers.CustomerID=
Order
s.CustomerID)
MYSQL
常用命令
1.导出整个
数据
库
mysql
dump -u 用名 -p –default-character-set=latin1
数据
库名 > 导出的文件名(
数据
库
默认
编码是latin1)
mysql
dump -u wcnc -p smgp_apps_wcnc > wcnc.sql
2.导出一个表
mysql
dump -u 用户名 -p
数据
库名 表名> 导出的文件名
mysql
dump -u wcnc -p smgp_apps_wcnc users> wcnc_users.sql
3.导出一个
数据
库结构
mysql
dump -u wcnc -p -d –add-drop-table smgp_apps_wcnc >d:wcnc_db.sql
-d 没有
数据
–add-drop-table 在每个create语句之前增加一个drop table
4.导入
数据
库
A:常用source 命令
进入
mysql
数据
库控制台,
如
mysql
-u root -p
mysql
>use
数据
库
然后使用source命令,后面参数为脚本文件(如这里用到的.sql)
mysql
>source wcnc_db.sql
B:使用
mysql
dump命令
mysql
dump -u username -p dbname < filename.sql
C:使用
mysql
命令
mysql
-u username -p -D dbname
2、退出
MySQL
:quit或exit
二、库操作
1、创建
数据
库
命令:create database
例如:建立一个名为xhkdb的
数据
库
mysql
> create database xhkdb;
2、显示所有的
数据
库
命令:show databases (注意:最后有个s)
mysql
> show databases;
3、删除
数据
库
命令:drop database
例如:删除名为 xhkdb的
数据
库
mysql
> drop database xhkdb;
4、连接
数据
库
命令:use
例如:如果xhkdb
数据
库存在,尝试存取它:
mysql
> use xhkdb;
屏幕提示:Database changed
5、查看当前使用的
数据
库
mysql
> select database();
6、当前
数据
库包含的表信息:
mysql
> show tables; (注意:最后有个s)
三、表操作,操作之前应连接某个
数据
库
命令:create table ( [,.. ]);
mysql
> create table MyClass(
> id int(4) not null primary key auto_increment,
> name char(20) not null,
> sex int(4) not null default ’′,
> degree double(16,2));
2、获取表结构
命令:desc 表名,或者show columns from 表名
mysql
>DESCRIBE MyClass
mysql
> desc MyClass;
mysql
> show columns from MyClass;
3、删除表
命令:drop table
例如:删除表名为 MyClass 的表
mysql
> drop table MyClass;
4、插入
数据
命令:insert into [( [,.. ])] values ( 值 )[, ( 值n )]
例如,往表 MyClass中插入二条记录, 这二条记录表示:编号为的名为Tom的成绩为.45, 编号为 的名为Joan 的成绩为.99,编号为 的名为Wang 的成绩为.5.
mysql
>insert into MyClass values(1,’Tom’,96.45),(2,’Joan’,82.99), (2,’Wang’, 96.59);
5、
查询
表中的
数据
1)、
查询
所有行
命令:select from where
例如:查看表 MyClass 中所有
数据
mysql
> select * from MyClass;
2)、
查询
前几行
数据
例如:查看表 MyClass 中前行
数据
mysql
> select * from MyClass
order
by id limit 0,2;
mysql
> select * from MyClass limit 0,2;
6、删除表中
数据
命令:delete from 表名 where 表达式
例如:删除表 MyClass中编号为 的记录
mysql
> delete from MyClass where id=1;
7、修改表中
数据
:update 表名 set 字段=新值,…where 条件
mysql
> update MyClass set name=’Mary’where id=1;
7、在表中增加字段:
命令:alter table 表名 add字段 类型 其他;
例如:在表MyClass中添加了一个字段passtest,类型为int(4),
默认
值为
mysql
> alter table MyClass add passtest int(4) default ’′
8、更改表名:
命令:rename table 原表名 to 新表名;
例如:在表MyClass名字更改为YouClass
mysql
> rename table MyClass to YouClass;
更新字段内容
update 表名 set 字段名 = 新内容
update 表名 set 字段名 = replace(字段名,’旧内容’,'新内容’)
1.INT[(M)] 型:正常大小整数类型
2.DOUBLE[(M,D)] [ZEROFILL] 型:正常大小(双精密)浮点数字类型
3.DATE 日期类型:支持的范围是-01-01到-12-31。
MySQL
以YYYY-MM-DD格式来显示DATE值,但是允许你使用字符串或数字把值赋给DATE列
4.CHAR(M) 型:定长字符串类型,当存储时,总是是用空格填满右边到指定的长度
5.BLOB TEXT类型,最大长度为(2^16-1)个字符。
6.VARCHAR型:变长字符串类型
5.导入
数据
库表
()创建.sql文件
()先产生一个库如auction.c:
mysql
bin>
mysql
admin -u root -p creat auction,会提示输入密码,然后成功创建。
()导入auction.sql文件
c:
mysql
bin>
mysql
-u root -p auction grant select,insert,delete,create,drop
on *.* (或test.*/user.*/..)
to 用户名@localhost
identified by ‘密码’;
如:新建一个用户帐号以便可以访问
数据
库,需要进行如下操作:
mysql
> grant usage
-> ON test.*
-> TO testuser@localhost;
Query OK, 0 rows affected (0.15 sec)
此后就创建了一个新用户叫:testuser,这个用户只能从localhost连接到
数据
库并可以连接到test
数据
库。下一步,我们必须指定testuser这个用户可以执行哪些操作:
mysql
> GRANT select, insert, delete,update
-> ON test.*
-> TO testuser@localhost;
Query OK, 0 rows affected (0.00 sec)
此操作使testuser能够在每一个test
数据
库中的表执行SELECT,INSERT和DELETE以及UPDATE
查询
操作。现在我们结束操作并退出
MySQL
客户程序:
mysql
> exit
Bye9!
1:使用SHOW语句找出在服务器上当前存在什么
数据
库:
mysql
> SHOW DATABASES;
2:2、创建一个
数据
库
MYSQL
DATA
mysql
> Create DATABASE
MYSQL
DATA;
3:选择你所创建的
数据
库
mysql
> USE
MYSQL
DATA; (按回车键出现Database changed 时说明操作成功!)
4:查看现在的
数据
库中存在什么表
mysql
> SHOW TABLES;
5:创建一个
数据
库表
mysql
> Create TABLE MYTABLE (name VARCHAR(20), sex CHAR(1));
6:显示表的结构:
mysql
> DESCRIBE MYTABLE;
7:往表中加入记录
mysql
> insert into MYTABLE values (“hyq”,”M”);
8:用文本方式将
数据
装入
数据
库表中(例如D:/
mysql
.txt)
mysql
> LOAD DATA LOCAL INFILE “D:/
mysql
.txt”INTO TABLE MYTABLE;
9:导入.sql文件命令(例如D:/
mysql
.sql)
mysql
>use database;
mysql
>source d:/
mysql
.sql;
10:删除表
mysql
>drop TABLE MYTABLE;
11:清空表
mysql
>delete from MYTABLE;
12:更新表中
数据
mysql
>update MYTABLE set sex=”f”where name=’hyq’;
以下是无意中在网络看到的使用
MySql
的管理心得,
在windows中
MySql
以服务形式存在,在使用前应确保此服务已经启动,未启动可用net start
mysql
命令启动。而Linux中启动时可用“/etc/rc.d/init.d/
mysql
d start”命令,注意启动者应具有管理员权限。
刚安装好的
MySql
包含一个含空密码的root帐户和一个匿名帐户,这是很大的安全隐患,对于一些重要的应用我们应将安全性尽可能提高,在这里应把匿名帐户删除、root帐户设置密码,可用如下命令进行:
use
mysql
;
delete from User where User=”";
update User set Password=PASSWORD(‘newpassword’) where User=’root’;
如果要对用户所用的登录终端进行限制,可以更新User表中相应用户的Host字段,在进行了以上更改后应重新启动
数据
库服务,此时登录时可用如下类似命令:
mysql
-uroot -p;
mysql
-uroot -pnewpassword;
mysql
mydb -uroot -p;
mysql
mydb -uroot -pnewpassword;
上面命令参数是常用参数的一部分,详细情况可参考文档。此处的mydb是要登录的
数据
库的名称。
在进行开发和实际应用中,用户不应该只用root用户进行连接
数据
库,虽然使用root用户进行测试时很方便,但会给系统带来重大安全隐患,也不利于管理技术的提高。我们给一个应用中使用的用户赋予最恰当的
数据
库权限。如一个只进行
数据
插入的用户不应赋予其删除
数据
的权限。
MySql
的用户管理是通过User表来实现的,添加新用户常用的方法有两个,一是在User表插入相应的
数据
行,同时设置相应的权限;二是通过GRANT命令创建具有某种权限的用户。其中GRANT的常用用法如下:
grant all on mydb.* to NewUserName@HostName identified by “password”;
grant usage on *.* to NewUserName@HostName identified by “password”;
grant select,insert,update on mydb.* to NewUserName@HostName identified by “password”;
grant update,delete on mydb.TestTable to NewUserName@HostName identified by “password”;
若要给此用户赋予他在相应对象上的权限的管理能力,可在GRANT后面添加WITH GRANT OPTION选项。而对于用插入User表添加的用户,Password字段应用PASSWORD 函数进行更新加密,以防不轨之人窃看密码。对于那些已经不用的用户应给予清除,权限过界的用户应及时回收权限,回收权限可以通过更新User表相应字段,也可以使用REVOKE操作。
下面给出本人从其它资料(www.cn-java.com)获得的对常用权限的解释:
全局管理权限:
FILE: 在
MySQL
服务器上读写文件。
PROCESS: 显示或杀死属于其它用户的服务线程。
RELOAD: 重载访问控制表,刷新日志等。
SHUTDOWN: 关闭
MySQL
服务。
数据
库/
数据
表/
数据
列权限:
Alter: 修改已存在的
数据
表(例如增加/删除列)和索引。
Create: 建立新的
数据
库或
数据
表。
Delete: 删除表的记录。
Drop: 删除
数据
表或
数据
库。
INDEX: 建立或删除索引。
Insert: 增加表的记录。
Select: 显示/搜索表的记录。
Update: 修改表中已存在的记录。
特别的权限:
ALL: 允许做任何事(和root一样)。
USAGE: 只允许登录–其它什么也不允许做。
———————
MYSQL
常用命令
有很多朋友虽然安装好了
mysql
但却不知如何使用它。在这篇文章中我们就从连接
MYSQL
、修改密码、增加用户等方面来学习一些
MYSQL
的常用命令。
有很多朋友虽然安装好了
mysql
但却不知如何使用它。在这篇文章中我们就从连接
MYSQL
、修改密码、增加用户等方面来学习一些
MYSQL
的常用命令。
一、连接
MYSQL
格式:
mysql
-h主机地址-u用户名-p用户密码
、例:连接到本机上的
MYSQL
首先在打开DOS窗口,然后进入目录
mysql
bin,再键入命令
mysql
-uroot -p,回车后提示你输密码,如果刚安装好
MYSQL
,超级用户root是没有密码的,故直接回车即可进入到
MYSQL
中了,
MYSQL
的提示符是:
mysql
>
、例:连接到远程主机上的
MYSQL
假设远程主机的IP为:.110.110.110,用户名为root,密码为abcd123。则键入以下命令:
mysql
-h110.110.110.110 -uroot -pabcd123
(注:u与root可以不用加空格,其它也一样)
、退出
MYSQL
命令:exit (回车)
二、修改密码
格式:
mysql
admin -u用户名-p旧密码password 新密码
、例:给root加个密码ab12。首先在DOS下进入目录
mysql
bin,然后键入以下命令
mysql
admin -uroot -password ab12
注:因为开始时root没有密码,所以-p旧密码一项就可以省略了。
、例:再将root的密码改为djg345
mysql
admin -uroot -pab12 password djg345
MYSQL
常用命令(下)
一、操作技巧
、如果你打命令时,回车后发现忘记加分号,你无须重打一遍命令,只要打个分号回车就可以了。也就是说你可以把一个完整的命令分成几行来打,完后用分号作结束标志就OK。
、你可以使用光标上下键调出以前的命令。但以前我用过的一个
MYSQL
旧版本不支持。我现在用的是
mysql
-3.23.27-beta-win。
二、显示命令
、显示
数据
库列表。
show databases;
刚开始时才两个
数据
库:
mysql
和test。
mysql
库很重要它里面有
MYSQL
的系统信息,我们改密码和新增用户,实际上就是用这个库进行操作。
、显示库中的
数据
表:
use
mysql
;//打开库,学过FOXBASE的一定不会陌生吧
show tables;
、显示
数据
表的结构:
describe 表名;
create database 库名;
use 库名;
create table 表名(字段设定列表);
、删库和删表:
drop database 库名;
drop table 表名;
、将表中记录清空:
delete from 表名;
、显示表中的记录:
select * from 表名;
三、一个建库和建表以及插入
数据
的实例
drop database if exists school; //如果存在SCHOOL则删除
create database school; //建立库SCHOOL
use school; //打开库SCHOOL
create table teacher //建立表TEACHER
id int(3) auto_increment not null primary key,
name char(10) not null,
address varchar(50) default ‘深圳’,
year date
); //建表结束
//以下为插入字段
insert into teacher values(”,’glchengang’,'深圳一中’,’-10-10′);
insert into teacher values(”,’jack’,'深圳一中’,’-12-23′);
注:在建表中()将ID设为长度为的数字字段:int(3)并让它每个记录自动加一:auto_increment并不能为空:not null而且让他成为主字段primary key
()将NAME设为长度为的字符字段
()将ADDRESS设为长度的字符字段,而且缺省值为深圳。varchar和char有什么区别呢,只有等以后的文章再说了。
()将YEAR设为日期字段。
如果你在
mysql
提示符键入上面的命令也可以,但不方便调试。你可以将以上命令原样写入一个文本文件中假设为school.sql,然后复制到c:\下,并在DOS状态进入目录\
mysql
\bin,然后键入以下命令:
mysql
-uroot -p密码school.bbb
注释:将
数据
库school备份到school.bbb文件,school.bbb是一个文本文件,文件名任取,打开看看你会有新发现。
一.SELECT语句的完整语法为:
SELECT[ALL|DISTINCT|DISTINCTROW|TOP]
{*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]}
FROM tableexpression[,…][IN externaldatabase]
[WHERE…]
[
GROUP
BY…]
[HAVING…]
[
ORDER
BY…]
[WITH OWNERACCESS OPTION]
用中括号([])括起来的部分表示是可选的,用大括号({})括起来的部分是表示必须从中选择其中的一个。
1 FROM子句
FROM 子句指定了SELECT语句中字段的来源。FROM子句后面是包含一个或多个的表达式(由逗号分开),其中的表达式可为单一表名称、已保存的
查询
或由INNER JOIN、LEFT JOIN 或RIGHT JOIN 得到的复合结果。如果表或
查询
存储在外部
数据
库,在IN 子句之后指明其完整路径。
例:下列SQL语句返回所有有定单的客户:
SELECT
Order
ID,Customer.customerID
FROM
Order
s Customers
WHERE
Order
s.CustomerID=Customers.CustomeersID
2 ALL、DISTINCT、DISTINCTROW、TOP谓词
(1) ALL 返回满足SQL语句条件的所有记录。如果没有指明这个谓词,
默认
为ALL。
例:SELECT ALL FirstName,LastName
FROM Employees
(2) DISTINCT 如果有多个记录的选择字段的
数据
相同,只返回一个。
(3) DISTINCTROW 如果有重复的记录,只返回一个
(4) TOP显示
查询
头尾若干记录。也可返回记录的百分比,这是要用TOP N PERCENT子句(其中N 表示百分比)
例:返回%定货额最大的定单
SELECT TOP 5 PERCENT*
FROM [
Order
Details]
ORDER
BY UnitPrice*Quantity*(1-Discount) DESC
3 用AS 子句为字段取别名
如果想为返回的列取一个新的标题,或者,经过对字段的计算或总结之后,产生了一个新的值,希望把它放到一个新的列里显示,则用AS保留。
例:返回FirstName字段取别名为NickName
SELECT FirstName AS NickName ,LastName ,City
FROM Employees
例:返回新的一列显示库存价值
SELECT ProductName ,UnitPrice ,UnitsInStock ,UnitPrice*UnitsInStock AS valueInStock
FROM Products
二.WHERE 子句指定
查询
条件
1 比较运算符
比较运算符含义
= 大于等于
<= 小于等于
!> 不大于
!#1/1/96# AND
Order
Date#96-1-1#
也可以表示为:
WHERE
Order
Date>Datevalue(‘/1/96’)
使用NOT 表达式求反。
例:查看年月日以后的定单
WHERE Not
Order
DateQuantity
另一种方法是用Microsof JET SQL 独有的JNNER JOIN
FROM table1 INNER JOIN table2
ON table1.field1 comparision table2.field2
其中comparision 就是前面WHERE子句用到的比较运算符。
SELECT FirstName,lastName,
Order
ID,CustomerID,
Order
Date
FROM Employees
INNER JOIN
Order
s ON Employees.EmployeeID=
Order
s.EmployeeID
INNER JOIN不能连接Memo OLE Object Single Double
数据
类型字段。
在一个JOIN语句中连接多个ON子句
SELECT fields
FROM table1 INNER JOIN table2
ON table1.field1 compopr table2.field1 AND
ON table1.field2 compopr table2.field2 OR
ON table1.field3 compopr table2.field3
SELECT fields
FROM table1 INNER JOIN
(table2 INNER JOIN [( ]table3
[INNER JOER] [( ]tablex[INNER JOIN]
ON table1.field1 compopr table2.field1
ON table1.field2 compopr table2.field2
ON table1.field3 compopr table2.field3
外部连接返回更多记录,在结果中保留不匹配的记录,不管存不存在满足条件的记录都要返回另一侧的所有记录。
FROM table [LEFT|RIGHT]JOIN table2
ON table1.field1comparision table.field2
用左连接来建立外部连接,在表达式的左边的表会显示其所有的
数据
例:不管有没有定货量,返回所有商品
SELECT ProductName ,
Order
ID
FROM Products
LEFT JOIN
Order
s ON Products.PrductsID=
Order
s.ProductID
右连接与左连接的差别在于:不管左侧表里有没有匹配的记录,它都从左侧表中返回所有记录。
例:如果想了解客户的信息,并统计各个地区的客户分布,这时可以用一个右连接,即使某个地区没有客户,也要返回客户信息。
空值不会相互匹配,可以通过外连接才能测试被连接的某个表的字段是否有空值。
SELECT *
FROM talbe1
LEFT JOIN table2 ON table1.a=table2.c
1 连接
查询
中使用Iif函数实现以值显示空值
Iif表达式:Iif(IsNull(Amount,0,Amout)
例:无论定货大于或小于¥,都要返回一个标志。
Iif([Amount]>50,?Big
order
?,?Small
order
?)
五. 分组和总结
查询
结果
在SQL的语法里,
GROUP
BY和HAVING子句用来对
数据
进行汇总。
GROUP
BY子句指明了按照哪几个字段来分组,而将记录分组后,用HAVING子句过滤这些记录。
GROUP
BY 子句的语法
SELECT fidldlist
FROM table
WHERE criteria
[
GROUP
BY
group
fieldlist [HAVING
group
criteria]]
注:Microsoft Jet
数据
库Jet 不能对备注或OLE对象字段分组。
GROUP
BY字段中的Null值以备分组但是不能被省略。
在任何SQL合计函数中不计算Null值。
GROUP
BY子句后最多可以带有十个字段,排序优先级按从左到右的顺序排列。
例:在‘WA’地区的雇员表中按头衔分组后,找出具有同等头衔的雇员数目大于人的所有头衔。
SELECT Title ,Count(Title) as Total
FROM Employees
WHERE Region = ‘WA’
GROUP
BY Title
HAVING Count(Title)>1
JET SQL 中的聚积函数
聚集函数意义
SUM ( ) 求和
AVG ( ) 平均值
COUNT ( ) 表达式中记录的数目
COUNT (* ) 计算记录的数目
MAX 最大值
MIN 最小值
VAR 方差
STDEV 标准误差
FIRST 第一个值
LAST 最后一个值
六. 用Parameters声明创建参数
查询
Parameters声明的语法:
PARAMETERS name datatype[,name datatype[, …]]
其中name 是参数的标志符,可以通过标志符引用参数.
Datatype说明参数的
数据
类型.
使用时要把PARAMETERS 声明置于任何其他语句之前.
PARAMETERS[Low price] Currency,[Beginning date]datatime
SELECT
Order
ID ,
Order
Amount
FROM
Order
s
WHERE
Order
AMount>[low price]
AND
Order
Date>=[Beginning date]
七. 功能
查询
所谓功能
查询
,实际上是一种操作
查询
,它可以对
数据
库进行快速高效的操作.它以选择
查询
为目的,挑选出符合条件的
数据
,再对
数据
进行批处理.功能
查询
包括更新
查询
,删除
查询
,添加
查询
,和生成表
查询
.
1 更新
查询
UPDATE子句可以同时更改一个或多个表中的
数据
.它也可以同时更改多个字段的值.
更新
查询
语法:
UPDATE 表名
SET 新值
WHERE 准则
例:英国客户的定货量增加%,货运量增加%
UPDATE OEDERS
SET
Order
Amount =
Order
Amount *1.1
Freight = Freight*1.03
WHERE ShipCountry = ‘UK’
2 删除
查询
DELETE子句可以使用户删除大量的过时的或冗于的
数据
.
注:删除
查询
的对象是整个记录.
DELETE子句的语法:
DELETE [表名.*]
FROM 来源表
WHERE 准则
例: 要删除所有年前的定单
DELETE *
FROM
Order
s
WHERE
Order
Data<#94-1-1#
3 追加
查询
INSERT子句可以将一个或一组记录追加到一个或多个表的尾部.
INTO 子句指定接受新记录的表
valueS 关键字指定新记录所包含的
数据
值.
INSERT 子句的语法:
INSETR INTO 目的表或
查询
(字段,字段,…)
valueS(数值,数值,…)
例:增加一个客户
INSERT INTO Employees(FirstName,LastName,title)
valueS(‘Harry’,’Washington’,’Trainee’)
4 生成表
查询
可以一次性地把所有满足条件的记录拷贝到一张新表中.通常制作记录的备份或副本或作为报表的基础.
SELECT INTO子句用来创建生成表
查询
语法:
SELECT 字段,字段,…
INTO 新表[IN 外部
数据
库]
FROM 来源
数据
库
WHERE 准则
例:为定单制作一个存档备份
SELECT *
INTO
Order
sArchive
FROM
Order
s
八. 联合
查询
UNION运算可以把多个
查询
的结果合并到一个结果集里显示.
UNION运算的一般语法:
[表]
查询
UNION [ALL]
查询
UNION …
例:返回巴西所有供给商和客户的名字和城市
SELECT CompanyName,City
FROM Suppliers
WHERE Country = ‘Brazil’
UNION
SELECT CompanyName,City
FROM Customers
WHERE Country = ‘Brazil’
缺省的情况下,UNION子句不返回重复的记录.如果想显示所有记录,可以加ALL选项
UNION运算要求
查询
具有相同数目的字段.但是,字段
数据
类型不必相同.
每一个
查询
参数中可以使用
GROUP
BY 子句或HAVING 子句进行分组.要想以指定的顺序来显示返回的
数据
,可以在最后一个
查询
的尾部使用OREER BY子句.
九. 交叉
查询
交叉
查询
可以对
数据
进行总和,平均,计数或其他总和计算法的计算,这些
数据
通过两种信息进行分组:一个显示在表的左部,另一个显示在表的顶部.
Microsoft Jet SQL 用TRANSFROM语句创建交叉表
查询
语法:
TRANSFORM aggfunction
SELECT 语句
GROUP
BY 子句
PIVOT pivotfield[IN(value1 [,value2[,…]]) ]
Aggfounction指SQL聚积函数,
SELECT语句选择作为标题的的字段,
GROUP
BY 分组
Pivotfield 在
查询
结果集中创建列标题时用的字段或表达式,用可选的IN子句限制它的取值.
value代表创建列标题的固定值.
例:显示在年里每一季度每一位员工所接的定单的数目:
TRANSFORM Count(
Order
ID)
SELECT FirstName&’’&LastName; AS FullName
FROM Employees INNER JOIN
Order
s
ON Employees.EmployeeID =
Order
s.EmployeeID
WHERE DatePart(“yyyy”,
Order
Date)= ‘’
GROUP
BY FirstName&’’&LastName;
ORDER
BY FirstName&’’&LastName;
POVOT DatePart(“q”,
Order
Date)&’季度’
十.子
查询
子
查询
可以理解为套
查询
.子
查询
是一个SELECT语句.
1 表达式的值与子
查询
返回的单一值做比较
表达式comparision [ANY|ALL|SOME](子
查询
)
ANY 和SOME谓词是同义词,与比较运算符(=,,,=)一起使用.返回一个布尔值True或False.ANY的意思是,表达式与子
查询
返回的一系列的值逐一比较,只要其中的一次比较产生True结果,ANY测试的返回True值(既WHERE子句的结果),对应于该表达式的当前记录将进入主
查询
的结果中.ALL测试则要求表达式与子
查询
返回的一系列的值的比较都产生True结果,才回返回True值.
例:主
查询
返回单价比任何一个折扣大于等于%的产品的单价要高的所有产品
SELECT * FROM Products
WHERE UnitPrice>ANY
(SELECT UnitPrice FROM[
Order
Details] WHERE Discount>0.25)
2 检查表达式的值是否匹配子
查询
返回的一组值的某个值
[NOT]IN(子
查询
)
例:返回库存价值大于等于的产品.
SELECT ProductName FROM Products
WHERE ProductID IN
(SELECT PrdoctID FROM [
Order
DEtails]
WHERE UnitPrice*Quantity>= 1000)
3检测子
查询
是否返回任何记录
[NOT]EXISTS (子
查询
)
例:用EXISTS检索英国的客户
SELECT ComPanyName,ContactName
FROM
Order
s
WHERE EXISTS
(SELECT *
FROM Customers
WHERE Country = ‘UK’AND
Customers.CustomerID=
Order
s.CustomerID)
今天遇到一个问题,将
MySQL
的sql语句改为Oracle的语句时,
MySQL
的select的未聚合字段没有全部放在
group
by里面,这就导致跟Oracle查出来的
数据
不一致,实验 一:
按照id,code的降序排列,
在
group
by的时候取的是每一组的
第一条
;
依旧是取的该组的
第一条
数据
测试代码如下:
DROP TABLE IF EXISTS `test0511`;
CREATE TABLE `test0511` (
`id` int(11) NULL DEFA
把left join左边的表的记录全部找出来。系统会先用表A和表B做个笛卡儿积,然后以表A为基表,去掉笛卡儿积中表A部分为NULL的记录。最后形成你的结果。
进行左连接时,就有涉及到主表、辅表,这时主表条件写在WHERE之后,辅表条件写在ON后面。
1、表a结构和
数据
table a(id, type):
id type
--------------...
GROUP
BY用于将
数据
按照指定的列进行分组,例如:
SELECT department, COUNT(*) FROM employees
GROUP
BY department;
这条语句将employees表中的员工按照部门进行分组,并统计每个部门的员工数量。
COUNT函数用于计算指定列的行数,例如:
SELECT COUNT(*) FROM employees;
这条语句将employees表中的行数统计出来。
结合起来使用,可以实现按照指定列分组并计算每组的行数,例如:
SELECT department, COUNT(*) FROM employees
GROUP
BY department;
这条语句将employees表中的员工按照部门进行分组,并统计每个部门的员工数量。