第一章数据库的操作
登陆mysql数据库:mysql -h 127.0.0.1 -u root -p
1、创建代码如下:CREATE DA TABASE example;
SHOW DA TABASES;//显示数据库
2、删除代码:DROP DA TABASE example;
SHOW DATABASES;
3、数据库存储引擎:SHOW ENGINES;
4、查看默认的存储引擎:SHOW V ARIABLES LIKE ‘storage_engine’;
第二章表的操作
登陆mysql数据库管理系统:mysql -h localhost -u root -p
1:创建SQL代码如下:CREATE TABLE example0(id INT,
name varchar(20),
sex Boolean
);
2、主键创建:(1)单字段:CREATE TABLE example1(stu_id INT PRIMARY KEY,
stu_name varchar(20),
stu_sex Boolean
);
(2)多字段:CREATE TABLE (stu_id INT,
stu_name varchar(20),
stu_sex Boolean
PRIMARY KEY(stu_id,stu_name)
);
主键功能:帮助MYSQL以最快的速度查找到表中的某一条信息。(主键和记录的关系=身份证和人的关系)
3、创建student 表SQL代码如下:
USE example;//选择数据库,后才能创建表。
CREATE TABLE student (num INT(10) NOT NULL UNIQUE PRIMARY KEY,
name V ARCHAR(20) NOT NULL,
sex V ARCHAR(4) NOT NULL,
birthday DATETIME,
address V ARCHAR(50)
);
代码执行后,用DESC语句来查看表的结构。
DESC student;
创建grade表:
CREATE TABLE grade(id INT(10) NOT NULL UNIQUE PRIMARY KEY AUTO_INCREMENT,
course V ARCHAR(10) NOT NULL,
s_num INT(10) NOT NULL,
grade V ARCHAR(4),
CONSTRAINT grade_fk FOREIGN KEY (s_num)
REFERENCES student(num)
);
//上述代码的解释:grade 表的外键字段s_num,依赖于student表的num字段,默认存储引擎为InnoDB.
4、将grade表的course字段数据改为VARCHAR(20)代码如下:
ALTER TABLE garde MODIFY course MODIFY course V ARCHAR(20);
DESC grade;//显示修改结果。
5、字段前移代码如下:
ALTER TABLE grade MODIFY s_num INT(10) AFTER id;
DESC grade;
6、更改字段名代码如下:
ALTER TABLE grade CHANGE grade score V ARCHAR(4);
DESC grade;
7、删除grade表的外键约束代码如下:
ALTER TABLE grade ENGINE=MyISAM; //更改存储引擎,由于外键约束,结果显示无法更改
需要删除外键约束:
ALTER TABLE grade DROP FOREIGN KEY grade_fk;
SHOW CREATE TABLE grade\G; //执行此代码,查看外键是否成功上删除。
8、删除外键后,再改存储引擎,代码如下:
ALTER TABLE grade ENGINE=MyISAM;
SHOW CREATE TABLE grade\G;
9、删除字段代码如下:
ALTER TABLE student DROP address;
DESC student;
10、增加字段代码如下:
ALTER TABLE student ADD phone INT(10);
DESC student;
11、更改表名代码:
ALTER TABLE grade RENAME gradeInfo;
SHOW TABLES;
12、删除表代码:
DROP TABLE student;
SHOW TABLES;
第三章索引
例:创user表和information
1、创建user表:
CREATE TABLE user(userid INT(10) NOT NULL UNIQUE PRIMARY KEY AUTO_INCREMENT,
username V ARCHAR(20) NOT NULL,
passwd V ARCHAR(20) NOT NULL,
info TEXT,
UNIQUE INDEX index_uid(userid DESC),
INDEX index_user(username,passwd),
FULLTEXT INDEX index_info(info)
)ENGINE=MyISAM;
SHOW CREATE TABLE user\G;
DESC student;
//说明:index_uid 是userid字段上的唯一性索引;index_user是username和passwd字段上的索引;index_info 是info字段上的全文索引;存储引擎是MyISAM.
2、创建infomation表:
CREATE TABLE information(id INT(10) NOT NULL UNIQUE PRIMARY KEY AUTO_INCREMENT,
name V ARCHAR(20) NOT NULL,
sex V ARCHAR(4) NOT NULL,
birthday DATE,
address V ARCHAR(50),
tel V ARCHAR(20),
pic BLOB
);
SHOW CREATE TABLE information\G;
DESC information;
//说明:id字段是主键,而且具有唯一性约束。
3、在字段中创建索引代码如下:
CREATE INDEX index_name ON information(name(10));
SHOW CREATE TABLE information\G;
//UNIQUE KEY……(唯一性索引),KEY(字段索引),FULLTEXT KEY(全文索引)
4、创建多列索引代码如下:
CREATE INDEX index_bir ON information(birthday,address);
SHOW CREATE TABLE information\G;
5、创建唯一性索引代码如下(用到ALTER TABLE):
ALTER TABLE information ADD INDEX index_id (id ASC);
SHOW CREATE TABLE information\G;
6、删除索引代码:
(1)
DROP INDEX index_user ON user;
SHOW CREATE TABLE user\G;
(2)
DROP INDEX index_name ON information;
SHOW CREATE TABLE information\G;
第四章视图
1、创建work_info表:
CREATE TABLE work_info(id INT(10) NOT NULL UNIQUE PRIMARY KEY,
name V ARCHAR(20) NOT NULL,
sex V ARCHAR(4) NOT NULL,
age INT(5),
address V ARCHAR(50),
tel V ARCHAR(20)
);
DESC work_info;
2、插入记录:
INSERT INTO work_info V ALUES(1,'张三','M','18','北京市海顁区','1234567'); INSERT INTO work_info V ALUES(2,'李四','M','22','北京市昌平区','2345678'); INSERT INTO work_info V ALUES(3,'王五','F','17','湖南省永州市','3456789'); INSERT INTO work_info V ALUES(4,'赵六','F','25','江苏省淮安市','4567890');
SELECT *FROM work_info; //显示插入的记录
3、创建视图代码如下:
CREATE ALGORITHM=MERGE VIEW
info_view(id,name,sex,address)
AS SELECT id,name,sex,address
FROM work_info WHERE age>20 //视图的条件
WITH LOCAL CHECK OPTION;
SELECT *FROM info_view
4、查看视图的所有记录:
SELECT* FROM info_view;(满足条件的所有记录)
5、修改视图info_view
ALTER ALGORITHM=MERGE VIEW //ALGORITHM 算法; MERGE 融合info_view(id,name,sex,address)
AS SELECT id,name,sex,address
FROM work_info WHERE age<20
WITH LOCAL CHECK OPTION;
SELECT* FROM info_view;
6、更新视图(UPDATE)
UPDATE info_view SET sex='M' WHERE id=3;
SELECT* FROM info_view;
7、删除视图
DROP VIEW info_view;
DESC info_view; // 执行该语句,查看是否存在
8、DESC info_view;和SELECT* FROM info_view;的区别
DESC info_view;显示的是字段属性;SELECT* FROM info_view;显示的是查看具体记录第五章触发器
例:创建product 和operate表
1、创建product表
CREATE TABLE product(id INT (10) NOT NULL UNIQUE PRIMARY KEY,
name V ARCHAR(20) NOT NULL,
function V ARCHAR(50),
company V ARCHAR(20) NOT NULL,
address V ARCHAR(50)
);
2、创建operate 表:
CREATE TABLE operate(op_id INT(10) NOT NULL UNIQUE PRIMARY KEY AUTO_INCREMENT,
op_type V ARCHAR(20) NOT NULL,
op_time TIME NOT NULL
);
3、创建触发器:
(1)创建product_bf_insert触发器
CREATE TRIGGER product_bf_insert BEFORE INSERT
ON product FOR EACH ROW //每一行加一个触发器
INSERT INTO operate V ALUES(null,'insert product',now());
SELECT *FROM information_schema.triggers WHERE TRIGGER_NAME='product_bf_insert'\G //查看触发器基本信息,其中triggers是'触发器'的意思。
(2)创建product_af_update触发器
CREATE TRIGGER product_af_update AFTER UPDATE
ON product FOR EACH ROW
INSERT INTO operate V ALUES(null,'Update product',now());
SELECT *FROM information_schema.triggers WHERE TRIGGER_NAME='product_af_update'\G
(3)创建product_af_del触发器
CREATE TRIGGER product_af_del AFTER DELETE
ON product FOR EACH ROW
INSERT INTO operare V ALUES(null,'delete product',now());
SELECT *FROM information_schema.triggers WHERE TRIGGER_NAME='product_af_del'\G 4、对product表进行操作
(1)向product表中插入一条记录:
INSERT INTO product V ALUES (1,'氨酚','治疗感冒','北京氨酚制药厂','北京市昌平区');
SELECT*FROM product; //显示插入记录
SELECT*FROM operate; //显示触发效果,表明成功触发了product_bf_insert触发器
(2)更新product表的记录
UPDATE product SET address='江苏省淮安市' WHERE id=1;
SELECT*FROM product; //显示插入记录
SELECT*FROM operate; //显示触发效果,表明成功触发了product_af_update触发器
(3)删除product中的一条记录
DELETE FROM product WHERE id=1;
SELECT*FROM product;
SELECT*FROM operate; //显示触发效果,表明成功触发了product_af_del触发器
5、删除触发器
DROP TRIGGER product_bf_insert;
SELECT *FROM information_schema.triggers WHERE TRIGGER_NAME='product_bf_insert'\G //显示删除效果,product_bf_insert 不存在了。
第六章查询数据
1、创建表student:
CREATE TABLE student(id INT(10) NOT NULL UNIQUE PRIMARY KEY AUTO_INCREMENT,
name V ARCHAR(20) NOT NULL,
sex V ARCHAR(4),
birth YEAR,
department V ARCHAR(20) NOT NULL,
address V ARCHAR(50)
);
2、创建表score:
CREATE TABLE score(id INT(10) NOT NULL UNIQUE PRIMARY KEY AUTO_INCREMENT,
stu_id INT(10) NOT NULL,
c_name V ARCHAR(20),
grade INT(10)
);
DESC score;
3、向student表中插入数据(记录)
INSERT INTO student V ALUES(901,'张老大','男',1985,'计算机系','北京市海顁区');
INSERT INTO student V ALUES(902,'张老二','男',1986,'中文系','北京市昌平区');
INSERT INTO student V ALUES(903,'张三','女',1990,'中文系','湖南省永州市');
INSERT INTO student V ALUES(904,'李四','男',1990,'英语系','辽宁省阜新市');
INSERT INTO student V ALUES(905,'王五','女',1991,'英语系','福建省厦门市');
INSERT INTO student V ALUES(906,'徐敏展','男',1990,'计算机系','江苏省淮安市');
SELECT *FROM student;
4、向score表中插入数据(记录)
INSERT INTO score V ALUES(NULL,901,'计算机',98);
INSERT INTO score V ALUES(NULL,901,'英语',80);
INSERT INTO score V ALUES(NULL,902,'计算机',65);
INSERT INTO score V ALUES(NULL,902,'国文',88);
INSERT INTO score V ALUES(NULL,903,'国文',95);
INSERT INTO score V ALUES(NULL,904,'计算机',70);
INSERT INTO score V ALUES(NULL,904,'英语',96);
INSERT INTO score V ALUES(NULL,905,'英语',94);
INSERT INTO score V ALUES(NULL,906,'计算机',96);
INSERT INTO score V ALUES(NULL,906,'英语',98);
SELECT *FROM score; // *表示所有字段,查询所有记录。
5、查询部分记录
SELECT*FROM student LIMIT 1,3; // 1 表示从第二条语句开始查询,3表示查处3条记录
6、指定字段查询(如:查询所有学生的学号、姓名、院系的信息)
SELECT id, name, department FROM student;
7、查询不同类别信息
(1)使用IN关键字
SELECT*FROM student
WHERE department IN ('计算机系','英语系');
(2)使用OR关键字
SELECT*FROM student
WHERE department= '计算机系' OR '英语系'; //只输出计算机系
SELECT*FROM student
WHERE department= '计算机系' OR department= '英语系'; //输出计算机系和英语系8、按年龄(数字)查找
问题是:目前只知道学生出生年月,不知年龄。——需用表达式获取年龄
(1)用AS关键字(形如:A AS B)获取年龄
SELECT name,2012-birth AS age FROM student;
(2) 按年龄查找:
法一:使用BETWEEN AND 关键字
SELECT id,name,sex,2012-birth AS age ,department,address
FROM student
WHERE 2012-birth BETWEEN 18 AND 22;
法二:使用AND 关键字和比较运算符
SELECT id,name,sex,2012-birth AS age,department,address
FROM student
WHERE 2012-birth>=18 AND 2012-birth<=22;
9、查询每个类中的数目(如:每个学院有多少人)
(1)
SELECT department ,COUNT(id)
FROM student GROUP BY department;
//使用GROUP BY关键字进行分组
//然后使用COUNT()函数计算每组有多少记录
(2)当然也可以取名
SELECT department,COUNT(id) AS sum_of_department
FROM student GROUP BY department;
10、从表中查询最高分
SELECT c_name,MAX(grade),stu_id
FROM score GROUP BY c_name;
11、查询某个人的考试成绩
问题:score中只有学号,没有姓名。所以必须根据姓名从student表中提取出学号
SELECT c_name,grade
FROM score WHERE stu_id=
(SELECT id FROM student
WHERE name='李四');
12、用连接查询的方法查询所有信息(如:学生信息、考试信息)
SELECT student.id,name,sex,birth,department,address,c_name,grade
FROM student,score
WHERE student.id=stu_id;
// student.id 表示的是student表的id字段,不同于score的stu_id,但他们都表示学号,用来连接
13、计算总成绩
思:要根据学号进行分组,后才能统计每个学生的总成绩
SELECT stu_id,SUM(grade)
FROM score GROUP BY stu_id;
思;没有姓名的显示,只有学号和成绩,这样不太直观
SELECT stu_id,name,SUM(grade)
FROM student,score
WHERE student.id=score.stu_id
GROUP BY stu_id;
14、统计每科考试的平均成绩
思:必须先按科目分组
SELECT c_name,A VG(grade)
FROM score
GROUP BY c_name;
15、统计计算机成绩低于95的学生
思:需要先找出参加计算机考试的学生,在判断其成绩是否低于95
SELECT *FROM student
WHERE id IN
(SELECT stu_id FROM score
WHERE c_name='计算机' AND grade<95);
16、查询同时参加计算机和英语考试的同学信息
SELECT* FROM student
WHERE id= ANY
(SELECT stu_id FROM score
WHERE stu_id IN (
SELECT stu_id FROM
score WHERE c_name='计算机')
AND c_name='英语');
17、计算机成绩从高到低进行排序
思:先查询出所有计算机考试成绩,然后排序
SELECT stu_id,grade
FROM score WHERE c_name='计算机'
ORDER BY grade DESC;
18、从student表和score表中查询学生学号,合并。
SELECT id FROM student
UNION
SELECT stu_id FROM score;
19、查询姓张、姓徐同学的姓名、院系、考试科目、成绩
SELECT student.id,name,sex,birth,department,address,c_name,grade FROM student,score
WHERE
(name LIKE '徐%')
AND
student.id=score.stu_id;