msql官方文档学习记录

mysql学习记录mysql.docx:
链接:https://pan.baidu.com/s/1bjAO8IZgxoyZDjvRwo-vJw
提取码:bc76

Mysql
Txt导入mysql
关于mysql官方文档中描述的直接将txt文件中的数据直接导入到mysql数据库中,实际使用过程中是遇到了一些问题的,比如模板上没有明确说明win版本的格式(绝对地址);
文档:
LOAD DATA LOCAL INFILE ‘/path/pet.txt’ INTO TABLE pet LINES TERMINATED BY ‘\r\n’;
实际应用:
LOAD DATA LOCAL INFILE ’ D:\mysqlTest\text.txt’ INTO TABLE pet LINES TERMINATED BY ‘\r\n’
提示:需要根据提示再去找错误 不能总是根据自己的经验去判断盲目的百度会浪费很多时间。
插入单条数据:
mysql> insert into pet values(‘puffball’,‘Diane’,‘hamster’,‘f’,‘1993-03-30’,NULL); Query OK, 1 row affected (0.28 sec);
insert into pet values(‘puffball’,‘Aiane’,‘hamster’,‘f’,‘1996-03-30’,NULL);
insert into pet values(‘puffball’,‘Biane’,‘hamster’,‘f’,‘1997-03-30’,NULL);
insert into pet values(‘puffball’,‘Ciane’,‘hamster’,‘f’,‘1996-07-30’,NULL);
insert into pet values(‘puffball’,‘Hiane’,‘hamster’,‘f’,‘1991-03-30’,NULL);
insert into pet values(‘puffball’,‘Giane’,‘hamster’,‘f’,‘1997-03-25’,NULL);
为了验证你的表是按你期望的方式创建,使用一个DESCRIBE语句:
mysql> DESCRIBE pet;
MySQL ERROR 3948 (42000):
Lading local data is disabled; this must be enabled on both the client and server sides
MySQL错误3948(42000):禁止加载本地数据; 必须在客户端和服务器端都启用此功能
Cmd 窗口的提示明显告知不能直接在cmd窗口中使用的,需要在客户端中才能使用这个导入的功能。
查询数据空中的数据:
mysql> SELECT * FROM pet; ±---------±------±--------±-----±-----------±------+ | name | owner | species | sex | birth | death | ±---------±------±--------±-----±-----------±------+ | puffball | Diane | hamster | f | 1993-03-30 | NULL | ±---------±------±--------±-----±-----------±------+ 1 row in set (0.00 sec)
查询指定的列并且指定的列按顺序排列{降序} mysql> SELECT name, birth FROM pet ORDER BY birth DESC; ±---------±-----------+ | name | birth | ±---------±-----------+ | puffball | 1997-03-30 | | puffball | 1997-03-25 | | puffball | 1996-07-30 | | puffball | 1996-03-30 | | puffball | 1993-03-30 | | puffball | 1991-03-30 | ±---------±-----------+ 6 rows in set (0.00 sec)

日期函数:
只是知道动物的出生时间 计算各个动物的年龄的问题
mysql> select name,birth,curdate(),(year(curdate())-year(birth))-(right(curdate(),5)<right(birth,5)) as age from pet;
±---------±-----------±-----------±-----+ | name | birth | curdate() | age | ±---------±-----------±-----------±-----+ | puffball | 1993-03-30 | 2020-02-22 | 26 | | puffball | 1996-03-30 | 2020-02-22 | 23 | | puffball | 1997-03-30 | 2020-02-22 | 22 | | puffball | 1996-07-30 | 2020-02-22 | 23 | | puffball | 1991-03-30 | 2020-02-22 | 28 | | puffball | 1997-03-25 | 2020-02-22 | 22 | ±---------±-----------±-----------±-----+ 6 rows in set (0.03 sec)
对于日期函数中的right函数 文档中也有解释不需要去百度 百度关键字效果不佳。 Right(具体字段,需要取出的靠右边的位数).后面的减去的部分 是因为 0或者1;

