MySQL基础1

  • SQL (Structured Query Language)
    结构化查询语言。数据库管理系统(DBMS)通过SQL语句来管理数据库中的数据。
    主要分为:
    1)DDL(Data Defination Language):数据定义语言,用于定义数据库、表、视图、索引、触发器等。如DROP、CREATE、 ALTER等。
    2)DML(Data Manipulation Language):数据操作语言,用于对数据的删增改。DELETE、INSERT、UPDATE。
    3)DQL(Data Query Language):数据查询语言,用于从表中获取数据,确定数据在应用程序中如何组织,如SELECT。
    4)DCL(Data Control Language):数据控制语言,用于控制用户访问权限,如GRANT、REVOKE、COMMIT、ROLLBACK等语句。

  • 修改MySQL命令提示符
    1)连接服务器时通过参数指定:mysql -u root -p –prompt 提示符
    2)连上客户端后,通过prompt命令修改:prompt 提示符
    3)常用参数:\D-完整日期,\d-当前数据库,\h-服务器名称,\u当前用户名。

  • MySQL语句规范
    1)关键字与函数名全部大写
    2)数据库名称、表名称、字段名称等全部小写
    3)SQL语句必须以分隔符结尾
    4)SQL语句支持折行操作,但不能将单词折行
    5)数据库名称、表名称、字段名称尽量不使用MySQL保留字,如需要应使用反引号(``)

  • 生成输出日志
    开始:\T 保存地址
    结束:\t

  • 数据库操作(DDL)
    1)创建/定义数据库
    CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name [DEFAULT] CHARACTER SET [=] charset_name;
    {}代表必写,[]代表可选,|代表‘或‘
    查看警告:SHOW WARNINGS;
    2)查看已有数据库
    SHOW {DATABASES|SCHEMAS};
    查看指定数据库的定义
    SHOW CREATE {DATABASE | SCHEMA} db_name;
    3)修改指定数据库编码方式
    ALTER {DATABASE | SCHEMA} db_name [DEFAULT] CHARACTER SET [=] charset_name;
    4)打开数据库
    USE db_name;
    得到当前打开的数据库名称
    SELECT {DATABASE() | SCHEMA()};
    5)删除指定数据库
    DROP {DATABASE | SCHEMA} [IF EXISTS] db_name

  • 数据表操作
    1)数据类型
    -1- 整数类型TINYINT、SMALLINT、INT、BIGINT、BOOL
    BOOL一般用TINYINT(1)表示。
    -2- 浮点类型FLOAT、DOUBLE、DECIMAL
    DECIMAL以字符形式保存,更准确。
    -3- 字符串类型CHAR(M)VARCHAR(M)TEXTENUM(‘value1’, ‘value2’,…)、SET(‘value1’, ‘value2’,…)等
    CHAR占用空间大,速度快,自动删除末尾空格;VARCHAR占用空间小,速度慢,保留末尾空格。TEXT不能设置默认值。ENUM为枚举类型,只能选一个值,可以用序号赋值。SET为集合类型,可选多个值,可用二进制对应的十进制数和选取前几个,如SET(3)为前两个值。
    -4- 日期时间类型: TIME、DATE、DATETIME、TIMESTAMP、YEAR
    YEAR可接受数字或字符串,YEAR(0)是0000,YEAR(‘0’)是2000
    -5- 二进制类型

    2)表的存储引擎
    即为表的类型。用户可以根据不同的存储方式、是否进行事物处理来选择合适的存储引擎。
    -查看存储引擎-
    查看MySQL支持的存储引擎: SHOW ENGINES
    查看显示支持的存储引擎信息:SHOW VARIABLES LIKE 'have%'
    查看默认存储引擎:SHOW VARIABLES LIKE ‘stoarge_engine’
    -常用存储引擎-
    InnoDB(默认):支持事务处理,支持外借,支持崩溃修复和并发控制。适合对事物完整性要求高或需要使用并发控制,频繁进行更新删除操作的数据库,因为支持事务提交及回滚。
    MyISAM:插入数据速度快,空间内存使用率低,适合主要插入或读取记录的表。不支持事务,对数据完整性和并发性要求不高时使用。
    MEMORY:将数据存储在内存中,数据处理速度快但安全性不高。生命周期比较短,多为一次性。对表大小有限制,无法建立太大的表。

    同一个数据库中可以使用不同类型存储引擎的数据表

  • 数据表
    数据表是储存数据的数据结构,又行和列组成,一定先有结构再有数据,且至少要有一列,数据表名需唯一且不包含特殊字符。

    -1- 创建表
    CREATE TABLE [IF NOT EXIST] tbl_name(字段名称 字段类型 [完整性约束条件] ... ) ENGINE=引擎名称 CHARSET='编码方式';

