看了这篇教程 SQL教程 – 廖雪峰 对 SQL 语言有了个初步的了解,以下是学习记录,推荐直接看这个教程,简单易懂,适合初学者
ALTER TABLE stu ADD CONSTRAINT fk_class_id FOREIGN KEY (class_id) REFERENCES classes (id); 给 stu 这个表创建一个名为 fk_class_id 的约束,这个约束关联了当前表(stu)的 class_id 字段到 classes 这个表的 id 字段ALTER TABLE stu DROP FOREIGN KEY fk_class_id;ALTER TABLE students ADD INDEX idx_name (name); 给 students 表的 name 字段增加索引ALTER TABLE students DROP INDEX idx_name;ALTER TABLE students ADD UNIQUE INDEX idx_name (name);ALTER TABLE students CONSTRAINT uni_name UNIQUE (name);mysql -u root -p 输入密码后即可连接到 MySQL Server
EXIT 即可断开与 MySQL Server 的链接mysql 10.0.1.99 -u root -pCREATE DATABASE test1;DROP DATABASE test1;USE test1;SHOW TABLES; // classes studentsDESC classes;SHOW CREATE TABLE students;CREATE TABLE sts (id bigint NOT NULL, name VARCHAR(100));DROP TABLE sts;ALTER TABLE sts ADD COLUMN birth VARCHAR(10) NOT NULL;ALTER TABLE sts CHANGE COLUMN birth birth VARCHAR(20);ALTER TABLE sts DROP COLUMN birth;INSERT INTO students (id, class_id, name, gender, score) VALUES (13, 1, '小黑', 'B', 66); 如果一个字段有默认值,或者是自增主键,则可以不再插入语句中体现,例如上句中的 id 字段可以不写,数据库可以自己推断出来;另外可以在 VAlUES 子句中添加多个记录,例如:INSERT INTO students (class_id, name, gender, score) VALUES (3, '小A', 'C', 80), (2, '大A', 'B', 90);UPDATE students SET name="小AA", gender="C" WHERE id=15; 后边的 WHERE 是筛选条件,符合条件的都会被更新
UPDATE students SET name="小飞" WHERE id>=1 AND id<=3;UPDATE students SET score=score+5 WHERE gender="B";DELETE FROM students WHERE gender="B";
SELECT * FROM students; 其中 * 表示所有列SELECT 1;SELECT * FROM students WHERE score>=90; 查询 students 表中所有 score >= 90 的记录;
SELECT * FROM students WHERE score >= 90 AND gender="F";SELECT * FROM students WHERE score >= 90 OR gender="F";SELECT * FROM students WHERE NOT class_id=2; 等价于 WHERE class_id <>2; 所以 NOT 不常用SELECT * FROM students WHERE name LIKE '小%'; 查询 students 中 name 字段值类似 “小X” 的记录,% 表示任意字符() 实现:SELECT * FROME students WHERE (name LIKE '小%' AND score < 90) OR gender='F';SELECT id, name, class_id FROM students;
SELECT name, id s_id, class_id FROM students;SELECT * FROM students ORDER BY score;SELECT * FROM students ORDER BY score DESC; DESC 即为倒序,正序是 ASCSELECT * FROM students ORDER BY score, class_id; 通过 , 隔开, 先按照 score 排序,有 score 相同的再按照 class_id 排序SELECT * FROM students LIMIT 3 OFFSET 0; 从 0 开始,返回查询出的 3 条数据
LIMIT pageSize OFFSET pageSize * (pageIndex - 1) (伪代码)SELECT * FROM students LIMIT 3, 0; 用 , 隔开即可SELECT COUNT(*) num FROM students WHERE gender='F'; 查询 gender=F 的数据个数,并重命名为 numSELECT AVG(score) avg FROM students WHERE gender='F'; 取 score 字段的平均值,类似的聚合方法有很多 MAX(取最大)MIN(取最小)SUM(求和)等SELECT class_id, gender, COUNTS(*) FROM students GROUP BY class_id, gender; 按照 class_id 以及 gender 分组,只有这两个字段可以作为输出表的字段,其他字段因不具备分组而不能展示SELECT * FROM students, classes; 返回的是两个表的每一行两两拼接的结果SELECT students.id s_id, students.name, classes.id c_id, classes.name c_name FROM students, classes;SELECT s.id, s.name, s.gender, s.score, s.class_id, c.name class_name FROM students s INNER JOIN classes ON s.class_id = c.id; 以 students 为主表 取别名 s,根据 students 的 class_id 字段,找到 classes 表中的对应记录,将其 name 字段的值,作为结果集的 class_name 字段展示REPLACE INTO students (id, class_id, name, gender, score) VALUES (7, 3, '小林', 'F', 99); 如上语句,如id=7 的记录不存在则创建一条记录,如果存在则删除后创建一条记录INSERT INTO students (id, class_id, name, gender, score) VALUES (7, 3, '小林', 'F', 99) ON DUPLICATE KEY UPDATE name='小非林'; 如上语句,如果没有 id=7 的记录则创建 (7, 3, ‘小林’, ‘F’, 99),有的话则更新 name=‘小非林’ 字段INSERT IGNORE INTO students (id, class_id, name, gender, score) VALUES (7, 3, '小林', 'F', 99); 如果有 id=7 的记录则忽略这一次插入,如果没有则创建一个记录CREATE TABLE stu_copy SELECT id, name, gender FROM students WHERE score >=85; 从 students 中摘取 score >= 85 的记录,以 id, name, gender 作为字段创建 stu_copy 表INSERT INTO avg_list (class_id, avg) SELECT class_id, AVG(score) FROM students GROUP BY class_id;