美文网首页
SQL基础语句

SQL基础语句

作者: Ew0828 | 来源:发表于2019-02-21 20:07 被阅读0次

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

    相关文章

      网友评论

          本文标题:SQL基础语句

          本文链接:https://www.haomeiwen.com/subject/ppygaftx.html