USE maomi;

-- 创建学院表
-- 编号 id
-- 用户名 username
-- 年龄 ahe
-- 性别 sex
-- 邮箱 email
-- 地址 addr
-- 生日 birth
-- 薪水 salary
-- 电话 tel
-- 是否结婚 married

-- 当需要输入中文时,临时转换客户端编码方式: SET NAMES GBK;
-- 通过COMMENT '注释内容',给字段添加注释

CREATE TABLE IF NOT EXISTS `user`(
id SMALLINT,
username VARCHAR(20),
age TINYINT,
sex ENUM('男','女','保密'),
email VARCHAR(50),
addr VARCHAR(200),
birth YEAR,
salary FLOAT(8,2),
tel INT,
married TINYINT(1) COMMENT '0代表未婚,1代表已婚'  -- 用此来表示bool类型
)ENGINE=INNODB CHARSET=UTF8;

查看数据库中的数据表
SHOW TABLES;

查看数据表结构
DESC tbl_name;
DESCRIBE tbl_name;
SHOW COLUMNS FROM tbl_name;

向表中插入记录
INSERT tbl_name VALUE|VALUES(value1, ...)


完整性约束条件

UNSIGNED:无符号,从0开始,数字储存范围翻倍。
ZEROFILL:未达到显示长度时用0填充。
PRIMARY KEY 主键:一般加到无意义且不重复的字段上,自动非空,通过主键快速定位信息。
AUTO_INCREMENT 自增长
FOREIGN KEY 外键
NOT NULL 非空
UNIQUE KEY 唯一
DEFAULT 默认值

  • 自增长 AUTO_INCREMENT
CREATE TABLE IF NOT EXISTS user6(
id SMALLINT KEY AUTO_INCREMENT,
username VARCHAR(20)
)AUTO_INCREMENT=100;

必须设定为主键,后续添加数据主键编号自动增长。

  • 非空 NOT NULL与默认值 DEFAULT
    指定列必须非空,一般与DEFAULT共同使用。
CREATE TABLE IF NOT EXISTS user8(
id INT UNSIGNED KEY AUTO_INCREMENT,
username VARCHAR(20) NOT NULL,
password CHAR(32) NOT NULL,
age TINYINT UNSIGNED DEFAULT 18,
addr VARCHAR(50) NOT NULL DEFAULT '北京',
sex ENUM('男','女','保密') NOT NULL DEFAULT '男'
);
  • 唯一值 UNIUQUE (KEY)

字段的修改

  • 添加或删除字段
ALTER TABLE user10 
ADD test INT UNSIGNED NOT NULL UNIQUE AFTER sex,
DROP addr;
  • 修改字段
    MODIFY 更改字段数据类型和完整性约束条件,CHANGE除此之外还能修改字段名称。
ALTER TABLE user10 MODIFY email VARCHAR(50) NOT NULL DEFAULT '[email protected]';
-- 将card字段移动到test字段之后
ALTER TABLE user10 MODIFY card CHAR(18) AFTER test;
ALTER TABLE user10 CHANGE test test1 CHAR(32) NOT NULL DEFAULT '123';
  • 添加/删除默认值