模糊查询,分组统计。
文档前面部分都是对其中一个表进行处理
创建一个以上的表
创建表
mysql> create table event (name VARCHAR(20),data DATE,type VARCHAR(15),remark VARCHAR(25));
查询创建后的表的结构
Mysql> describe event;
±-------±------------±-----±----±--------±------+ | Field | Type | Null | Key | Default | Extra | ±-------±------------±-----±----±--------±------+ | name | varchar(20) | YES | | NULL | | | data | date | YES | | NULL | | | type | varchar(15) | YES | | NULL | | | remark | varchar(25) | YES | | NULL | | ±-------±------------±-----±----±--------±------+ 4 rows in set (0.00 sec)

为了将两个表能够进行联系,根据文档建立一样的pet表
name owner species sex birth death
Fluffy Harold cat f 1993-02-04
Claws Gwen cat m 1994-03-17
Buffy Harold dog f 1989-05-13
Fang Benny dog m 1990-08-27
Bowser Diane dog m 1979-08-31 1995-07-29
Chirpy Gwen bird f 1998-09-11
Whistler Gwen bird 1997-12-09
Slim Benny snake m 1996-04-29

insert into pet values(‘Fluffy’,‘Harold’,‘cat’,‘f’,‘1993-02-04’,NULL);
insert into pet values(‘Claws’,‘Gwen’,‘cat’,‘m’,‘1994-03-17’,NULL);
insert into pet values(“Buffy”,”Harold”,”dog”,”f”,”1989-05-13”,NULL);
insert into pet values(‘Fang’,‘Benny’,‘dog’,‘m’,‘1990-08-27’,NULL);
insert into pet values(‘Bowser’,‘Diane’,‘dog’,‘m’,‘1979-08-31’,1995-07-29);
insert into pet values(‘Chirpy’,‘Gwen’,‘bird’,‘f’,‘1998-09-11’,NULL);
insert into pet values(‘Whistler’,‘Gwen’,‘bird’,’\N’,‘1997-12-09’,NULL);
insert into pet values(‘Slim’,‘Benny’,‘snake’,‘m’,‘1996-04-29’,NULL);

name date type remark
Fluffy 1995-05-15 litter 4 kittens, 3 female, 1 male
Buffy 1993-06-23 litter 5 puppies, 2 female, 3 male
Buffy 1994-06-19 litter 3 puppies, 3 female
Chirpy 1999-03-21 vet needed beak straightened
Slim 1997-08-03 vet broken rib
Bowser 1991-10-12 kennel
Fang 1991-10-12 kennel
Fang 1998-08-28 birthday Gave him a new chew toy
Claws 1998-03-17 birthday Gave him a new flea collar
Whistler 1998-12-09 birthday First birthday

将第二个表的数据是一个表相匹配的需要两个表关联查询
Insert into event values(“Fluffy”,”1995-05-15”,”litter”,”4 kittens,3 female,1 male”);
Insert into event values(“Buffy”,”1993-06-23”,”litter”,” 5 puppies, 2 female, 3 male”);
Insert into event values(“Buffy”,”1994-06-19”,”litter”,”3 puppies, 3 female”);
Insert into event values(“Chirpy”,”1999-03-21”,” vet”,”needed beak straightened”);
Insert into event values(“Slim”,”1997-08-03”,”vet”,”broken rib”);
Insert into event values(“Bowser”,”1991-10-12”,” kennel”,”NULL”);
Insert into event values(“Fang”,”1991-10-12”,” kennel”,”NULL”);
Insert into event values(“Fang”,”1998-08-28”,” birthday”,”Gave him a new chew toy”);
Insert into event values(“Claws”,”1998-03-17”,”birthday”,”Gave him a new flea collar”);
Insert into event values(“Whistler”,”1998-12-09”,”birthday”,”First birthday”);
两个表关联查询:
两者之间的需要输出的信息 以及 where之后是 两个表之间的联系:

mysql> select p1.name,p1.sex,p2.name,p2.sex,p1.species from pet as p1,pet as p2 where p1.species = p2.species and p1.sex = ‘f’ and p2.sex = ‘m’;

