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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容

  • MYSQL 基础知识 1 MySQL数据库概要 2 简单MySQL环境 3 数据的存储和获取 4 MySQL基本操...
    Kingtester阅读 7,772评论 5 116
  • 查询:select * from table_name where 条件 查询的结果集中使用别名:select 列...
    約見阅读 427评论 0 0
  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 5,161评论 0 9
  • 理性 生于宁静平和的内心 归于灵魂之上的智慧 表现在你以平静的心态专心一意做着的事以及你持之以恒的良好习惯 如你早...
    Ceno阅读 236评论 0 3
  • 想吸引他的注意,凑得太近跌份,离的太远刷不到好感。很多妹子在进退两难之间生生把相思熬成毒,自己感动得一把鼻涕一把泪...
    章魚姬阅读 833评论 1 4