-- 添加默认值
ALTER TABLE user11 ALTER age SET DEFAULT 18;
-- 删除默认值
ALTER TABLE user11 ALTER age DROP DEFAULT;
  • 添加/删除主键
-- 添加主键
ALTER TABLE test12 ADD PRIMARY KEY(id)
ALTER TABLE test12 ADD CONSTRAINT symbol PRIMARY KEY index_type(id)
-- 删除主键
ALTER TABLE test12 DROP PRIMARY KEY;
-- 在设置了AUTO_INCREMENT的情况下,需要先取消AUTO_INCREMENT
ALTER TABLE test14 MODIFY id INT UNSIGNED;
ALTER TABLE test14 DROP PRIMARY KEY ;
  • 添加/删除唯一
-- 添加唯一
ALTER TABLE user12 ADD UNIQUE(username);
ALTER TABLE user12 ADD CONSTRAINT symbol  UNIQUE KEY uni_card(card);
ALTER TABLE user12 ADD CONSTRAINT symbol UNIQUE INDEX mulUni_test_test1(test,test1);
ALTER TABLE user12 DROP INDEX username;
ALTER TABLE user12 DROP KEY uni_card;
-- 删除唯一

  • 插入/删除记录
INSERT user VALUE(2,'QUEEN','QUEEN','[email protected]',30);

INSERT user(username,password) VALUES('A','AAA');

-- 一次插入多条记录
INSERT user VALUES(6,'D','DDD','[email protected]',35),
(8,'E','EEE','[email protected]',9),
(18,'F','FFF','[email protected]',32);

-- 通过INSERT SET形式插入记录
INSERT user SET username='maizi',password='maizixueyuan' ;

-- 将查询结果插入到表中
INSERT testUser SELECT id,username FROM user;
-- 报错,字段数目不匹配
INSERT testUser SELECT * FROM user;

INSERT testUser(username) SELECT username FROM user;
  • 更新/删除记录
-- 更新第一个记录的password,email,age
UPDATE user SET password='king123',email='[email protected]',age=99 WHERE id=1;
-- 删除user表中id为1的用户
DELETE FROM user WHERE id=1;
-- 彻底清空user表
TRUNCATE TABLE user;


查询语句

  • 简单查询
-- 查询
SELECT * FROM cms_admin;

SELECT cms_admin.* FROM cms_admin;

-- 查询管理员编号和名称

SELECT id,username FROM cms_admin;

-- 表来自于哪个数据库下db_name.tbl_name
SELECT id,username,role FROM cms.cms_admin;

-- 字段来自于哪张表

SELECT cms_admin.id,cms_admin.username FROM cms.cms_admin;

-- 给表名起别名

SELECT id,username FROM cms_admin AS a;

SELECT a.id,a.username,a.email,a.role FROM cms_admin AS a;

-- 给字段起别名

SELECT id AS '编号',username AS '用户名',email AS '邮箱',role '角色' FROM cms_admin;

SELECT 1,2,3,4,5,id,username FROM cms_user;
  • 比较运算符
-- 查询编号为1的用户
SELECT id,username,email FROM cms_user WHERE id=1;

-- 查询编号不为1的用户
SELECT  * FROM cms_user WHERE id!=1;

SELECT  * FROM cms_user WHERE id<>1;

-- 添加age字段
ALTER TABLE cms_user ADD age TINYINT UNSIGNED DEFAULT 18;
INSERT cms_user(username,password,regTime,proId,age)
VALUES('test1','test1',1419811708,1,NULL);

-- 查询表中记录age值为NULL
SELECT * FROM cms_user WHERE age<=>NULL;

-- IS NULL 或者IS NOT NULL
SELECT * FROM cms_user WHERE age IS NULL;
  • 范围查询
-- 查询编号在3~10之间的用户
SELECT * FROM cms_user WHERE id BETWEEN 3 AND 10;

