jjzjj

MySQL—— DDL 、DML、DQL语句

背对背依靠 2023-03-28 原文
DDL:数据定义语言

注意:对表操作的时候需要进入到对应的数据库里面去。

创建表:CREATE TABLE [IF NOT EXISTS] 'tbl_name' ( 字段1 修饰符, col2 字段2 修饰符, ...)

例如:创建一张名为stu1的表,表中包含的字段有id,name和age,id的数据类型是int,且是主键并且自动增长。

mysql> create table stu1 (id int primary key auto_increment,name varchar(20) not null, age tinyint unsigned);
Query OK, 0 rows affected (0.06 sec)

mysql> show tables;
+-------------------+
| Tables_in_student |
+-------------------+
| stu1              |
+-------------------+
1 row in set (0.00 sec)
查看表
  • 查看表列表

  • 查看创建表的命令

  • 查看表结构(字段)信息

  • 查看表属性信息

查看表:show tables [from db_name]

注意:不加db_name,默认查看的是当前数据库里面的所有表。

mysql> show tables from student;
+-------------------+
| Tables_in_student |
+-------------------+
| stu1              |
+-------------------+
1 row in set (0.00 sec)
查看创建表的命令:SHOW CREATE TABLE tbl_name
mysql> show create table stu1 \G
*************************** 1. row ***************************
       Table: stu1
Create Table: CREATE TABLE `stu1` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) NOT NULL,
  `age` tinyint(3) unsigned DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
查看表的结构(字段)信息:
  • desc tb_name

  • SHOW COLUMNS FROM [db_name.]tb_name

mysql> desc stu1;
+-------+---------------------+------+-----+---------+----------------+
| Field | Type                | Null | Key | Default | Extra          |
+-------+---------------------+------+-----+---------+----------------+
| id    | int(11)             | NO   | PRI | NULL    | auto_increment |
| name  | varchar(20)         | NO   |     | NULL    |                |
| age   | tinyint(3) unsigned | YES  |     | NULL    |                |
+-------+---------------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

查看表的属性信息:show table status like 'tb_name'

注意:mysq客户端的ego--(\G)命令可以垂直显示结果

*************************** 1. row ***************************
           Name: stu1
         Engine: InnoDB
        Version: 10
     Row_format: Compact
           Rows: 6
 Avg_row_length: 2730
    Data_length: 16384
Max_data_length: 0
   Index_length: 0
      Data_free: 0
 Auto_increment: 10
    Create_time: 2022-09-09 00:56:44
    Update_time: NULL
     Check_time: NULL
      Collation: utf8_general_ci
       Checksum: NULL
 Create_options: 
        Comment: 
1 row in set (0.00 sec)
修改表:
#修改表名
ALTER TABLE students RENAME s1;

#添加字段
ALTER TABLE s1 ADD phone varchar(11) AFTER name;

#修改字段类型
ALTER TABLE s1 MODIFY phone int;

#修改字段名称和类型
ALTER TABLE s1 CHANGE COLUMN phone mobile char(11);

#删除字段
ALTER TABLE s1 DROP COLUMN mobile;

#修改字符集
ALTER TABLE s1 character set utf8;

#修改数据类型和字符集
ALTER TABLE s1 change name name varchar(20) character set utf8;

#添加字段
ALTER TABLE students ADD gender ENUM('m','f');

alter table student modify is_del bool default false;


#修改字段名和类型
ALETR TABLE students CHANGE id sid int UNSIGNED NOT NULL PRIMARY KEY;

#删除字段
ALTER TABLE students DROP age;

#查看表结构
DESC students;

#新建表无主键,添加和删除主键
CREATE TABLE t1 SELECT * FROM students;

ALTER TABLE t1 add primary key (stuid);

ALTER TABLE t1 drop primary key ;


#添加外键
ALTER TABLE students add foreign key(TeacherID) references teachers(tid);

#删除外键
SHOW CREATE TABLE students 

#查看外键名
ALTER TABLE students drop foreign key <外键名>;
DML:数据操纵语言(insert、updete、delete)

注意:设计字符类型的数据类型,进行操作的时候要加上引号(单双都可以)

INSERT 语句:insert tb_name(col1...coln) values (value1...valuen)

例如:

mysql> insert stu1(name,age) values('tom',10);
Query OK, 1 row affected (0.01 sec)

全值插入:不指定col

