添加普通索引:alter table 表名 add key [索引名] (字段名1[,字段名2,...]);
添加唯一索引(约束):alter table 表名 add unique key (字段名1[,字段名2,...]);
添加主键索引(约束):alter table 表名 add primary key (字段名1[,字段名2,...]);
删除表
drop table 【if exists】 表名;
其他表的相关语句:
显示当前数据库中的所有表: show tables;
显示某表的结构: desc 表名; 或:describe 表名;
显示某表的创建语句:show create table 表名;
重命名表:rename table 旧表名 to 新表名;
从已有表复制表结构:create table [if not exists] 新表名 like 原表名;
--------------------------------------------------------------------------------------
视图的创建语法:
语法形式:
create view 视图名 【(字段名1,字段名2,字段名3,....)】 as select语句;
举例:
create view v1 as
select id, f1, name, age, email, p_id, f3 from 表1 where id > 7 and id < 100 or f1 < 1000 and age > 10
使用视图:
就像使用使用表一样
删除视图:
drop view 【if exists】 视图名;
--------------------------------------------------------------------------------------
数据操作语言:
插入数据(增):
多种语法形式:
形式1:insert [into] 表名 [(字段名1,字段名2,....)] values (值表达式1,值表达式2,....), (.....), ....;
形式2:replace [into] 表名 [(字段名1,字段名2,....)] values (值表达式1,值表达式2,....), (.....), ....;
形式3:insert [into] 表名 [(字段名1,字段名2,....)] select 字段名1,字段名2,.... from 其他表名;
载入语法形式:
load data infile “完整的数据文件的路径” into table 表名;
删除数据(删):
语法形式:
delete from 表名 【where 条件】 【order by排序字段】 【limit 限定行数】;
修改数据(改):
语法形式:
update 表名 set 字段1=值1,字段2=值2,...... 【where 条件】 【order by排序字段】 【limit 限定行数】;
举例:
update tab1 set name = ‘张三丰’, age = 18, birthday = ‘1900-3-4’ where id = 3;
update tab1 set name = get_name() , age = func1() , birthday = now() where id = 3;
--------------------------------------------------------------------------------------
基本查询
基本语法形式
select [all | distinct] 字段或表达式列表 [from子句] [where子句] [group by子句] [having子句] [order by子句] [limit子句];
all:表示不消除,即所有都出来,默认值;
distinct:表示会消除;
from子句
from子句表示select部分从中“取得”数据的数据源——其实就是表。
通常,其后面就是表名; 比如: from tab1,
但,也可能是其他一些数据来源; from tab1,tab2(连接表);
select输出(取出)部分,如果给定的是字段名,则其必然是来源于这里的“数据源”的字段;
where子句
where子句中,通常都需要使用各种“运算符”;
算术运算符: + - * / %
比较运算符: > >= < <= =(等于) < >(不等于) ==(等于) !=(不等于)
逻辑运算符: and or not
is运算符:空值和布尔值的判断
XX is null:判断某个字段是“null”值——就是没有值;
XX is not null:判断某个字段不是“null”值
XX is true:判断某个字段为“真”(true)
XX is false:判断某个字段为“假”(false):0, 0.0, ‘’, null
between运算符:范围判断
语法:XX between 值1 and 值2;
in运算符:给定确定数据的范围判断
语法:XX in (值1,值2, 值3, .....);
like运算符:对字符串进行模糊查找
语法:XX like ‘要查找的内容’
% :它代表“任何个数的任何字符”;
_ :(下杠),它代表“一个任何字符”;
常见示例及含义:
name like ‘%罗%’: 表示nam中“罗”这一个字的所有数据行;
name like ‘罗%’: 表示nam中以“罗”开头的所有数据行;比如:罗兰,
name like ‘%罗’: 表示nam中以“罗”结尾的所有数据行;比如:C罗,魂斗罗
name like ‘罗_’: 表示nam中以“罗”开头并只有2个字符的所有数据行;比如:罗兰
name like ‘_罗’: 表示nam中以“罗”结尾并只有2个字符的所有数据行;比如:C罗
\% :表示%这个字符本身
\_ :表示_这个字符本身
--------------------------------------------------------------------------------------
group by 子句:分组
形式:
group by 字段1 【desc|asc】, 字段2 【desc|asc】,
select 组信息1, count(*) as 数量,..,max(字段名) as 最大值,.. from product[数据源] group by 字段;
每一组的“数量”信息:就是用count(*)获得;
原来数据中的“数值类型字段的聚合信息”,包括如下几个:
最大值: max(字段名)
最小值: min(字段名)
平均值: avg(字段名)
总和值: sum(字段名)
having子句
一句话:
having的作用跟where完全一样,但其只是对“分组的结果数据”进行筛选;
即:
where对原始数据行进行筛选;
having对分组之后的数据行进行筛选;
--------------------------------------------------------------------------------------
order by 子句
含义:
它用于将前面“取得”的数据以设定的标准(字段)来进行排序以输出结果。
形式:
order by 字段1 【asc|desc】, 字段2 【asc|desc】,......
--------------------------------------------------------------------------------------
limit子句
含义:
它用于将“前述取得的数据”,按指定的行取出来:从第几行开始取出多少行;
形式:
limit 起始行号, 要取出的行数;
--------------------------------------------------------------------------------------
连接查询
没有条件的连接,交叉连接
select * from 表1, 表2;
select * from 表1 join 表2;
select * from 表1 cross join 表2;
连接基本形式:
在代码级别,连接的基本形式为:
表1 【连接形式】 join 表2 【on 连接条件】;
如果是3个表,则进一步扩展为:
表1 【连接形式】 join 表2 【on 连接条件】 【连接形式】 join 表3 【on 连接条件】
内连接 inner join:
形式:select * from 表1 【inner】 join 表2 on 连接条件;
左(外)连接 left (outer) join:
形式:表1(左表) left 【outer】 join 表2(右表) on 连接条件
含义:其实就是将两个表的内连接的结果,再加上左边表的不符合内连接所设定的条件的那些数据的结果;
右(外)连接 right (outer) join:
形式:表1(左表) right 【outer】 join 表2(右表) on 连接条件
含义:其实就是将两个表的内连接的结果,再加上右边表的不符合内连接所设定的条件的那些数据的结果;
--------------------------------------------------------------------------------------
子查询
一个select语句,就是一个查询语句:
select 字段或表达式 from 数据源 where XX 条件判断;
如“select 5000”的子查询语句
表达:selelct 字段或表达式或子查询 [as 别名] from 表名或链接结果或子查询 where 字段或表达式或子查询的条件判断
--------------------------------------------------------------------------------------
子查询,按位置(场合)分:
作为主查询的结果数据:
oselect c1,(select f1 from tab2) as f11 from tab1;
#这里子查询应该只有一个数据(一行一列,标量子查询)
作为主查询的条件数据:
oselect c1 from tab1 where c1 in (select f1 from tab2);
#这里子查询可以是多个数据(多行一列,列子查询)
作为主查询的来源数据:
select c1 from (select f1 as c1, f2 from tab2) as t2;
#这里子查询可以是任意查询结果(表子查询)。
--------------------------------------------------------------------------------------
常见子查询
比较运算符中的子查询
形式:操作数 比较运算符 (标量子查询);
举例:找出最高价的商品
select * from product where price = (select max(price) from product );
--------------------------------------------------------------------------------------
使用in的子查询
以前用的in的用法:
XX in (值1,值2,值3,....);
则in子查询为:
XX in (列子查询)
举例:
找出所有类别名称中带“电”这个字的所有商品;
可以分两步思考:
select protype_id from product_type where protype_name like ‘%电%’;
结果为:
然后,将此结果,当做“in”的数据项来使用,去找出商品:
select * from product where protype_id in(
select protype_id from product_type where protype_name like ‘%电%’
);
--------------------------------------------------------------------------------------
使用any的子查询
形式:操作数 比较运算符 any (列子查询);
含义:当某个操作数(字段) 对于该列子查询的其中任意一个值,满足该比较运算符,则就算是满足了条件;
即:只要有一个值满足,就算是满足;
进一步解释:
假设表1(tab1)有数据为:
id name
1 ‘aa’,
5 ‘bb’
11 ‘cc’
假设表2(tab2)有数据为:
f1 f2
3 ‘x1’
6 ‘x2’
12 ‘x3’
则:select * from tab1 where id > any (select f1 from tab2);
则可以取出的结果数据有:
5 ‘bb’
11 ‘cc’
--------------------------------------------------------------------------------------
使用all的子查询:
形式:操作数 比较运算符 all (列子查询);
含义:当某个操作数(字段) 对于该列子查询的所有数据值,都满足该比较运算符,才算满足了条件;
Back to home |
File page
Subscribe |
Register |
Login
| N