SQL基础语句
select distinct [字段名] from [表名];
用于查询该列不重复的所有值。
where子句中可以加between...and...
模糊查询:like
%代表多个字符,_代表一个字符
like 'M%'代表查询以M开头的字符串;
like '%M%'代表查询包含M的字符串;
like '%M'代表查询以M结尾的字符串;
like '%M_'代表查询M为倒数第二个字符的字符串
like 'M_'代表两位,第一位是M的字符串
like关键字前还可以加上not关键字,表示不是....
in保留字:指定针对某个列可能的多个值
select * from product where market_price in (1999,2999,3999);
order by...
是可以指定多列进行排序的
insert into...语句使用方法:
两种方式:
(1)insert into category values (‘7‘’,‘生活用品’);
(2)insert into category (cid, cname) values ('7', ‘生活用品');
update语句:
例如:
update category set cname = ‘书籍’ where cid = '18';
注意:
update语句后面如果不接where子句,就会使表内所有行的值都会更新,一定要慎重!
在MySQL中,可以通过设置 set sql_safe_updates = 1; 这样,update后没有where子句就会报错。
delete语句
limit语句
select * from product limit A;
表示从第一条开始查询,一共查询A条;
select * from product limit A ,B;
表示从第A条开始查询,一共查询B条;
as为列、表添加别名,作用有:
(1)列名称很长或者可读性很差
select name as n, price as p from product;
(2)在查询中设计到了不止一个表
select o.uid, oi.pid from orders as o, orderitems as oi where o.oid = oi.oid;
通过oid将两个表连接到了一起,并输出两个表中各一列;
(3)需要把两个列或多格列合到一起,为新列去一个别名
select pname, CONCAT(market_price, ',' ,shop_price) as price from product;
join连接:将两个或多个表的行通过一定关系连接到一起
分为内连接、外连接
内连接:
select product.pid, product.pname, orderitem.itemid from product (inner) join orderitem on product.pid = orderitem.pid;
只有两个表格满足了 product.pid = orderitem.pid 这个条件之后,才会将符合条件的行输出出来;
外连接:分为左连接和右连接
select product.pid, product.pname, orderitem.itemid from product left join orderitem on product.pid = orderitem.pid;
这句是左连接,不管product.pid = orderitem.pid 条件是不是满足,左边的表product 所有行全部输出出来,但是右边的表格orderitem是否输出需要依靠这个条件,条件满足的行则输出,条件不满足的行则输出null;
右连接类似,只不过将left改为right,右表全部输出,左表是否输出看每一行的条件是否满足;
union语句
select columnName1... from table1
union
select columnName2... from table2
用于将两次select的所有值连接到一起显示,需要保证两次查询的列的数量、类型相同,而且union连接时,不会显示重复值
如需要显示重复值,请使用union all 关键字。
insert into [目标表名] ((目标表的列)) select [选择的列名] from [源表名] (where...);
可以将源表中的一些数据插入到目标表中,注意是插入,并不会影响目标表已有的数据。
如果目标表不存在,则该语句不会创建新的目标表,而是报错。
选取的列的数量、类型要与目标表选取的列的数量、类型保持一致,否则报错。
可以加where子句,用法和select语句相同。
例:
insert into category_new select product.pid, orderitem.itemid from product join orderitem on product.pid = orderitem.pid;
create关键字的使用
创建数据库:
create datebase db_1;
创建表格:
create table test_table (
id int,
tname varchar(50);
);
注意,varcahr类型后面需要跟上长度
如果想要复制一个表格的类型,可以使用如下语句:
create table test_table_1 as select * from test_table where 1=0;
where 1=0是为了在新表中不添加任何数据
创建索引
create index index_test on test_table (column_1 , column_1 );
约束 NOT NULL
NOT NULL指定一列不为空,不许存放null值;
约束UNIQUE
UNIQUE指定一列不许出现重复值,但是可以出现多个NULL
使用方法:
使用create来添加 UNIQUE
create table person (
pid int,
pname varchar(20) not null,
unique (pid)
);
如果为多个列添加unique越约束,使用如下语句:
create table person(
pid int not null,
pname varchar(20) not null,
constraint uc_person unique (pid, pname)
);
这样一来,pid或者pname本身可以出现重复值,但是pid+pname不允许出现重复值。
使用ALTER来添加删除UNIQUE
alter table person add unique (pid);
或者
alter table person add constraint uc_person unique (pid, pname);
alter table person drop index uc_person;
(删除 UNIQUE 约束)
PRIMARY KEY约束(主键约束)
PRIMARY KEY 相当于NOT NULL和UNIQUE放在一起,而且每一个表中只能有一个主键。
其使用方法与UNIQUE类似。
只不过在删除主键约束时,可以像下面这样写
alter table person drop primary key;
因为一个表中只有一个主键约束,不需要为其指定约束名称
FOREIGN KEY约束(外键约束)
一个表中的 FOREIGN KEY 指向另一个表中的 UNIQUE KEY(唯一约束的键)。
FOREIGN KEY 约束用于预防破坏表之间连接的行为。
FOREIGN KEY 约束也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一。
其用法如下,以create为例:
create table orders (
oid int not null,
pid int not null,
constraint fc_pid foreign key (pid) references person (pid)
);
Check约束
Check约束用于限制列的取值范围
例如:
create table person (
id int primary key,
pname varchar(20) not null,
age int,
constraint cc_age check (age>10)
);
Default约束
用于向列中插入默认值
create table person (
id int primary key,
pname varchar(20) not null,
age int,
constraint dc_age default 15
);
drop语句
删除数据库
drop database db1;
删除表
drop table table1;
删除索引
drop index index1;
drop、delete、truncate删除表的区别
drop会清除表的内容,结构,约束,并释放空间,后续想要向该表中添加数据是不允许的,除非建立一个新的表;
truncate保留表的结构,清空表的内容,释放空间,后续可以继续向表中添加内容;
delete允许使用where子句一行一行删除表的内容,而且删除操作会作为事务记录在日志中。当不加where子句时,其作用效果与truncate类似。
delete语句是数据库操作语言(dml) ,drop和truncate是数据库定义语言(ddl)。
alter语句允许添加列,删除列,修改列
alter table table1 add pid int; //添加列
alter table table1 drop column pid; //删除列
alter table table1 modify column pid varchar(20); //将pid列的类型从int改为varchar
关于MySQL null值的处理
null值是不可比较的,要想判断一个数据存的是不是null值,需要使用到is null关键字,或者是 is not null。
select * from test_table2 where age is not null;
如果我们要对某些列进行运算,里边如果掺杂着null值,那么计算结果一定是null,不符合我们的要求,所以希望将null值改为一个可以计算的数值。在mysql中,使用到了ifnull()函数;
select product_price * count as total_price from product;
这里面,如果count中有null值,输出结果total_price中将会出现null值,是我们不想看到的,
所以该SQL语句改为如下:
select product_price * ifnull(count, 0) as total_price from product;
该语句的意思是,如果count为空,那么就将其看做成0来计算。
count()函数的使用
select count(*) from test_table; //计算test_table一共有多少行
select count(age) from test_table; //计算test_table中age列一共有多少数据,注意,null值不会计算在内
select count(distinct age) from test_table; //计算test_table中age列有多少不同的值,注意,null值不会计算在内
group by和having语句的使用
group by主要是将查询的数据进行分组,在单表查询中,其使用方式如下:
select oid, sum(subtotal) as total from orderitem group by oid; //查询每一个订单中的总金额,最后显示的是订单号和总金额
对于多表分组查询,比较复杂,
比如说我们想要查询每一个订单中的订单号,总金额,和所有的商品
可以写下如下的SQL语句
select orderitem.oid, sum(orderitem.count * product.market_price) as totalPrice, group_concat(product.pname) as product
from orderitem left join product on orderitem.pid = product.pid
group by oid;
having主要是解决了where子句中不能使用聚合函数的问题
比如说,我们想要从orderitem中查询订单总金额大于10000的订单号和总金额,可以写出如下的sql语句
select oid, sum(subtotal) from orderitem group by oid having sum(subtotal) > 10000;
当然,having也可用于多表分组查询中
对于sql查询语句的子句执行顺序如下:
(1)from子句: 先确定从哪个表格中获取数据,如果有join关键字,则先进行多表的连接
(2)where子句:从获取的表中筛选出符合where子句条件的行;
(3)group by子句:筛选过后,对所有行进行分组
(4)having子句:分组后,通过having子句的筛选获取符合条件的组;
(5)select子句:选取我们需要查询的列或者列的组合运算(聚合函数);
(6)union子句:将选取出的数据放到一起;
(7)order by子句:将选好的列按照一定规则排列显示;