mysql> insert stu1 values(3,'BOB',20);
Query OK, 1 row affected (0.00 sec)

UPDATE 语句

注意:使用update语句的时候需要指定限制条件,不然将修改所有行的指定字段

mysql> update stu1 set name='bob' where name='BOB';
Query OK, 2 rows affected (0.00 sec)
Rows matched: 2  Changed: 2  Warnings: 0

mysql> select * from stu1;
+----+------+------+
| id | name | age  |
+----+------+------+
|  1 | tom  |   10 |
|  2 | bob  |   20 |
|  3 | bob  |   20 |
+----+------+------+
3 rows in set (0.00 sec)

可以通过在配置文件指定选项来避免这个错误。

[root@centos8 ~]#vim /etc/my.cnf
[mysql]
safe-updates

删除指定的记录:

ysql> delete from stu1 where id=3 ;
Query OK, 1 row affected (1.68 sec)

mysql> select * from stu1 ;
+----+------+------+
| id | name | age  |
+----+------+------+
|  1 | tom  |   10 |
|  2 | bob  |   20 |
+----+------+------+
2 rows in set (0.00 sec)

删除数据: delete from tb_name where 限制条件

注意:不加限制条件会清空表里面的所有数据。

mysql> delete from stu1 where  id=5;
Query OK, 1 row affected (0.00 sec)

mysql> select * from stu1;
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  1 | tom    |   10 |
|  2 | bob    |   20 |
|  4 | bob2   |   22 |
|  6 | bob5=3 |   25 |
|  7 | bob5   |   26 |
|  8 | tom2   | NULL |
+----+--------+------+
6 rows in set (0.00 sec)
清空数据表,保留表结构的方法;
  • delete from tb_name(不会缩减数据文件的大小)

  • TRUNCATE TABLE tbl_name(会自动缩减数据文件的大小)

  • 缩减表的大小:OPTIMIZE TABLE tb_name

DQL:数据查询语言(select)
select查询
  • 单表操作

  • 多表操作

针对单表操作:
简单查询:select 需要查询得字段 from tb_name where 限制条件
  • 指定字段别名

范例:字段显示的时候使用别名

mysql> select id as '编号',name as '名字',age as '年龄' from stu1;
+--------+--------+--------+
| 编号   | 名字   | 年龄   |
+--------+--------+--------+
|      1 | tom    |     10 |
|      2 | bob    |     20 |
|      3 | bob    |     20 |
+--------+--------+--------+
3 rows in set (0.00 sec)
  • select可以实现加减乘除运算
mysql> select 1+2+3*4-5+9;
+-------------+
| 1+2+3*4-5+9 |
+-------------+
|          19 |
+-------------+
1 row in set (0.00 sec)

  • select可以实现比较的操作(大于、小于、等于等)
mysql> select 1>99;
+------+
| 1>99 |
+------+
|    0 |
+------+
1 row in set (0.00 sec)

mysql> select 1<99;
+------+
| 1<99 |
+------+
|    1 |
+------+
1 row in set (0.00 sec)
  • BETWEEN:查询一个范围: BETWEEN min_num AND max_num
mysql> select * from stu1 where age  between 20 and 25;
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  2 | bob    |   20 |
|  4 | bob2   |   22 |
|  5 | bob2=3 |   24 |
|  6 | bob5=3 |   25 |
+----+--------+------+
4 rows in set (0.00 sec)
  • IN:实现不连续的查询: IN (element1, element2, ...)
mysql> select * from stu1 where age in(10,20,25);
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  1 | tom    |   10 |
|  2 | bob    |   20 |
|  6 | bob5=3 |   25 |
+----+--------+------+
3 rows in set (0.00 sec)

  • 空查询: IS NULL, IS NOT NULL
mysql> select * from stu1 where age is null;
+----+------+------+
| id | name | age  |
+----+------+------+
|  8 | tom2 | NULL |
+----+------+------+
1 row in set (0.01 sec)

mysql> select * from stu1 where age is NOT null;
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  1 | tom    |   10 |
|  2 | bob    |   20 |
|  4 | bob2   |   22 |
|  5 | bob2=3 |   24 |
|  6 | bob5=3 |   25 |
|  7 | bob5   |   26 |
+----+--------+------+
6 rows in set (0.00 sec)

  • DISTINCT: 去除重复行
