常用基础 - 增删改查基本语句

  • 作者:KK

  • 发表日期:2017.5.23


插入数据记录

有了数据表后,这张表是空的,接下来我们要通过INSERT语句往数据表插入数据:

/*建个学生表*/
CREATE TABLE student(
	name VARCHAR(10),
	gender TINYINT(1), /*性别 1=男 2=女*/
	birthday DATE
);


/*插入一条学生数据*/
INSERT INTO student(name,gender,birthday) VALUES('Jay', 1, '1999-09-09');

/*再来一条,但这位学生没有出生,因为这位女同学不想透露*/
INSERT INTO student(name,gender) VALUES('May', 2);

总结:在INSERT INTO后面写表名,然后括号,括号里面是要插入数据的字段名称,后面再来个VALUES关键字加括号,括号就是与字段对应的数据值


基本的数据查询

紧接着上面,插入数据后就可以查询到数据了:

查询全部学生数据

SELECT * FROM student;


/*输出结果*/
+------+--------+------------+
| name | gender | birthday   |
+------+--------+------------+
| Jay  |      1 | 1999-09-09 |
| May  |      2 | NULL       |
+------+--------+------------+

其实SQL挺语义化的,有点像读英语句子一样,比较好记,FROM后面是表名哦


查询全部学生的名字

在SELECT后面明确声明指定的字段就行了

SELECT name FROM student;


/*输出结果*/
+------+
| name |
+------+
| Jay  |
| May  |
+------+


/*查询全部学生的名字和性别*/
SELECT name,gender FROM student;


/*输出结果*/
+------+--------+
| name | gender |
+------+--------+
| Jay  |      1 |
| May  |      2 |
+------+--------+

统计有多少条学生数据

SELECT count(*) FROM student;


/*输出结果*/
+----------+
| count(*) |
+----------+
|        2 |
+----------+

批量插入数据

可以一次性插入多条数据:

INSERT INTO student(name,gender,birthday) VALUES('Kay', 1, '1989-06-09'),('Mars', 2, '2000-02-02');

与基本的插入数据语句的区别就是VALUES后面加多个括号,其实每个括号里面的就是一条数据记录的各个值,后面还能加许多括号,自己试吧


带有条件的查询

查询男生有哪些同学

SELECT name FROM student WHERE gender = 1;


/*输出结果*/
+------+
| name |
+------+
| Jay  |
| Kay  |
+------+

就是在FROM 表名后面加上个WHERE关键字,关键字后面接着是字段名称和比较值,这样查询的时候MySQL就会比较一下哪条数据记录的gender值为1的,如果是1的话就符合,将数据提取出来


AND查询逻辑

查询1999年之后出生的男同学的名字和出生时间:

SELECT name,birthday FROM student WHERE birthday > '1999-01-01' AND gender = 1;


/*结果*/
+------+------------+
| name | birthday   |
+------+------------+
| Jay  | 1999-09-09 |
+------+------------+

WHERE部分的含义解读就是:birthday大于1999年1月1号 并且 **性别 = 1(男)


OR查询逻辑

查询性别为 女或者1999年以后出生的同学:

SELECT * FROM student WHERE gender = 2 OR birthday > '1999-01-01';


/*结果*/
+------+--------+------------+
| name | gender | birthday   |
+------+--------+------------+
| Jay  |      1 | 1999-09-09 |
| May  |      2 | NULL       |
| Mars |      2 | 2000-02-02 |
+------+--------+------------+

常见的值比较符号示例

  • 等于:gender = 1这个上面已经出现过几次了,废话一下

  • 不等于:gender != 1

  • 大于:birthday > '1999-01-01'

  • 小于:birthday < '1999-01-01'(怎么我感觉好水啊

  • 大于等于:birthday >= '1999-01-01'

  • 小于等于:birthday <= '1999-01-01'

  • 指定文字开头:name LIKE 'J%'

    就是名字前面有J的人,后面的%表示任意内容,只要前面对上号就行

  • 指定文字结尾:name LIKE '%ay'

    名字后面有ay的人

  • 包含指定文字:name LIKE '%a%'

    就是名字任意位置有a的人,就算在最前面或最后面都可以

  • 指定值:gender IN(0,2)

    于是gender不是0和2的记录都不要

  • 范围:birthday BETWEEN '1999-01-01' AND '2999-12-12'

    这个要解释一下,意思就是说出生时间在1999年到2999年之间,涉及到BETWEEN关键字和AND关键字

  • 值等于空:birthday IS NULL

  • 值不为空:birthday IS NOT NULL(下面有例子)


基本排序

/*把同学们按年龄从大到小排出来*/
SELECT * FROM student ORDER BY birthday ASC;

/*结果*/
+------+--------+------------+
| name | gender | birthday   |
+------+--------+------------+
| May  |      2 | NULL       |
| Kay  |      1 | 1989-06-09 |
| Jay  |      1 | 1999-09-09 |
| Mars |      2 | 2000-02-02 |
+------+--------+------------+


/*反过来,从小到大排出来*/
SELECT * FROM student ORDER BY birthday DESC;

/*结果*/
+------+--------+------------+
| name | gender | birthday   |
+------+--------+------------+
| Mars |      2 | 2000-02-02 |
| Jay  |      1 | 1999-09-09 |
| Kay  |      1 | 1989-06-09 |
| May  |      2 | NULL       |
+------+--------+------------+

就是用了ORDER BY关键字修饰要排序的字段,字段名称后面再跟ASC就是升序(值从小到大),DESC就是降序(值从大到小)

这里会把不公开生日的May同学也查了出来,要过滤掉她就是补上条件SELECT * FROM student WHERE birthday IS NOT NULL ORDER BY birthday DESC;

其实ORDER BY关键字默认就是ASC的,所以平时一般大家都懒得强制声明ASC


多字段排序

先按性别从男到女排,再按年龄从大到小排:

SELECT * FROM student WHERE birthday IS NOT NULL ORDER BY gender ASC, birthday DESC;


/*输出结果*/
+------+--------+------------+
| name | gender | birthday   |
+------+--------+------------+
| Jay  |      1 | 1999-09-09 |
| Kay  |      1 | 1989-06-09 |
| Mars |      2 | 2000-02-02 |
+------+--------+------------+

查询前几条数据

LIMIT关键字,我们可以查询年龄最大的2位同学:

SELECT * FROM student WHERE birthday IS NOT NULL ORDER BY birthday DESC LIMIT 2;


/*输出结果*/
+------+--------+------------+
| name | gender | birthday   |
+------+--------+------------+
| Mars |      2 | 2000-02-02 |
| Jay  |      1 | 1999-09-09 |
+------+--------+------------+

LIMIT 2就是从结果集中获取2条数据


更新数据记录

就是修改数据:

/*将指定姓名的同学性别更新为女*/
UPDATE student SET gender = 2 WHERE name = 'Jay';


/*将所有姓名包含ay的同学性别更新为男*/
UPDATE student SET gender = 1 WHERE name LIKE '%ay%';


/*无条件地将整张表的所有数据生日字段的值都设置为1990年1月3号*/
UPDATE student SET birthday = '1990-01-03';