您的位置:首页 > 数据库 > MySQL

MySQL学习——基础知识

2013-06-27 12:26 519 查看
一:基本介绍
MySQL是一款开源的关系数据库管理系统,最早有瑞典的MySQL AB公司开发,2008年被SUN公司收购,2009年,SUN公司被Oracle公司收购。MySQL性能高、成本低、安全稳定,被广泛应用在中小型网站中,随着MySQL的性能不断提高,像维基百科、Google、Facebook等大公司也正在使用MySQL(维基百科现在以迁移到MariaDB)。
MySQL使用C和C++编写,并为多种语言提供了API,支持多线程,充分利用CPU资源,支持多用户,提供TCP/IP/、ODBC和JDBC等等多种数据库连接途径,且提供了用于管理、检查、优化数据库操作的管理工具,可以处理拥有上千万条记录的大型数据库。

MySQL数据库模型:
逻辑模型:表、索引(加速查询操作、减慢写操作)、视图、用户、存储历程(存储过程、存储函数)、触发器(符合某特定条件会触发另外的操作)、事件调度器(在某一时间点执行特定操作)。
物理模型:数据库管理组件(元数据:记录数据库中的文件存储方式)。存储元数据等物理文件的地方是存储引擎。
键:其实也是一种约束,向表中填写数据时不能违反规则。
主键:primary key,非空,不能有相同值,一个表只能有一个主键。
外键:foteign key,表之间建立约束,引用性约束,某一个表中值的取值范围必须符合另一个表。
唯一性约束:unique key,如果不空则值不能相同,一个表可以有多个唯一键。

DBMS数据库管理系统的功能:
管理存储
安全管理
管理元数据
事务管理 (事务:被看成一个整体的多个SQL语句)符合ACID测试即为事务 (A原子性 C一致性 I隔离性 D持久性)
连接管理
性能优化
提供备份和还原
提供接口响应数据的请求和修改

存储引擎实际上就是表类型,是表级别的工具,在同一个数据库中,不同的表可以使用不同的存储引擎,存储引擎就负责将展现给用户的表中的相关数据组织在硬盘空间当中,当用户需要检索的时候,存储引擎到对应的存储空间中取得数据,并逐层向上返回的。存储引擎是实实在在和数据打交道的一个接口,一个层次,非常底层。但是存储引擎决定了关系型数据库的兼容能力的。
常用的存储引擎:
MyISAM 适合多读少写,不支持事务。
InnoDB 5.5以后默认存储引擎,支持事务,支持行级锁
NDB 集群专用
Archive 适合数据长久存放
Memory 使用Memory存储引擎时,mysql本身就是一个内存数据库了,性能好,但不能持久存储数据。

MySQL安装可以使用源码编译安装,也可使用rpm包直接安装,源码安装前面已经介绍。
在mysql安装完之后,要做的第一件事就是为管理员账户设定密码,并删除两个匿名用户;一般mysql安装完成之后会生成三个管理员用户账号,和两个匿名用户账号。
三个管理员用户账号:
root@127.0.0.1
root@localhost
root@hostname
两个匿名用户账号:
‘’@localhost
‘’@hostname