±-------±-----±------±-----±--------+ | name | sex | name | sex | species | ±-------±-----±------±-----±--------+ | Fluffy | f | Claws | m | cat | | Buffy | f | Fang | m | dog | ±-------±-----±------±-----±--------+
2 rows in set (0.00 sec)
数据库默认key:
创建表的结构的时候没有对key做明确的注释,数据库自己默认的数据。
mysql> describe pet; ±--------±------------±-----±----±--------±------+ | Field | Type | Null | Key | Default | Extra | ±--------±------------±-----±----±--------±------+ | name | varchar(20) | YES | | NULL | | | owner | varchar(20) | YES | | NULL | | | species | varchar(20) | YES | | NULL | | | sex | char(1) | YES | | NULL | | | birth | date | YES | | NULL | | | death | date | YES | | NULL | | ±--------±------------±-----±----±--------±------+ 6 rows in set (0.00 sec) mysql> describe event; ±-------±------------±-----±----±--------±------+ | Field | Type | Null | Key | Default | Extra | ±-------±------------±-----±----±--------±------+ | name | varchar(20) | YES | | NULL | | | data | date | YES | | NULL | | | type | varchar(15) | YES | | NULL | | | remark | varchar(25) | YES | | NULL | | ±-------±------------±-----±----±--------±------+ 4 rows in set (0.00 sec)

关于unsigned zerofill
参考:https://www.cnblogs.com/Latiny/p/8058209.html
Zerofill:int(10) zerofill 因为int类型就是4个字节 需要改变或者自己定义成更长的字段的则需要zerofill字符
Unsight : 是无符号字段
Primary: 设置主键
create table shop(
article int(4) unsigned zerofill default “0000” not NULL,
dealer char(20) default " " not NULL,
price double(16,2) default “0.00” not NULL,
primary key(article,dealer)
);
mysql>describe shop; ±--------±-------------------------±-----±----±--------±------+ | Field | Type | Null | Key | Default | Extra | ±--------±-------------------------±-----±----±--------±------+ | article | int(4) unsigned zerofill | NO | PRI | 0000 | | | dealer | char(20) | NO | PRI | | | | price | double(16,2) | NO | | 0.00 | | ±--------±-------------------------±-----±----±--------±------+ 3 rows in set (0.00 sec)

查询某列的最大值对应的一行的信息
方法一:使用嵌套查询–子查询的方式。
SELECT article, dealer, price
FROM shop
WHERE price=(SELECT MAX(price) FROM shop);

limit 1 意味着 只返回 1行。

SELECT article, dealer, price
FROM shop
ORDER BY price DESC
LIMIT 1;

mysql> select article ,max(price) from shop group by article; ±--------±-----------+ | article | max(price) | ±--------±-----------+ | 0001 | 3.99 | | 0002 | 10.99 | | 0003 | 1.69 | | 0004 | 19.95 | ±--------±-----------+ 4 rows in set (0.00 sec)
查询每个组之间的最大值并且打印
可以使用子查询
子查询的思路:
SELECT MAX(s2.price) FROM shop s2 ,shop s1 WHERE s1.article = s2.article;
关于子查询的中不好理解的部分(嵌套的部分只能输出一条数据)
mysql> SELECT MAX(s2.price) FROM shop s2 ,shop s1 WHERE s1.article = s2.article; ±--------------+ | MAX(s2.price) | ±--------------+ | 19.95 | ±--------------+ 1 row in set (0.00 sec)

Create table person(id smallint unsigned not NULL auto_increment ,name char(60) not NULL, primary key (id));

Mysql的语法问题官方文档查询:<> 的意思就是 != 。
mysql> select *from person p,shirt s where p.name like ‘Lilliana%’ and s.owner = p.id and s.color <> ‘white’;

±—±--------------------±—±------±-------±------+ | id | name | id | style | color | owner | ±—±--------------------±—±------±-------±------+ | 2 | Lilliana Angelovska | 4 | dress | orange | 2 | | 2 | Lilliana Angelovska | 5 | polo | red | 2 | | 2 | Lilliana Angelovska | 6 | dress | blue | 2 | ±—±--------------------±—±------±-------±------+ 3 rows in set (0.00 sec)
mysql> select *from person p,shirt s where p.name like ‘Lilliana%’ and s.owner = p.id and s.color != ‘white’;