-- 查询编号为1,3,5,7,9,11,13,100
SELECT * FROM cms_user WHERE id IN(1,3,5,7,9,11,13,100,1000);
  • 模糊查询
-- %:代表0个、一个或者多个任意字符
-- _:代表1个任意字符
-- 查询姓张的用户
SELECT * FROM cms_user WHERE username LIKE '张%';

-- 查询用户名中包含in的用户
SELECT * FROM cms_user WHERE username LIKE '%in%';

-- 查询用户名为3位的用户

SELECT * FROM cms_user WHERE username LIKE '___';

--用户名第二位为i的用户
SELECT * FROM cms_user WHERE username LIKE '_I%';

SELECT * FROM cms_user WHERE username NOT LIKE '_I%';
  • 分组查询
-- 查询id,sex,用户名详情按照性别分组
SELECT id,sex,GROUP_CONCAT(username) FROM cms_user GROUP BY sex;

-- 统计表中所有记录
SELECT COUNT(*) AS totalUsers FROM cms_user;

-- WITH ROLLUP 每列末尾添加汇总
SELECT id,sex,
COUNT(*) AS totalUsers,
MAX(age) AS max_age,
MIN(age) AS min_age
FROM cms_user
GROUP BY sex WITH ROLLUP;

-- HAVING子句 查询组中人数大于2并且最大年龄大于60的
SELECT sex,GROUP_CONCAT(username) AS users,
COUNT(*) AS totalUsers,
MAX(age) AS max_age,
SUM(age) AS sum_age
FROM cms_user 
GROUP BY sex
HAVING COUNT(*)>2 AND MAX(age)>60;
  • 排序
-- 返回表中记录的随机排列
SELECT * FROM cms_user ORDER BY RAND()
-- 按照proId升序排列,按照age降序排列
SELECT * FROM cms_user ORDER BY proId, age DESC;
  • 限制条数
-- 显示前三条记录
SELECT * FROM cms_user LIMIT 3
-- 第一个参数为起始记录,第二个参数为每页记录数
SELECT * FROM cms_user LIMIT 0,3

-- 更新用户名为4位的用户,让其已有年龄-3
UPDATE cms_user SET age=age-3 WHERE username LIKE '____';
-- 按照id降序排列,更新前3条
UPDATE cms_user SET age=age+10 ORDER BY id DESC LIMIT 3;

-内连接查询

-- 两表内连接查询
SELECT u.id,u.username,u.email,u.sex,p.proName
FROM provinces AS p
JOIN cms_user AS u
ON u.proId=p.id;

-- 三表内连接查询
SELECT n.id,n.title,c.cateName,a.username,a.role
FROM cms_cate AS c
JOIN cms_news AS n
ON n.cId=c.id
JOIN cms_admin AS a
ON n.aId=a.id;
  • 外连接
-- 左外连接 以左表为主
SELECT u.id,u.username,u.email,u.sex,p.proName
FROM cms_user AS u
LEFT JOIN provinces AS p
ON u.proId=p.id;

-- 右外连接 以右表为主
SELECT u.id,u.username,u.email,u.sex,p.proName
FROM provinces AS p
RIGHT JOIN cms_user AS u
ON u.proId=p.id;
  • 外键
    外键用于保持数据库的一致性和完整性,限制表中的操作。
-- 在创建表时指定外键
CREATE TABLE IF NOT EXISTS employee(
id SMALLINT UNSIGNED AUTO_INCREMENT KEY,
username VARCHAR(20) NOT NULL UNIQUE,
depId TINYINT UNSIGNED,
CONSTRAINT emp_fk_dep FOREIGN KEY(depId) REFERENCES department(id)
)ENGINE=INNODB;

-- RESTRICT(默认):若影响到子表记录,拒绝父表的更新或删除记录
-- CASCADE:父表和子表同步更新和删除记录
-- SET NULL:父表更新或删除影响到的子表记录置NULL,该字段不能设置为NOT NULL