mysql> select * from stu1;
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  1 | tom    |   10 |
|  2 | bob    |   20 |
|  4 | bob2   |   22 |
|  5 | bob2=3 |   24 |
|  6 | bob5=3 |   25 |
|  7 | bob5   |   26 |
|  8 | tom2   | NULL |
|  9 | bob    |   20 |
+----+--------+------+
8 rows in set (0.00 sec)

mysql> select distinct * from stu1;
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  1 | tom    |   10 |
|  2 | bob    |   20 |
|  4 | bob2   |   22 |
|  5 | bob2=3 |   24 |
|  6 | bob5=3 |   25 |
|  7 | bob5   |   26 |
|  8 | tom2   | NULL |
|  9 | bob    |   20 |
+----+--------+------+
8 rows in set (0.00 sec)
  • like: 模糊查询: LIKE 使用 % 表示任意长度的任意字符 _ 表示任意单个字符
#like 后面的字符需要用引号括起来,可以是单引号,也可以是双引号
mysql> SELECT * from stu1 where age like '1%';
+----+------+------+
| id | name | age  |
+----+------+------+
|  1 | tom  |   10 |
+----+------+------+
1 row in set (0.00 sec)
  • 逻辑操作符:NOT,AND,OR,XOR
group by:根据指定的条件把查询结果进行"分组"以用于做"聚合"运算

group by通常结合聚合函数来使用。常用聚合函数: count(), sum(), max(), min(), avg(),注意:聚合函数不对null统计

注意:
  • 一旦对表进行分组以后,select后面的字段要么是聚合函数要么就是分组的字段。

  • group by(分组后)的后面加条件必须用having

  • gtoup by(分组前)的前面加条件可以用where

例如:按照姓名来进行分组,统计每个姓名都有多少人。

mysql> select * from stu1;
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  1 | tom    |   10 |
|  2 | bob    |   20 |
|  4 | bob2   |   22 |
|  5 | bob2=3 |   24 |
|  6 | bob5=3 |   25 |
|  7 | bob5   |   26 |
|  8 | tom2   | NULL |
|  9 | bob    |   20 |
+----+--------+------+
8 rows in set (0.00 sec)

mysql> select name , count(*) from stu1 group by name;
+--------+----------+
| name   | count(*) |
+--------+----------+
| bob    |        2 |
| bob2   |        1 |
| bob2=3 |        1 |
| bob5   |        1 |
| bob5=3 |        1 |
| tom    |        1 |
| tom2   |        1 |
+--------+----------+
ORDER BY: 根据指定的字段对查询结果进行排序
  • 升序:ASC

  • 降序:DESC

mysql> select * from stu1 order by age desc;
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  7 | bob5   |   26 |
|  6 | bob5=3 |   25 |
|  5 | bob2=3 |   24 |
|  4 | bob2   |   22 |
|  2 | bob    |   20 |
|  9 | bob    |   20 |
|  1 | tom    |   10 |
|  8 | tom2   | NULL |
+----+--------+------+
8 rows in set (0.00 sec)

mysql> select * from stu1 order by age asc;
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  8 | tom2   | NULL |
|  1 | tom    |   10 |
|  2 | bob    |   20 |
|  9 | bob    |   20 |
|  4 | bob2   |   22 |
|  5 | bob2=3 |   24 |
|  6 | bob5=3 |   25 |
|  7 | bob5   |   26 |
+----+--------+------+
8 rows in set (0.00 sec)

LIMIT [[offset,]row_count]:对查询的结果进行输出行数数量限制,跳过offset,显示row_count行,offset默为值为0

例如:limit 3,5表示的就是跳过前三个,只显示五条记录。实现分页显示。

mysql> select * from stu1;
+----+---------+------+
| id | name    | age  |
+----+---------+------+
|  1 | tom     |   10 |
|  2 | bob     |   20 |
|  4 | bob2    |   22 |
|  6 | bob5=3  |   25 |
|  7 | bob5    |   26 |
|  8 | tom2    | NULL |
| 10 | liyi    |   25 |
| 11 | lier    |   26 |
| 12 | zhangwu |   22 |
| 13 | xiaosi  |   30 |
| 14 | wuad    |   40 |
+----+---------+------+
11 rows in set (0.00 sec)

mysql> select * from stu1 limit 3,5;
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  6 | bob5=3 |   25 |
|  7 | bob5   |   26 |
|  8 | tom2   | NULL |
| 10 | liyi   |   25 |
| 11 | lier   |   26 |
+----+--------+------+
5 rows in set (0.00 sec)

