环境
cmd命令行
进入MySQL
首先进入到MySQL,我是命令行形式。
查看所有数据库
输入SHOW DATABASES;所有查看数据库。
创建数据库
输入CREATE DATABASE 数据库名字;创建一个新的数据库
我创建了名为test的数据库。
那我再创一个名为test2的数据库:CREATE DATABASE test2;
删除数据库
我觉得test2数据库有点多余,可以用DROP DATABASE test2;删掉:
可以看到,我忘了输入;,MySQL认为我指令没结束。这里和java很像,一段指令要;结尾才算结束。
进入数据库
输入USE test;可以进入我们创建的数据库。
创建数据表
输入CREATE TABLE ...可以在数据库中创建数据表,一个库可以有很多个表,但是直接创建是不行的,必须要创建的时候定义好规格:
我们输入:
CREATE TABLE my_table (
`my_id` INT UNSIGNED AUTO_INCREMENT,
`my_title` VARCHAR(100) NOT NULL,
`my_author` VARCHAR(40) NOT NULL,
`submission_date` DATE,
PRIMARY KEY ( `my_id` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
my_id 表示该列名称,INT 表示此列的元素类型,UNSIGNED是数字类型无符号化,AUTO_INCREMENT是该列元素具有自增属性。
VARCHAR(n)表示变长字符串,n为字符的个数。NOT NULL表示该列元素不允许空值null。
DATE则是时间日期变量,以 YYYY-MM-DD 的形式表示,比如2021-07-09。PRIMARY KEY定义这个列my_id为主键,它的值能唯一地标识表中的每一行。ENGINE 设置存储引擎,CHARSET 设置编码。
输入好之后有:
查看所有数据表
输入SHOW TABLES;,查看当前数据库中所有的数据表:
才一个,我们再创建一个
CREATE TABLE my_table2 (
`my_id` INT UNSIGNED AUTO_INCREMENT,
`my_title` VARCHAR(100) NOT NULL,
`my_author` VARCHAR(40) NOT NULL,
`submission_date` DATE,
PRIMARY KEY ( `my_id` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
然后再SHOW TABLES;康康:
表变成两个了。
删除数据表
输入DROP TABLE my_table2;
再看看:
只剩一个数据表了。
插入数据
输入以下,给my_table传入数据:
INSERT INTO my_table
(my_title, my_author, submission_date)
VALUES
("静夜思”, "李白", NOW());
mysql中常用的三种插入数据的语句:
1)insert into表示插入数据,数据库会检查主键,如果出现重复会报错;
2)replace into表示插入替换数据,需求表中有PrimaryKey,或者unique索引,如果数据库已经存在数据,则用新数据替换,如果没有数据效果则和insert into一样;
3)insert ignore into表示,如果中已经存在相同的记录,则忽略当前新数据;
查看数据表数据
输入SELECT * FROM my_table;查看数据表所有数据,
有点像excel。NOW()函数可以自动获取当前时间。
我们继续插入一些数据:
INSERT INTO my_table
(my_title, my_author, submission_date)
VALUES
("登高”, "杜甫", NOW());
INSERT INTO my_table
(my_title, my_author, submission_date)
VALUES
("春夜喜雨”, "杜甫", "2021-07-09");
INSERT INTO my_table
(my_title, my_author, submission_date)
VALUES
("琵琶行”, "白居易", NOW());
然后输入SELECT * FROM my_table;看看:
现在才算有点样子了。
我们也可以只查看某些列,比如只看my_title列,
SELECT my_title FROM my_table;有:
条件搜索 WHERE子句
使用SELECT * FROM my_table WHERE my_author="杜甫"; 可以限制查询条件:
只显示my_author="杜甫"的数据。
条件还可以是SELECT * FROM my_table WHERE my_id <= 2;
只显示my_id小于等于2的数据。
你甚至可以给定一个区间
SELECT * FROM my_table WHERE my_id BETWEEN 1 AND 2;:
只看my_id在1到2这个区间的数据。
注意:ON和WHERE差不多,但是ON子句筛选连接表要显示的内容,并不影响查询结果的条数。WHERE子句对多表连接的结果进行筛选,满足条件的记录才能被留下,所以他会影响最终的查询记录数。
更新数据 UPDATE
我们可以通过UPDATE my_table SET my_title='春望' WHERE my_id=3;,更新数据:
再看看表SELECT * FROM my_table;:
我们把id=3的行中,春夜喜雨改成了春望。
删除数据 DELETE
我们再把刚刚修改的行删掉,DELETE FROM my_table WHERE my_id=3;
查看一下
SELECT * FROM my_table;:
id=3的行删掉了。
请注意,UPDATE和DELETE很容易危险操作,如果不加WHERE的话,DELETE会删掉所有行,我们来试试:
DELETE FROM my_table;
现在在查看一下SELECT * FROM my_table;:
没了,数据都没了。
我们把它们再加回来吧。
INSERT INTO my_table
(my_title, my_author, submission_date)
VALUES
("静夜思”, "李白", NOW());
INSERT INTO my_table
(my_title, my_author, submission_date)
VALUES
("登高”, "杜甫", NOW());
INSERT INTO my_table
(my_title, my_author, submission_date)
VALUES
("春夜喜雨”, "杜甫", "2021-07-09");
INSERT INTO my_table
(my_title, my_author, submission_date)
VALUES
("琵琶行”, "白居易", NOW());
my_id可以看到由于自增的缘故,从5开始计数了。
LIKE 子句
WHERE 子句可以指定任何条件。LIKE其实相当于=。
而%X匹配符可以匹配以X结尾的字符。
SELECT * FROM my_table WHERE my_author LIKE '%甫';
我们找出所有my_author中以'甫'结尾的字符。
UNION 操作符
SHOW TABLES;显示一下我们的表,只有一个:
我们再neng一个表,my_table2:
CREATE TABLE my_table2 (
`my_id` INT UNSIGNED AUTO_INCREMENT,
`my_title` VARCHAR(100) NOT NULL,
`my_author` VARCHAR(40) NOT NULL,
`submission_date` DATE,
PRIMARY KEY ( `my_id` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
往my_table2插入数据:
INSERT INTO my_table2
(my_title, my_author, submission_date)
VALUES
("独坐敬亭山”, "李白", NOW());
INSERT INTO my_table2
(my_title, my_author, submission_date)
VALUES
("望庐山瀑布”, "李白", NOW());
INSERT INTO my_table2
(my_title, my_author, submission_date)
VALUES
("长恨歌”, "白居易", NOW());
INSERT INTO my_table2
(my_title, my_author, submission_date)
VALUES
("望岳”, "杜甫", NOW());
看看my_table2:
SELECT * FROM my_table2;
UNION可以把两个SELECT或多个SELECT的结果合并到一起,最简单莫过:
SELECT * FROM my_table
UNION
SELECT * FROM my_table2;
或者这样
SELECT * FROM my_table WHERE my_author="杜甫"
UNION
SELECT * FROM my_table2 WHERE my_author="杜甫";
我们就单独把my_author="杜甫"的择出来了。
还可以用LIKE,搭配%X%,匹配所有含X的字符
SELECT * FROM my_table WHERE my_author LIKE '%白%'
UNION
SELECT * FROM my_table2 WHERE my_author LIKE '%白%';
把my_author名字中包含"白"的行找出来。
AND 操作符
之前也用过了,可以在WHERE中用AND添加条件,这些条件有逻辑与关系:
SELECT * FROM my_table2 WHERE my_author LIKE '%李%' AND my_author LIKE '%白%';
找出my_table2中,my_author包含“李”,并且包含“白”字符的所有列。
OR 操作符
可以在WHERE中用OR添加条件,这些条件有逻辑或关系:
SELECT * FROM my_table2 WHERE my_author LIKE '%李%' OR my_author LIKE '%杜%';
AND操作符优先级比OR要高,如果没有用括号括起来,AND语句会被优先执行。
IN 操作符
为了演示方便,我们先回顾一下my_table和my_table2的数据:
SELECT * FROM my_table;
SELECT * FROM my_table2;
我们在my_table2中再加点数据:
INSERT INTO my_table2
(my_title, my_author, submission_date)
VALUES
("赤壁赋”, "苏轼", NOW());
INSERT INTO my_table2
(my_title, my_author, submission_date)
VALUES
("念奴娇·赤壁怀古”, "苏轼", NOW());
查看my_table2数据SELECT * FROM my_table2;:
IN操作符能表示一种包含关系,IN()当中的括号指定条件的范围,比如:
SELECT my_id, my_title, my_author FROM my_table2 WHERE my_author IN(SELECT my_author FROM my_table);
首先我们指定了查询对象my_id, my_title, my_author,不包括submission_date。
第二,我们通过WHERE .. IN(...),使得我们在my_table2中只查询和my_table的my_author有交集的my_author
还可以IN()更复杂的条件:
SELECT my_id, my_title, my_author FROM my_table2 WHERE my_author IN(SELECT my_author FROM my_table WHERE my_author LIKE '%李%' );
NOT 操作符
NOT操作符可以用于否定条件,起逻辑非的作用。
刚刚用IN我们找出了my_table2和my_table中my_author相同的部分,NOT操作符可以找不同的部分
SELECT * FROM my_table2
WHERE my_author NOT IN(SELECT my_author FROM my_table);
NOT可以对IN, BETWEEN 和EXISTS字句取反。
排序 ORDER BY
讲到排序之前,再创一个数据表吧,让id没有自增属性:
CREATE TABLE my_table3 (
`my_id` INT UNSIGNED,
`my_title` VARCHAR(100) NOT NULL,
`my_author` VARCHAR(40) NOT NULL,
`submission_date` DATE,
PRIMARY KEY ( `my_id` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO my_table3 (my_id, my_title, my_author, submission_date)
VALUES
(2, "题西林壁”, "苏轼", "2017-04-12"),
(1, "饮湖上初晴后雨”, "苏轼", "2017-04-12"),
(4, "卜算子”, "苏轼", "2015-05-01"),
(3, "蝶恋花”, "苏轼", "2016-03-06");
查询一下是这样的,可以看到虽然没有自增属性,但因为我们设了主键所以按主键排序。
使用ORDER BY可以让数据表重新排序,比如按照submission_date升序来排序。
SELECT * FROM my_table3 ORDER BY submission_date ASC;
比如按照my_id降序来排序。
SELECT * FROM my_table3 ORDER BY my_id DESC;
参考
《MySQL必知必会》