1.MySQL由以下组件构成:
一个SQL服务器、一些用来访问该服务器的客户程序、一套用来对数据库进行管理的软件工具,以及供用户自己编写程序的编 程接口
2.MySQL具有完善的访问控制机制,为了提供更进一步的安防措施,MySQL还支持使用SSL协议加密连接
3.具体的一个例子
把最近6个月没来参加定期检查的人查出来
SELECT last_name,first_name,last_visit FROM patient
WHERE last_visit<data_sub(CURDATE(),INTERVAL 6 MONYH);
你想从数据库得到哪些东西位于你想把哪些东西放到数据库里的前面也就是会用到的加到数据库里,永远也不会用到的,加了也没用
4.关系数据库管理系统(RDBMS)
数据库(database)存放信息的仓库
数据的集合放在数据表里(table)
数据表由数据行(row)和数据列(column)构成
一个数据行就是一条记录(record)
管理系统(management system)指的是对数据的操作,即增删查改关系(relational)把存放在两个表里的数据联系起来,通过查找两个数据库的共同元素实现
5.运行sql脚本
终端执行
mysql -h localhost -u root -p
有-p才能输入密码
输入密码
终端输入source sql文件的路径名(‘/’要全部改成’\’)
结束会话用quit或exit
6.查询当前时间
SELECT NOW();
最后必须有;或\g
\c取消
7.使用数据库的步骤
(1)创建(初始化)一个数据库
CREATE DATABASE sampdb;//最后一个单词是数据库名
SELECT DATABASE();//测试是否有默认数据库
若想设sampdb为默数据库
USE sampdb;
mysql -h localhost -u root -p sampdb //在启动时直接使用其为默认数据库
(2)在数据库里创建各种数据表
第一步:
USE sampdb;
第二步:
CREATE TABLE 表名
(
键名 类型(字节数) 能否为空
last_name VARCHAR(15) NOT NULL
);
创建自增的字段
id INT NOT NULL AUTO_INCREMENT
设置主键
PRIMARY KEY(id)
varchar为长度可变的字符值,ENUM是枚举类型,可用于性别或者一些选项的存储
在括号后分号前写ENGINE子句 存储引擎
ENGINE=InnoDB;
其中InnoDB是通过引入外键来建立表与表之间的关系
存储小数用decimal或float类型
8.当不愿意让某个字段中的数值重复时,用主键
9.当创建的表有两个主键时
CREATE TABLE score
(
student_id INT UNSIGNED NOT NULL,
event_id INT UNSIGNED NOT NULL,
score INT NOT NULL,
PRIMARY KEY (event_id,student_id),
INDEX (student_id),
FOREIGN KEY (event_id) REFERENCES grade_event (event_id),//将一个表中的主键和另一个表相关联,即为外键
FOREIGN KEY (student_id) REFERENCES student (student_id)
) ENGINE = InnoDB;
10.对数据表里的数据进行插入、检索、修改、删除操作
查看:
SELECT * FROM 数据表名;
SELECT 字段一名称,字段二名称,... from xxx;
列举时可以不按顺序,甚至可以重复列举
有条件的查询
比如查看考试不及格的
SELECT * FROM score where score < 60;
组合查找
SELECT last_name,first_name,birth,state FROM president
WHERE birth <’1750-1-1’ AND (state=’VA’ OR state=’MA’);
用in( )查找
SELECT last_name,first_name FROM president
WHERE state IN(‘VA’,’MA’);
对NULL值进行查找只能用IS NULL 或IS NOT NULL
SELECT last_name,first_name FROM president WHERE death IS NULL;
可以用<=>来比较NULL
NULL<=>NULL
查询结果的排列顺序是不确定的
比如将一个数据删除,会留下一个空行,然而下一次插入数据时不会在所有数据后插入,而是在被删除的那一行插入
按一定顺序输出数据
添加ORDER BY 子语句
如:
SELECT last_name,first_name FROM president ORDER BY last_name;
ORDER BY子语句默认升序排列,降序为DESC,升序为ASC,在字段名后边加
如果last_name相同时,再加一个字段来判断如:
SELECT last_name,first_name,state FROM president ORDER BY state
DESC,last_name ASC;
这句的意思是按州降序排列,当州相同时按姓氏升序排列如果数据行含有NULL,当升序排列时,在查询结果的开头,降序排列时,在查询结果的末尾.
如果想让NULL必须在前或必须在后,用IF()
SELECT last_name,first_name,death FROM president
ORDER BY IF(death ISNULL,0,1),death DESC;
限制查询结果中的数据个数(可用于分页)
用ORDER BY结合LIMIT子句使用
如:
SELECT last_name,first_name,birth FROM president ORDER BY birth LIMIT 5;
将生日最早的五位总统列出来
LIMIT子句也可单独使用
LIMIT可以跳过前边一段数据,显示中间的数据,需要两个数,第一个数是跳过前面几个数,第二个数是显示几条数据
如:
SELECT last_name,first_name,birth FROM president LIMIT 10,5;
跳过前面10个数据,显示第11条到第15条数据
从数据表随机抽取若干条数据
用ORDER BYRAND()和LIMIT结合使用
如:
SELECT first_name,last_name FROM president ORDER BY RAND() LIMIT 1;
从表中随机取一条数据
可以在终端用MySQL数据库计算一些表达式的值,将结果生成表格形式
如
SELECT 17,FORMAT(SQRT(25+3),3);
输出17,和25+3开三次根,结果用三位小数表示
CONCAT函数用来显示数据库中某个字段的值
如:
SELECT CONCAT (first_name,’ ’,last_name) FROM president;
中间的那个是两个字段的连接符可以用AS来取标题,而不是将表达式作为标题,这样不美观
如:
SELECT CONCAT(first_name,’ ’,last_name) AS Name FROM president;
如果别名有空格符,则AS后必须加单引号
如
AS ‘Place of birth’
与日期有关的问题
查询感兴趣的日期
SELECT *FROM grade_event WHERE date=’2008-10-01’;
查询某个区间段的日期
SELECT last_name,first_name,death FROM president WHERE death >=’1970-01-01’
AND death < ’1980-01-01’;
日期中的年、月、日三部分可以用函数YEAR()、MONTH()、DAYOFMONTH()分离
出来
如:
SELECT last_name,first_name,birth FROM president WHERE MONTH(birth)=3;
把生日在三月的美国总统查出来
CURDATE()函数,返回今天的值如:
SELECT last_name,first_name,birth FROM president
WHERE MONTH (birth) = MONTH (CURDATE())
AND DAYOFMONTH (birth) = DAYOFMONTH (CURDATE());
两个日期之间的时间间隔,用timestampdiff()函数
如:
SELECT last_name,first_name,birth,death,TIMESTAMPDIFF(YEAR,birth,death) AS age
FROM president WHERE death IS NOT NULL ORDER BY age DESC LIMIT 5;
计算年龄
用TO_DAYS()函数
能计算出两个日期相差几天
用TIMESTAMPDIFF()函数也可以
日期值改变用DATE_ADD()或DATE_SUB()
如:
SELECT DATE_ADD(‘1970-1-1’,INTERVAL 10 YEAR);
SELECT DATE_SUB(‘1970-1-1’,INTERVAL 10 YEAR);
模式匹配(即搜索功能实现)
用LIKE
如:
SELECT last_name,first_name FROM president
WHERE last_name LIKE ‘W%’;
这里的%用来为一个字符串占位,表示以w或W开头的,%是占一个字符串,而_是占一个字符
姓氏仅由四个字母构成的总统姓名
SELECT last_name,first_name FROM president
WHERE last_name LIKE’____’;
设置和使用SQL变量
@变量名,赋值语法
在SELECT语句里使用‘@变量名:=值’的形式
在SET语句中‘@变量名:=值’和‘@变量名=值’都可以使用
在SELECT语句中显示最终结果时用@变量名
如:
SELECT @birth:=birth FROM president WHERE last_name=’Jackson’
AND first_name=’Andrew’;//其中birth变量等于后边的一大堆
SELECT last_name,first_name,birth FROM president
WHERE birth <@birth ORDER BY birth;
找出一个数据里有多少种不同的取值
用DISTINCT关键词
如:
SELECT DISTINCT state FROM president ORDER BY state;
COUNT()用来计数
将数列中不同值出现的次数统计出来
用GROUP BY子句
如:
SELECT sex,COUNT(*) FROM student GROUP BY sex;
HAVING子句
和WHERE子句类似,也是用于限制查询条件,而HAVING子句允许COUNT()之类的汇总结果出现在HAVING子句中
如:
SELECT state COUNT(*) AS count FROM president
GROUP BY state HAVING count >1 ORDER BY count DESC;
输出总结果
用WITH ROLLUP子句
如:
SELECT sex,COUNT(*) FROM student GROUP BY sex WITH ROLLUP;
新加的子句对两种性别的学生人数进行汇总
多表查询
方法一:联结----->join
为了避免产生二义性,在字段名前要加表名
如:
SELECT student.student.id,student.name,
COUNT(absence.date) AS absences
FROM student INNER JOIN absence
ON student.student_id=absence.student_id
GROUP BY student.student_id;
LEFT JOIN将左边数据表中应该列出的信息都列出来
方法二:select 语句嵌套
如:
查看全勤学生
SELECT *FROM student
WHERE student_id NOT IN(SELECT student_id FROM absence);
插入:
INSERT INTO 表名 VALUES(‘’,’’,’’,....);
INSERT INTO表名(‘’,’’,’’) VALUES(‘’,’’,’’,.....)
第一个括号中放字段名,第二个括号放存放的值
INSERT INTO 表名 SET 字段名=值, 字段名=值,......;
INSERT INTO student VALUES(‘Kyle’,’M’,NULL);
INSERT INTO grade_event VALUES(‘2008-09-03’,’Q’,NULL);
插入多条数据
INSERT INTO student VALUES(‘Kyle’,’M’,NULL),(‘Kyle’,’M’,NULL),(‘Kyle’,’M’,NULL);
删除和修改:
DELETE语句用来删除
基本格式:
DELETE FROM tbl_name
WHERE which rows to delete;
建议在删除之前先用SELETE语句测试删除的是不是想要删除的数据
UPDATE语句用来修改
基本格式:
UPDATE tbl_name
SET which columns to change
WHERE which rows to update;
如:
UPDATE member
SET expiration=’2009-7-20’
WHERE last_name=’York’ AND first_name=’Jerome’;
11.查看表结构
DESCRIBE 表名;
DESCRIBE president;
DESC president;
EXPLAIN president;
SHOW COLUMNS FROM president;
SHOW FIELDS FROM president;
12.查看表里某个字段的具体设置
DESCRIBE 表名 '字段名';
DESCRIBE student 'sex';
若想模糊查询某个字段,在10后用like语句
SHOW COLUMNS FROM president LIKE '%name';
显示默认数据表
SHOW TABLES;
显示当前连接服务器中的全部数据库
SHOW DATABASES;
查看2008年9月23日的考试分数
SELECT score.name,grade_event.date,score.score,grade_event.category
FROM score INNER JOIN grade_event
ON score.event_id=grade_event.event_id
WHERE grade_event.date='2008-09-23';
导入数据表
SOURCE sql文件的路径,\ 全部换成 /
主键:不允许重复
外键:表与表之间通过外键联系,即关联两个表中的字段
外键还有一种依赖关系,比如C在A和B基础上创建的,就必须先创建A表和B表,若想丢弃数据表时,就应该反过来,先将C丢弃,才能丢弃A或B表。