例如:显示年龄最小的五个(会自动去掉重复的)

mysql> select * from stu1  order by age;
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  8 | tom2   | NULL |
|  1 | tom    |   10 |
|  2 | bob    |   20 |
|  9 | bob    |   20 |
|  4 | bob2   |   22 |
|  5 | bob2=3 |   24 |
|  6 | bob5=3 |   25 |
|  7 | bob5   |   26 |
+----+--------+------+
8 rows in set (0.00 sec)

mysql> select * from stu1  order by age limit 5;
+----+------+------+
| id | name | age  |
+----+------+------+
|  8 | tom2 | NULL |
|  1 | tom  |   10 |
|  2 | bob  |   20 |
|  9 | bob  |   20 |
|  4 | bob2 |   22 |
+----+------+------+
5 rows in set (0.00 sec)

多表查询:查询的结果来自于多张表。
多表查询的方法:
  • 子查询:在SQL语句嵌套着查询语句,性能较差,基于某语句的查询结果再次进行的查询

  • 联合查询:UNION ,两张表纵向合并形成一个大表

  • 交叉连接:笛卡尔乘积 CROSS JOIN ,横向连接,把第一个表的每条记录都和第二张表进行组合,从而形成一个大表

  • 内连接:取两张表得交集(都符合条件得那一部分)

  • 外连接:outer inner
    左外连接:左边表的全部内容+交集部分,FROM tb1 LEFT JOIN tb2 ON tb1.col=tb2.col
    右外连接:右边表的全部内容+交集部分,FROM tb1 RIGHT JOIN tb2 ON tb1.col=tb2.col

子查询:一个查询结果作为另一个查询的条件。

例如:

mysql> select * from stu1 where age >(select avg(age) from stu1);
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  4 | bob2   |   22 |
|  5 | bob2=3 |   24 |
|  6 | bob5=3 |   25 |
|  7 | bob5   |   26 |
+----+--------+------+
4 rows in set (0.00 sec)

union:联合查询 ,将两张表纵向合并,合成一个新的大表

前提:

  • 字段(列)需要保持一致。

  • 数据类型要匹配

mysql> select * from stu1 union select * from teach;
+----+-----------+------+
| id | name      | age  |
+----+-----------+------+
|  1 | tom       |   10 |
|  2 | bob       |   20 |
|  4 | bob2      |   22 |
|  5 | bob2=3    |   24 |
|  6 | bob5=3    |   25 |
|  7 | bob5      |   26 |
|  8 | tom2      | NULL |
|  1 | zhang san |   40 |
|  2 | li si     |   45 |
|  3 | wang wu   |   46 |
+----+-----------+------+
10 rows in set (0.00 sec)
交叉连接: cross join (横向笛卡尔积)
  • 横向合并:把第一个表的每条记录都和第二张表进行组合,从而形成一个大表。(笛卡尔乘积)

  • 最终生成的记录数:A表的记录数*B表的记录数

注意:交叉连接慎用,同意造成数据库死机

mysql> select * from stu1
    -> cross join
    -> teach;
+----+--------+------+-----+-----------+------+
| id | name   | age  | TID | NAME      | age  |
+----+--------+------+-----+-----------+------+
|  1 | tom    |   10 |   1 | zhang san |   40 |
|  1 | tom    |   10 |   2 | li si     |   45 |
|  1 | tom    |   10 |   3 | wang wu   |   46 |
|  2 | bob    |   20 |   1 | zhang san |   40 |
|  2 | bob    |   20 |   2 | li si     |   45 |
|  2 | bob    |   20 |   3 | wang wu   |   46 |
|  4 | bob2   |   22 |   1 | zhang san |   40 |
|  4 | bob2   |   22 |   2 | li si     |   45 |
|  4 | bob2   |   22 |   3 | wang wu   |   46 |
|  5 | bob2=3 |   24 |   1 | zhang san |   40 |
|  5 | bob2=3 |   24 |   2 | li si     |   45 |
|  5 | bob2=3 |   24 |   3 | wang wu   |   46 |
|  6 | bob5=3 |   25 |   1 | zhang san |   40 |
|  6 | bob5=3 |   25 |   2 | li si     |   45 |
|  6 | bob5=3 |   25 |   3 | wang wu   |   46 |
|  7 | bob5   |   26 |   1 | zhang san |   40 |
|  7 | bob5   |   26 |   2 | li si     |   45 |
|  7 | bob5   |   26 |   3 | wang wu   |   46 |
|  8 | tom2   | NULL |   1 | zhang san |   40 |
|  8 | tom2   | NULL |   2 | li si     |   45 |
|  8 | tom2   | NULL |   3 | wang wu   |   46 |
+----+--------+------+-----+-----------+------+
21 rows in set (0.00 sec)
内连接:inner join 取两张表横向合并交集(两张表都符合条件的部分)

