SQL语法

SQL语法

SELECT、INSERT、UPDATE 和 DELETE

基本术语:

  • 事务(transaction)指一组 SQL 语句;
  • 回退(rollback)指撤销指定 SQL 语句的过程;
  • 提交(commit)指将未存储的 SQL 语句结果写入数据库表;
  • 保留点(savepoint)指事务处理中设置的临时占位符(placeholder),你可以对它发布回退(与回退整个事务处理不同)。

不能回退 SELECT 语句,回退 SELECT 语句也没意义;也不能回退 CREATE 和 DROP 语句。

MySQL 的事务提交默认是隐式提交,每执行一条语句就把这条语句当成一个事务然后进行提交。当出现 START TRANSACTION 语句时,会关闭隐式提交;当 COMMIT 或 ROLLBACK 语句执行后,事务会自动关闭,重新恢复隐式提交。

设置 autocommit 为 0 可以取消自动提交;autocommit 标记是针对每个连接而不是针对服务器的。

如果没有设置保留点,ROLLBACK 会回退到 START TRANSACTION 语句处;如果设置了保留点,并且在 ROLLBACK 中指定该保留点,则会回退到该保留点。

  • 创建、修改、删除
## 注释
SELECT *
FROM mytable; -- 注释
/* 注释1
   注释2 */

CREATE DATABASE test;
USE test;

CREATE TABLE mytable (
  # int 类型,不为空,自增
  id INT NOT NULL AUTO_INCREMENT,
  # int 类型,不可为空,默认值为 1,不为空
  col1 INT NOT NULL DEFAULT 1,
  # 变长字符串类型,最长为 45 个字符,可以为空
  col2 VARCHAR(45) NULL,
  # 日期类型,可为空
  col3 DATE NULL,
  # 设置主键为 id
  PRIMARY KEY (`id`));
  
  ---------------------------修改
  alter table mytable add col char(20)
  alter table mytable drop column col
  drop table mytable

  ----------------------------插入
  insert into mytable(col1,col2) values(val1,val2)
  insert into mytable(col1,col2) select col1,col2 from mytable2
  create table newtable as select * from mytable

  ------------------------------更新
  update mytable set col = val where id = 1;
  
 --------------------------------删除
 #使用更新和删除操作时一定要用 WHERE 子句,不然会把整张表的数据都破坏。可以先用 SELECT 语句进行测试,防止错误删除
 	delete from mytable where id = 1
 	truncate table mytable
  • 查询1

    #相同值只会出现一次,所有列的值都相同才相同
    select distinct col1,col2 from mytable 
    
    #限制返回的行数,limit 起始行,结束行
    select * from mytable limit 5;
    select * from mytable limit 2,3;
    select * from mytable limit 0,5;
    
    #排序asc desc
    select * from mytable order by col1 desc,col2 asc;
    
    #过滤{= < >} ,{<>!=(不等于)},between ,is null
    select * from mytable where col is null;
    /*
    1.应该注意到,NULL 与 0、空字符串都不同。
    2.AND 和 OR 用于连接多个过滤条件。优先处理 AND,当一个过滤表达式涉及到多个 AND 和 OR 时,可以使用 () 来决定优先级,使得优先级关系更清晰。
    3.IN 操作符用于匹配一组值,其后也可以接一个 SELECT 子句,从而匹配子查询得到的一组值。
    4.NOT 操作符用于否定一个条件。*/
    
    #通配符 like [] % _,不要滥用会影响速度
    select * from mytable where col like '[^AB]%';
    
    #select as 计算字段也就是表达式时用取别名
    SELECT CONCAT(TRIM(col1), '(', TRIM(col2), ')') AS concat_col FROM mytable;
    
    #函数 avg()列的平均值,count()列的行数,max() min()列的最大值和最小值,sum()返回某列值之和
    from avg(distict col1) as avg_col from mytable
    
  • 查询2

    #分组group by 把具有相同数据值的行放在同一组中,可对同一分组数据使用汇总函数如求分组数据的平均值;指定分组字段除了能按字段进行分组,也会自动按该字段进行排序
    #where - group by - oder by,where过滤行,having过滤分组,先过滤行再过滤分组
    #null行单独分为一组,
    select col,count(*) as num from mytable group by col;
    select col,count(*) as num from mytable where col > 2 group by col having num >=2;
    
    #略:子查询,可用连接代替
    - 子查询必须在圆括号中
    - 子查询的select子句只能油一列,除非主查询有多个列,用于与子查询选中的列相比较
    - 子查询不能用order by,可以用groupy by代替
    select * from mytable1 where col1 in(select col2 from mytable2);
    select cust_name , (select count(*) from orders where orders.cust_id = customers.cust_id) as oders_num from custommers order by cust_name;#查询客户的订单数量,子查询语句会对第一个查询检索出的每个客户执行一次
    
  • 查询3 -连接,组合查询,视图

    -关于on、where、having的区别:on是最先执行,where次之,having最后。
    on是在生成中间的临时表时起作用的,在两个表联接时才用on,where,having是生成临时表之后对连接表再进行过滤所以在一个表的时候,就剩下where跟having比较

    ---inner/left/right join on(注意这里是on不要用where)
    1 内连接
    select A.value, B.value from tablea as A inner join tableb as B on A.key = B.key;#相当于select A.value, B.value from tablea as A , tableb as B where A.key = B.key
    2 自连接-内连接的一种,连接的表是自身
    如:一张员工表,包含员工姓名和员工所属部门,要找出与 Jim 处在同一部门的所有员工姓名。
    select e1.name from employee as e1 inner join employee as e2 on e1.department = e2.department and e2.name = 'jim';
    #相当于select name from employee where department = (select department from employee where name = 'jim');
    3外连接,右连接不常用,用left join 以左表为基准取并集从结果集查找,用having 代替where(注意这里onhaving的区别
    
    -检索所有顾客的订单信息,包括还没有订单信息的顾客。
    select Customers.cust_id,Customer.cust_name, Orders.order_id from Customers left outer join orders on Customers.cust_id = orders.cust_id;
    
    ----组合查询union组合两个查询,如果第一个查询返回 M 行,第二个查询返回 N 行,那么组合查询的结果一般为 M+N 行
    SELECT col FROM mytable WHERE col = 1
    UNION
    SELECT col FROM mytable WHERE col =2
    
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值