为用户添加密码:
方法一:
#mysqladmin -u root password 'new-passwd'
#mysqladmin -u root -h this_host_name password 'new-passwd'
方法二:
mysql> SET PASSWORD FOR 'root'@'host_name'=PASSWORD ('new_passwd')
方法三:
mysql> UPDATE mysql.user SET Password=PASSWORD(‘new_passwd') WHERE User='root' and Host='127.0.0.1';
mysql> FLUSH PRIVILEGES;
匿名用户删除:
mysql>DROP USER ''@localhost;
mysql> FLUSH PRIVILEGES;


mysql/mysqladmin/mysqldump命令常用的一些选项:
帮助信息:
-?
-I
--help
**********************************************************
(单字符后面不带空格)
--user,-u 指定用户访问mysqld
--host,-h 指定服务器的名字
--password,-p
--protocol 指定连接协议(tcp/socket/pipe/memory)
使用--protocol socket时,本地客户端是通过/tmp/mysql.sock(sock文件位置可能不同)连接本地mysqld服务
--port 远程服务器的连接端口
--socket
-D db_name 直接使用某个数据库作为默认数据库
--datebase=...
--compress 数据在服务器端和客户端之间压缩传输
--default-character-set=charset_name 指定字符集
-V  显示版本号
-v 命令执行时显示详细信息
--ssl-ca=/path/to/ssl_ca_file  证书存放位置 (为了验证对方的证书)
--ssl-capath=/path/to/ca_dir   证书目录
--ssl-cert=/path/to/cert_file      //自己的证书
--ssl-cipher=cipher_list   加密方式
--ssl-key=/path/to/key_file   自己的私钥
--ssl-verify-server-cert    验证服务器证书


mysql -e 不登陆mysql直接执行命令
例如:#mysql -e 'SHOW DATABASES;'

mysqladmin常用选项:

create 创建数据库
drop   删除数据库
debug  用于输出调试信息
status 显示全局变量和他的值
--sleep n  每个n秒显示一次
--count n  一共显示n次
例如:#mysqladmin --sleep 3 --count 3 status
extended-status 显示所有系统变量和值/运行状态属性信息
flush-hosts  清空hosts内部信息
flush-logs   做二进制日志滚动
flush-privileges 刷新
flush-status  重新开始计数
flush-tables  关闭表
flush-threads 重置线程缓存池
kill    结束某个客户端线程
processlist 列举所有的进程和线程
password 为某用户设置密码
ping    查看是否处于运行状态
reload   flush-privilege
refresh    flush-hosts&flush-logs
shutdown   关闭指定mysql服务器
start-slave 启动从服务器
stop-slave
variables 显示全局变量


二:MySQL数据类型

1、常用数据类型
数值型
精确型
整形
TINYINT : 1个字节存储 -128-127
SMALLINT 2
MEDIUMINT 3
INT 4
BIGINT 8
decimal (精确的小数)
numerical

近似型
浮点型
FLOAT 浮点型 单精度
DOUBLE 浮点型 双精度

字符型
char: CHAR(length) 固定长度的字符串类型,255字节符。(存为字符集)
varchar:VARCHAR(length) 可变长度字符串类型,65535字符 。(存为字符集)
binary:BINARY(length) (存为二进制)
varbinary: VARBINARY(length) (存为二进制)
text 字符存储大文本 (存为字符集)
blob 二进制的大文本
TINYBLOB 255byte (存为二进制)
BLOB 64k(存为二进制)
MEDIUMBLOB 16M(存为二进制)
LONGBLOB 4G(存为二进制)
ENUM,SET mysql的内置类型

ENUM 枚举 从多个里面选一个 (要先定义好可用的值。用户要插入的数据只能是事先定义好的数据的一个。如事先定义:Weekday ENUM('Mon','Tus','Wed','Tus','Fri','Sat','Sun'))
SET 从定义好的值中选多个,也可以将数据组合,如'MonTus'

日期时间型
Date 日期,3字节,只表示日期 'XXXX-XX-XX'
Time 时间,3字节只表示时间 'XX:XX:XX'
Datetime 日期时间,8字节,表示日期和时间 'XXXX-XX-XX XX:XX:XX'
Timestamp 时间戳,4字节, 以UTC时间 时间戳 'XXXX-XX-XX XX:XX:XX'
Year (2位|4位)
year(2) 1字节 'XX'
year(4) 1字节 'XXXX'

2、数据常用修饰符

1)、字符串常用修饰符:只修饰字符型,不修饰二进制型
NOT NULL 非空
NULL 空
DEFAULT 默认值
BINARY 字符存储、索引等区分大小写,(默认不区分大小写,使用BINARY后就会区分大小写)
CHARACTER SET 定义字符集
COLLATION 排序规则 每一种字符集至少有一种排序规则

2)、整形常见的修饰符
AUTO_INCREMENT 自动增长
auto_increment_increment= 定义步长,一次增加几,定义在mysql的主配置文件中的mysqld段中。
NOT NULL
NULL
DEFAULT
UNSIGNED 无符号,不包括负数,用于整形

3)、日期时间型的修饰符
NOT NULL
NULL
DEFAULT

三:大小写问题:
1、sql关键字和函数名不区分大小写
2、数据库,表名,视图名字,是否区分大小写取决于操作系统对待文件名是否区分大小写
3、存储过程和存储函数名称不区分大小写,但是触发器的名称区分大小写
4、表别名区分大小写

四:服务器变量:
全局变量:使用GLOBAL修饰
会话变量:只对当前会话有效,退出后失效。使用SESSION修饰
例如:SHOW GLOBAL VARIABLES LIKE 'data%'; 可查看datadir的位置,databases中所有的数据库都在datadir中.

五:用户管理:
mysql中用%表示任意长度的任意字符,_表示任意单个字符,在mysql在,字符串中使用%和_,必须对该字符串加引号。