注意:内连接的条件要使用on来进行连接。

mysql> select * from stu1 inner join teach on stu1.id=teach.TID;
+----+------+------+-----+-----------+------+
| id | name | age  | TID | NAME      | age  |
+----+------+------+-----+-----------+------+
|  1 | tom  |   10 |   1 | zhang san |   40 |
|  2 | bob  |   20 |   2 | li si     |   45 |
+----+------+------+-----+-----------+------+
2 rows in set (0.00 sec)

#挑选对应想要的字段
mysql> select stu1.id,stu1.name,teach.name  from stu1 inner join teach on stu1.id=teach.TID;
+----+------+-----------+
| id | name | name      |
+----+------+-----------+
|  1 | tom  | zhang san |
|  2 | bob  | li si     |
+----+------+-----------+
2 rows in set (0.00 sec)


对表起别名:直接在表名后面加别名
mysql> select s.id,s.name,t.name  from stu1 s inner join teach t on s.id=t.TID;
+----+------+-----------+
| id | name | name      |
+----+------+-----------+
|  1 | tom  | zhang san |
|  2 | bob  | li si     |
+----+------+-----------+
2 rows in set (0.00 sec)

外连接:outer join
  • 左外连接:left join

  • 右外连接:right join

左外连接:left join 左边表的全部内容+交集部分
mysql> select stu1.id,stu1.name,teach.name  from stu1 left join teach on stu1.id=teach.TID;
+----+--------+-----------+
| id | name   | name      |
+----+--------+-----------+
|  1 | tom    | zhang san |
|  2 | bob    | li si     |
|  4 | bob2   | NULL      |
|  5 | bob2=3 | NULL      |
|  6 | bob5=3 | NULL      |
|  7 | bob5   | NULL      |
|  8 | tom2   | NULL      |
+----+--------+-----------+
7 rows in set (0.00 sec)
右外连接: right join 右边表的全部内容+交集部分
mysql> select stu1.id,stu1.name,teach.name  from stu1 right  join teach on stu1.id=teach.TID;
+------+------+-----------+
| id   | name | name      |
+------+------+-----------+
|    1 | tom  | zhang san |
|    2 | bob  | li si     |
| NULL | NULL | wang wu   |
+------+------+-----------+
3 rows in set (0.00 sec)