CREATE TABLE IF NOT EXISTS employee(
id SMALLINT UNSIGNED AUTO_INCREMENT KEY,
username VARCHAR(20) NOT NULL UNIQUE,
depId TINYINT UNSIGNED,
FOREIGN KEY(depId) REFERENCES department(id) ON DELETE CASCADE ON UPDATE CASCADE
)ENGINE=INNODB;
  • 联合查询
-- 联合查询 (联合查询结果列数必须相同)
SELECT username FROM employee UNION SELECT username FROM cms_user;
-- UNION去重, UNION ALL不去重
SELECT username FROM employee UNION ALL SELECT username FROM cms_user;
  • 子查询
SELECT id,username FROM student WHERE score>=(SELECT level FROM scholarship WHERE id=1);

--根据子查询是否为空,判断是否执行外层查询
SELECT id,username FROM employee WHERE EXISTS(SELECT * FROM department WHERE id=4);
SELECT id,username FROM employee WHERE NOT EXISTS(SELECT * FROM department WHERE id=4);


-- ANY和SOME等价
SELECT id,username,score FROM student WHERE score>=ANY(SELECT level FROM scholarship);
SELECT id,username,score FROM student WHERE score>=SOME(SELECT level FROM scholarship);

-- 查询所有学员中获得一等奖学金的学员
SELECT id,username,score FROM student WHERE score >=ALL(SELECT level FROM scholarship);

-- 根据查询插入记录
INSERT test1(id,num) SELECT id,score FROM student;
  • 利用正则表达式查询
-- ^匹配字符开始的部分
-- 查询用户名以t开始的用户
SELECT * FROM cms_user WHERE username REGEXP '^t';

-- $匹配字符串结尾的部分

SELECT * FROM cms_user WHERE username REGEXP 'g$';


-- .代表任意字符

SELECT * FROM cms_user WHERE username REGEXP '.';

SELECT * FROM cms_user WHERE username REGEXP 'r..g';

SELECT * FROM cms_user WHERE username LIKE 'r__g';

-- [字符集合] [lto]

SELECT * FROM cms_user WHERE username REGEXP '[lto]';

-- [^字符集合] 除了字符集合中的内容
SELECT * FROM cms_user WHERE username REGEXP '[^lto]';

-- 从a到k的字符集合
SELECT * FROM cms_user WHERE username REGEXP '[a-k]';

SELECT * FROM cms_user WHERE username REGEXP '[^a-m]';

-- 包含ng或qu字符
SELECT * FROM cms_user WHERE username REGEXP 'ng|qu';

SELECT * FROM cms_user WHERE username REGEXP 'ng|qu|te';

-- *表示包含大于等于0个目标字符,+表示包含大于等于1个目标字符
SELECT * FROM cms_user WHERE username REGEXP 'que*';

SELECT * FROM cms_user WHERE username REGEXP 't+';

-- 指定包含字符的数量范围
SELECT * FROM cms_user WHERE username REGEXP 'que{2}';

SELECT * FROM cms_user WHERE username REGEXP 'qu{1}e{1,3}';
  • 常用内置函数
    http://c.biancheng.net/mysql/function/

索引

-- 建表时创建索引
CREATE TABLE test4(
id TINYINT UNSIGNED,
username VARCHAR(20),
INDEX in_id(id),
KEY in_username(username)

-- 后续添加索引
CREATE INDEX in_id ON test4(id);
ALTER TABLE test4 ADD INDEX in_username(username);

-- 删除索引
DROP INDEX in_id ON test4;
ALTER TABLE test4 DROP INDEX in_username;

-- 创建多列索引
CREATE TABLE test8(
id TINYINT UNSIGNED AUTO_INCREMENT KEY,
test1 VARCHAR(20) NOT NULL,
test2 VARCHAR(20) NOT NULL,
test3 VARCHAR(20) NOT NULL,
test4 VARCHAR(20) NOT NULL,
INDEX mul_t1_t2_t3(test1,test2,test3)
);

你可能感兴趣的:(Mysql,数据库,mysql)