SQL基础语句

2019-02-21  本文已影响0人  Ew0828

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子句:将选好的列按照一定规则排列显示;

上一篇下一篇

猜你喜欢

热点阅读