±—±--------------------±—±------±-------±------+ | id | name | id | style | color | owner | ±—±--------------------±—±------±-------±------+ | 2 | Lilliana Angelovska | 4 | dress | orange | 2 | | 2 | Lilliana Angelovska | 5 | polo | red | 2 | | 2 | Lilliana Angelovska | 6 | dress | blue | 2 | ±—±--------------------±—±------±-------±------+ 3 rows in set (0.00 sec)

@ && :=
mysql> select @min := MIN(price),@max :=max(price) from shop; ±-------------------±------------------+ | @min := MIN(price) | @max :=max(price) | ±-------------------±------------------+ | 1.25 | 19.95 | ±-------------------±------------------+ 1 row in set, 2 warnings (0.00 sec)

mysql中变量不用事前申明,在用的时候直接用“@变量名”使用就可以了。
第一种用法:set @num=1; 或set @num:=1; //这里要使用变量来保存数据,直接使用@num变量
第二种用法:select @num:=1; 或 select @num:=字段名 from 表名 where ……
注意上面两种赋值符号,使用set时可以用“=”或“:=”,但是使用select时必须用“:=赋值

select year,month,count(0) from (
select year,month,count(day) from t1 group by year,month,day
) as tmp group by year,month;

mysql> select year,month,count(0) from ( -> select year,month,count(day) from t1 group by year,month,day -> ) as tmp group by year,month;

±-----±------±---------+ | year | month | count(0) | ±-----±------±---------+ | 2000 | 01 | 3 | | 2000 | 02 | 2 | ±-----±------±---------+ 2 rows in set (0.00 sec)
mysql> SELECT year,month,BIT_COUNT(BIT_OR(1<<day)) AS days FROM t1 -> GROUP BY year,month; ±-----±------±-----+ | year | month | days | ±-----±------±-----+ | 2000 | 01 | 3 | | 2000 | 02 | 2 | ±-----±------±-----+ 2 rows in set (0.00 sec)
mysql> select year,month ,count(day) from(select year ,mo:(day) from t1 group by year,month,day);

select year,month ,count(day) from(select year ,month,count(day) from t1 group by year,month,day) as group by year,month,day;
子查询:统计每个月的访问次数:
mysql> select year,month ,count(0) from(select year ,month,count(1) from t1 group by year,month,day) as tmp1 group by year,month; ±-----±------±---------+ | year | month | count(0) | ±-----±------±---------+ | 2000 | 01 | 3 | | 2000 | 02 | 2 | ±-----±------±---------+ 2 rows in set (0.00 sec)

CREATE TABLE animalstwo (
grp ENUM(‘fish’,‘mammal’,‘bird’) NOT NULL,
id MEDIUMINT NOT NULL AUTO_INCREMENT,
name CHAR(30) NOT NULL,
PRIMARY KEY (grp,id)
);

mysql> CREATE TABLE Tanimals ( -> grp ENUM(‘fish’,‘mammal’,‘bird’) NOT NULL, -> id MEDIUMINT NOT NULL AUTO_INCREMENT, -> name CHAR(30) NOT NULL, -> PRIMARY KEY (grp,id) /为什么使用联合逐渐也会提示错误/ -> );
ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key
查了半天看是不是组合主键(复合主键)的问题,语法上复合主键的不存在问题,
事实上设计复合mysql提示的语法的,只有一个自增并且自增的字段作为主键。
根据文档对另外两种数据库的描述:
于MyISAM和BDB表,你可以在第二栏指定AUTO_INCREMENT以及多列索引。此时,AUTO_INCREMENT列生成的值的计算方法为:MAX(auto_increment_column) + 1 WHERE prefix=given-prefix。如果想要将数据放入到排序的组中可以使用该方法。

Mysql设计上需要将 auto_increment放置在第一列,复合主键之间的位置需要按照声明的为位置对应:
mysql> CREATE TABLE Tanimals ( -> id MEDIUMINT NOT NULL AUTO_INCREMENT, -> grp ENUM(‘fish’,‘mammal’,‘bird’) NOT NULL, -> name CHAR(30) NOT NULL, PRIMARY KEY (id,grp) /为什么使用联合逐渐也会提示错误/ -> ); Query OK, 0 rows affected (0.87 sec) mysql> mysql>

出了问题总是能够解决的。就是语法要求的问题。

发布了212 篇原创文章 · 获赞 32 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/qq_42664961/article/details/104496564
今日推荐