创建用户:
CREATE USER 'user'@'host' [IDENTIFIED BY 'password'];创建用户 (这样创建用户只具有连接权限)
授权:(ALL PRIVILEGES表示所有权限,*.*表示所有数据库的所有表)
GRANT privilege_list ON db.tables TO 'user'@'host' [IDENTIFIED BY 'password'] [ REQUIRE ssl] [WITH GRANT OPTION]; 授权 (ON 后面可加的限定符有TABLE/PROCUDURE(存储过程)/FUNCTION);REQUIRE ssl;基于ssl的方式来识别用户,远程连接。
WITH 选项:
GRANT OPTION 一个用户获得的授权可以转给其他人,一般不加此选项,不安全。
资源限定:
| MAX_QUERIES_PER_HOUR count 每小时的查询count此的次数限定,count是数字
| MAX_UPDATES_PER_HOUR count 更行
| MAX_CONNECTIONS_PER_HOUR count 每小时的连接次数
| MAX_USER_CONNECTIONS count 每个用户最多发起多少次连接请求此时

能够用GRANT授予给用户的权限:
CREATE TEMPORARY TABLES    创建临时表
CREATE USER
LOCK TABLES
PROCESS    查看进程
RELOAD
REPLICATION CLIENT   复制客户端权限,如果一个用户需要到服务器上获取复制主机的相关信息,需要CLIENT权限
REPLICATION SLAVE 复制从服务器的权限,从服务器到主服务器上复制数据需要SLAVE权限
从服务器上的用户必须具有上面两个权限才能从主服务器上复制数据
SHOW DATABASES
SHUTDOWN
SUPER 管理不便归类的权限
ALTER   修改
ALTER ROUTING 修改存储历程(存储过程、存储函数)的权限
CREATE
CREATE ROUTING
CREATE VIEW  创建视图
DELECT
DROP
EXECUTE  执行存储历程的权限
GRANT OPTION    将自己的权限授予别人的权限
INDEX        创建或删除索引
INSERT
SELECT  (可以精确到只对某字段授予搜索权限 ,例如 SELECT(name,age)表示只能查看这两个字段)
SHOW VIEW   查看视图的权限
UPDATE


显示用户获得的权限:
SHOW GRANTS FOR 'user'@'host';

收回权限:
REVOKE privilege_list ON db.tables FROM 'user'@'host'; 收回权限
REVOKE ALL PRIVILEGES ON db.tables FROM 'user'@'host'; 收回所有权限

删除用户:
DROP USER user
用户重命名:
RENAME USER old_user TO new_user

六:常用语句:

CREATEDDL:数据定义语言
关于数据库对象操作的语句
DROP
ALTER
INSERT INTODML:数据操作语言
用于修改表中数据的,操作数据本身,而非操作数据库对象.
UPDATE...SET
REPLACE...INTO
DELETE FROM
TRUNCATE
1、创建表:
创建表的三种方式:
1)、直接创建(通过定义字段的信息创建)
CREATE TABLE tbs ();
table options:
ENGINE = engine_name
AUTO_INCREMENT = value 从value开始计数
CHARACTER SET = char-set
DATE DERECTORY =指定存储数据的目录
DELAY_KEY_WRITE = {0 | 1} 延迟键写入 //使用索引时会使表的写入速度减慢,使用DELAY_KEY_WRITE不会立即更新索引,而是过一段时间更新
COLLATE = collate 排序
INDEX (字段) 索引
COMMENT='' 附加信息
2)、通过从其他表中检索数据后来创建表(检索过来的数据并不能附带原表中关于字段属性的定义)
CREATE TABLE tbs () SELECT clause;
例子: CREATE TABLE tb1 SELECT * FROM tb2 WHERE UIN < 3;
3)、以某表为模板创建表 (不复制数据,只复制表定义)
CREATE TABLE tbs LIKE old_tbs;
显示创建表时所用的命令:SHOW CREATE TABLE tbs;

2:删除表:
删除表中的内容,而定义的规则不变:
DELETE FROM tbs;
清空表(删除表中的内容)并重置计数器:
TRUNCATE tbs

删除表
DROP TABLE tbl_name;

3、向表中插入数据:
INSERT INTO
方法1:
INSERT INTO tb_name [(col1,col2,...)] VALUES|VALUE (val1, val2, ...)
例子:INSERT INTO classes (Name,Numogstu) VALUES ('class2',31),('class3',31); //插入的value是字符型时要用引号引起来
方法2:
INSERT INTO tb_name SET col1=val1, col2=val2, ...
方法3:
INSERT INTO tb_name SELECT *FROM tb2 [WHERE ...]

