注意:对表操作的时候需要进入到对应的数据库里面去。
例如:创建一张名为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)
查看表列表
查看创建表的命令
查看表结构(字段)信息
查看表属性信息
注意:不加db_name,默认查看的是当前数据库里面的所有表。
mysql> show tables from student;
+-------------------+
| Tables_in_student |
+-------------------+
| stu1 |
+-------------------+
1 row in set (0.00 sec)
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)
注意: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 <外键名>;
注意:设计字符类型的数据类型,进行操作的时候要加上引号(单双都可以)
例如:
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语句的时候需要指定限制条件,不然将修改所有行的指定字段
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)
注意:不加限制条件会清空表里面的所有数据。
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
单表操作
多表操作
范例:字段显示的时候使用别名
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)
mysql> select 1+2+3*4-5+9;
+-------------+
| 1+2+3*4-5+9 |
+-------------+
| 19 |
+-------------+
1 row in set (0.00 sec)
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)
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)
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)
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)
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 后面的字符需要用引号括起来,可以是单引号,也可以是双引号
mysql> SELECT * from stu1 where age like '1%';
+----+------+------+
| id | name | age |
+----+------+------+
| 1 | tom | 10 |
+----+------+------+
1 row in set (0.00 sec)
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 |
+--------+----------+
升序: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 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)
前提:
字段(列)需要保持一致。
数据类型要匹配
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)
横向合并:把第一个表的每条记录都和第二张表进行组合,从而形成一个大表。(笛卡尔乘积)
最终生成的记录数: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)
注意:内连接的条件要使用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)
左外连接:left join
右外连接:right 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)
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)
我注意到类定义,如果我打开classMyClass,并在不覆盖的情况下添加一些东西我仍然得到了之前定义的原始方法。添加的新语句扩充了现有语句。但是对于方法定义,我仍然想要与类定义相同的行为,但是当我打开defmy_method时似乎,def中的现有语句和end被覆盖了,我需要重写一遍。那么有什么方法可以使方法定义的行为与定义相同,类似于super,但不一定是子类? 最佳答案 我想您正在寻找alias_method:classAalias_method:old_func,:funcdeffuncold_func#similartoca
文章目录一、概述简介原理模块二、配置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
在添加一些空格以使代码更具可读性时(与上面的代码对齐),我遇到了这个: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
我想从then子句中访问case语句表达式,即food="cheese"casefoodwhen"dip"then"carrotsticks"when"cheese"then"#{expr}crackers"else"mayo"end在这种情况下,expr是食物的当前值(value)。在这种情况下,我知道,我可以简单地访问变量food,但是在某些情况下,该值可能无法再访问(array.shift等)。除了将expr移出到局部变量然后访问它之外,是否有直接访问caseexpr值的方法?罗亚附注我知道这个具体示例很简单,只是一个示例场景。 最佳答案
如何在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退出 最
我看到其他人也遇到过类似的问题,但没有一个解决方案对我有用。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
我最近与一位同事讨论了以下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
我已经开始使用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
这段代码没有像我预期的那样执行: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#=>
我总是遇到这个Ruby问题,我想把它写得更干净。varacanbenila.valuecanalsobenila.valuehaspossibletrueorfalsevalueif(nota.nil?)&&(nota.value.nil?)&&a.value==falseputs"avalueisnotavailable"elseputs"avalueistrue"end问题在于条件语句过于笨拙且难以阅读。如何改进检查nil和false条件语句?谢谢,我是Ruby新手 最佳答案 Rubyonrails有一个叫做try的扩展,它允许