1. 命令
- Mysqld install
- Mysqld initialize
- Net start mysql
- Alter user ‘root’@’loacalhost’ identified by ‘root’
- Mysql -u root -p
- Show databases
- Use test
- Show tables
- Exit
- Mysql -h 192.168.43.161 -u root -p
- 127.0.0.1:3306
2. 查询
- 普通查询:(select * from students)
- 条件查询:(where…)
- 别名:(name namealias)
- 投影查询:(id,name,score)
- 排序:(order by)、desc(降序)、asc(升序)、默认为按主键升序、order by score desc,gender(当score一样时,按照gender升序排)
- 分页:(limit 3 offset 0)、对查询结果分页每页显示最多3条、从0开始显示3条(第一页limit 3 offset 0)、从3开始显示3条(第二页limit 3 offset 3)
Select id,name namealias,score
from students
where score>80 and gender=’M’
order by score desc
- 多表查询:select * <表名1> <别名1>, <表名2> <别名2>;结果集的列数是students表和classes表的列数之和,行数是students表和classes表的行数之积。上述查询的结果集有两列id和两列name,可以利用投影查询的“设置列的别名”来给两个表各自的id和name列起别名表名.列名,还允许给表设置一个别名
Select
students.id sid,students.name name,students.score,classes.id cid,classes.name cname
From students,classes
Select
S.id sid,s.name name,s.score,c.id cid,c.name cname
From students s,classes c
Where s.score>80 and c.id=1
- 聚合查询:对于统计总数、平均数这类计算,SQL提供了专门的聚合函数,使用聚合函数进行查询,就是聚合查询,它可以快速获得结果。
COUNT()表示查询所有列的行数,要注意聚合的计算结果虽然是一个数字,但查询的结果仍然是一个二维表,只是这个二维表只有一行一列,并且列名是COUNT()。
通常,使用聚合查询时,我们应该给列名设置一个别名,便于处理结果。
COUNT(*)和COUNT(id)实际上是一样的效果。
如果聚合查询的WHERE条件没有匹配到任何行,COUNT()会返回0,而SUM()、AVG()、MAX()和MIN()会返回NULL.
Select count(*) from students
Select count(*) num from students
Select avg(score) average from students where gender = ‘M’
- 分组聚合:对于聚合查询,SQL还提供了“分组聚合”的功能。
执行这个查询,COUNT()的结果不再是一个,而是3个,这是因为,GROUP BY子句指定了按class_id分组,因此,执行该SELECT语句时,会把class_id相同的列先分组,再分别计算,因此,得到了3行结果。
只有class_id都相同,name是不同的,SQL引擎不能把多个name的值放入一行记录中。因此,聚合查询的列中,只能放入分组的列。
Select class_id,count(*) num,gender from students group by class_id,gender
- 连接查询:连接查询是另一种类型的多表查询。连接查询对多个表进行JOIN运算,简单地说,就是先确定一个主表作为结果集,然后,把其他表的行有选择性地“连接”在主表结果集上。
选出students表的所有学生信息,且结果集同时包含所在班级的名称,上面的结果集只有class_id列,缺少对应班级的name列。
Select s.id,s.name,s.score,s.gender,s.class_id,c.class_name from students s inner join classes c on s.class_id=c.id
Inner join、left outer join、right outer join、full outer join
- CRUD(create retrieve update delete)增删改查
注意到我们并没有列出id字段,也没有列出id字段对应的值,这是因为id字段是一个自增主键,它的值可以由数据库自己推算出来。此外,如果一个字段有默认值,那么在INSERT语句中也可以不出现
Update/delete,一次删除/更新表中的一条或多条记录
Insert into students (class_id,name,score,gender) values (1,’aa’,80,’M’),(2,’bb’,90,’F’)
Update students set name=’cc’,score=89 where id=1
Update students set score=score+10 where score<80
Delete from students where id=1
- 主键、外键、索引
主键唯一标识记录,bigint not null auto_increment
外键表示两个表的关系:一对多、一对一、多对多。
FOREIGN KEY (class_id)指定了class_id作为外键,REFERENCES classes (id)指定了这个外键将关联到classes表的id列(即classes表的主键)。
Foreign key (class_id) refrences classes (id)
通过对数据库表创建索引,可以提高查询速度(列的值如果越互不相同,那么索引效率越高,主键索引的效率是最高)。通过创建唯一索引(例如身份证号、邮箱地址等,因为他们具有业务含义,因此不宜作为主键。),可以保证某一列的值具有唯一性。
- sql文件
-- 如果test数据库不存在,就创建test数据库:
CREATE DATABASE IF NOT EXISTS test;
-- 切换到test数据库
USE test;
-- 删除classes表和students表(如果存在):
DROP TABLE IF EXISTS classes;
DROP TABLE IF EXISTS students;
-- 创建classes表:
CREATE TABLE classes (
id BIGINT NOT NULL AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- 创建students表:
CREATE TABLE students (
id BIGINT NOT NULL AUTO_INCREMENT,
class_id BIGINT NOT NULL,
name VARCHAR(100) NOT NULL,
gender VARCHAR(1) NOT NULL,
score INT NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- 插入classes记录:
INSERT INTO classes(id, name) VALUES (1, '一班');
INSERT INTO classes(id, name) VALUES (2, '二班');
INSERT INTO classes(id, name) VALUES (3, '三班');
INSERT INTO classes(id, name) VALUES (4, '四班');
-- 插入students记录:
INSERT INTO students (id, class_id, name, gender, score) VALUES (1, 1, '小明', 'M', 90);
INSERT INTO students (id, class_id, name, gender, score) VALUES (2, 1, '小红', 'F', 95);
INSERT INTO students (id, class_id, name, gender, score) VALUES (3, 1, '小军', 'M', 88);
INSERT INTO students (id, class_id, name, gender, score) VALUES (4, 1, '小米', 'F', 73);
INSERT INTO students (id, class_id, name, gender, score) VALUES (5, 2, '小白', 'F', 81);
INSERT INTO students (id, class_id, name, gender, score) VALUES (6, 2, '小兵', 'M', 55);
INSERT INTO students (id, class_id, name, gender, score) VALUES (7, 2, '小林', 'M', 85);
INSERT INTO students (id, class_id, name, gender, score) VALUES (8, 3, '小新', 'F', 91);
INSERT INTO students (id, class_id, name, gender, score) VALUES (9, 3, '小王', 'M', 89);
INSERT INTO students (id, class_id, name, gender, score) VALUES (10, 3, '小丽', 'F', 85);
-- OK:
SELECT 'ok' as 'result:';