4、altering Tables 修改表:修改的是表所定义的属性信息。
新增字段 add
ALTER TABLE tb_name ADD column_name column_defination [FIRST | AFTER column];
ALTER TABLE tb_name ADD (col1 column_defi, col2 column_defi);
修改字段 modify (字段属性)
ALTER TABLE tb_name MODIFY [COLUMN] col_name column_definition [FIRST | AFTER col_name];
改变字段 CHANGE(字段名称和属性)
ALTER TABLE tb_name CHANGE [COLUMN] old_col_name new_col_name column_definition [FIRST|AFTER col_name];
删除字段
ALTER TABLE tb_name DROP [COLUMN] col_name;
改表名
ALTER TABLE tb_name RENAME [TO] new_tbl_name;
RENAME TABLE old_table TO backup_table, new_table TO old_table;
例如:RENAME TABLE tb1 TO tb2;

5、select查询:
1)、SELECT:
SELECT values_to_display 查询值
加AS,给字段取别名 >SELECT Name AS student FROM students
DISTINCT 只显示不重复的值
FROM table_name 从哪里查
WHERE expression 限定条件
限定条件可以做算术运算
+-*/% = , <>不等于,<=>, < , >, <=, >=
BETWEEN...AND... , IS NULL, IS NOT NULL, IN后面跟一个集合,例如:IN(19,20,30)
LIKE(%任意长度任意字符,_ 任意单个字符)
REGEXP aka RLIKE(支持正则表达式查询),
NOT aka !
AND aka &&
OR aka ||
XOR
GROUP BY how_to_group 查询结果分组(聚合函数)
COUNT() 计数
MAX() 最大值
MIN() 最小值
AVG() 平均值
例如:SELECT COUNT(*) AVG(age),MAX(age) FROM students GROUP BY gender; // COUNT(*)表示统计个数
HAVING expression 对GROUP BY的结果在做条件过滤
例如:SELECT AVG(age),MAX(age) FROM students GROUP BY gender HAVING AVG(age) >=20;
ORDER BY how_to_sort 对查找的结果进行排序 ////降序时加DESC
LIMIT row_count; 对查找的结果做限定(排完序后的多少个)
LIMIT m,n 对排完序之后的跳过(偏移)m个,在取n个。

2)、联结查询:
交叉联结 (笛卡尔乘积) 避免使用
内联结(Inner Jion):通过匹配两个表之间的等值关系,建立的联结
例如:SELECT * FROM student,cources WHERE students.CID1=cources.CID;
外联结(Outer Jion) 两个表之间不是等值关系,一个表中可能没有值。
左外 SELECT...FROM...LEFT JION...ON... 以左表为基准,右表没有就显示为空。 (不需要where)
例如:SELECT name,cname FROM student LEFT JION courses ON student.CID1=courses.CID
右外 SELECT...FROM...RIGHT JION...ON... 以右表为基准,左表可能为空。(不需要where)
完全外
自联结 (SELF JION): 同一个表的两个字段建立联系。
例如:SELECT s1.name,s2.name FROM students AS s1,students AS s2 WHERE s1.TID=s2.SID
联合(UNION):将两个字段的查询结果联结在一起(也就是将两个查询语句用UNION联合起来)
子查询:让一个查询基于另一个查询的结果进行查询

例如:SELECT name,age FROM student WHERE age > (SELECT AVG(age) FROM STUDENT);

6、创建索引:
CREATE INDEX 索引名称 ON 表名(列名);
例如:mysql>CREATE TABLE tb1 (SID INT UNSIGNED,NAME VARCHAR(50),INDEX(SID)); 表示为SID字段创建索引

显示索引:SHOW INDEX FROM tbl_name [FROM db_name];
删除索引: DROP INDEX index_name ON tbl_name ;
EXPLAIN 显示操作是否使用索引。
例如:mysql>EXPLAIN SELECT * FROM tb WHERE name LIKE "stu%'\G 即可显示本次查询是否使用了索引。

7、视图:
创建视图:CREATE VIEW view_name AS select_statemen; select_statement表示SELECT语句,将SELECT语句查询得到的表建立为一个视图。
删除视图:DROP VIEW view_name
显示创建view的命令:SHOW CREATE VIEW view_name
虚表中插入数据时查看基表是否允许,但mysql中不允许向视图中插入数据。
对视图的查询就是一种子查询,在实际操作中英避免子查询。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mysql 数据库 select