有关MySQL—— DDL 、DML、DQL语句的更多相关文章

  1. ruby - 如何在 Ruby 中向现有方法定义添加语句 - 2

    我注意到类定义,如果我打开classMyClass,并在不覆盖的情况下添加一些东西我仍然得到了之前定义的原始方法。添加的新语句扩充了现有语句。但是对于方法定义,我仍然想要与类定义相同的行为,但是当我打开defmy_method时似乎,def中的现有语句和end被覆盖了,我需要重写一遍。那么有什么方法可以使方法定义的行为与定义相同,类似于super,但不一定是子类? 最佳答案 我想您正在寻找alias_method:classAalias_method:old_func,:funcdeffuncold_func#similartoca

  2. 使用canal同步MySQL数据到ES - 2

    文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co

  3. ruby - ruby 乘法语句中星号中断语法前的空格 - 2

    在添加一些空格以使代码更具可读性时(与上面的代码对齐),我遇到了这个:classCdefx42endendm=C.new现在这将给出“错误数量的参数”:m.x*m.x这将给出“语法错误,意外的tSTAR,期待$end”:2/m.x*m.x这里的解析器到底发生了什么?我使用Ruby1.9.2和2.1.5进行了测试。 最佳答案 *用于运算符(42*42)和参数解包(myfun*[42,42])。当你这样做时:m.x*m.x2/m.x*m.xRuby将此解释为参数解包,而不是*运算符(即乘法)。如果您不熟悉它,参数解包(有时也称为“spl

  4. ruby - 有没有办法从 ruby​​ case 语句中访问表达式? - 2

    我想从then子句中访问c​​ase语句表达式,即food="cheese"casefoodwhen"dip"then"carrotsticks"when"cheese"then"#{expr}crackers"else"mayo"end在这种情况下,expr是食物的当前值(value)。在这种情况下,我知道,我可以简单地访问变量food,但是在某些情况下,该值可能无法再访问(array.shift等)。除了将expr移出到局部变量然后访问它之外,是否有直接访问caseexpr值的方法?罗亚附注我知道这个具体示例很简单,只是一个示例场景。 最佳答案

  5. ruby - 在 Ruby 的 if 语句中检查 bash 命令 - 2

    如何在Ruby的if语句中检查bash命令的返回值(true/false)。我想要这样的东西,if("/usr/bin/fswscell>/dev/null2>&1")has_afs="true"elsehas_afs="false"end它会提示以下错误含义,它总是返回true。(irb):5:warning:stringliteralincondition正确的语法是什么?更新:/usr/bin/fswscell寻找afs安装和运行状态。它会抛出这样的字符串,Thisworkstationbelongstocell如果afs没有运行,命令以状态1退出 最

  6. ruby-on-rails - 无法安装 mysql2 0.3.14 gem - 2

    我看到其他人也遇到过类似的问题,但没有一个解决方案对我有用。0.3.14gem与其他gem文件一起存在。我已经完全按照此处指示完成了所有操作:https://github.com/brianmario/mysql2.我仍然得到以下信息。我不知道为什么安装程序指示它找不到include目录,因为我已经检查过它存在。thread.h文件存在,但不在ruby​​目录中。相反,它在这里:C:\RailsInstaller\DevKit\lib\perl5\5.8\msys\CORE\我正在运行Windows7并尝试在Aptana3中构建我的Rails项目。我的Ruby是1.9.3。$gemin

  7. ruby - 变量赋值后的 if 语句 - 有多常见? - 2

    我最近与一位同事讨论了以下Ruby语法:value=ifa==0"foo"elsifa>42"bar"else"fizz"end我个人并没有看到太多这种逻辑,但我的同事指出,这实际上是一种相当普遍的Rubyism。我试着用谷歌搜索这个主题,但没有找到任何文章、页面或SO问题来讨论它,这让我相信这可能是一种非常实际的技术。然而,另一位同事发现语法令人困惑,而是将上面的逻辑写成这样:ifa==0value="foo"elsifa>42value="bar"elsevalue="fizz"end缺点是value=的重复声明和隐式elsenil的丢失,如果我们想使用它的话。这也感觉它与Ruby

  8. ruby - 如何使用 ruby​​ mysql2 执行事务 - 2

    我已经开始使用mysql2gem。我试图弄清楚一些基本的事情——其中之一是如何明确地执行事务(对于批处理操作,比如多个INSERT/UPDATE查询)。在旧的ruby-mysql中,这是我的方法:client=Mysql.real_connect(...)inserts=["INSERTINTO...","UPDATE..WHEREid=..",#etc]client.autocommit(false)inserts.eachdo|ins|beginclient.query(ins)rescue#handleerrorsorabortentirelyendendclient.commi

  9. ruby - 当你有一个没有参数的 case 语句并且 when 子句是 lambda 时会发生什么? - 2

    这段代码没有像我预期的那样执行:casewhen->{false}then"why?"else"ThisiswhatIexpect"end#=>"why?"这也不是casewhen->(x){false}then"why?"else"ThisiswhatIexpect"end#=>"why?"第一个then子句在两种情况下都被执行,这意味着我提供给when子句的lambda没有被调用。我知道无论when子句的主题是什么,都应该调用大小写相等运算符===。我想知道当没有为case提供参数时,===的另一边会发生什么。我在想它可能是nil,但它不可能是:->{false}===nil#=>

  10. Ruby:用于检查 nil/false 条件语句的干净代码? - 2

    我总是遇到这个Ruby问题,我想把它写得更干净。varacanbenila.valuecanalsobenila.valuehaspossibletrueorfalsevalueif(nota.nil?)&&(nota.value.nil?)&&a.value==falseputs"avalueisnotavailable"elseputs"avalueistrue"end问题在于条件语句过于笨拙且难以阅读。如何改进检查nil和false条件语句?谢谢,我是Ruby新手 最佳答案 Rubyonrails有一个叫做try的扩展,它允许

随机推荐