赞
踩
目录
PS:没有MySQL的小伙伴可以从地址http://dev.mysql.com/downloads/mysql/中选择windows的版本下载
SQL语句有很多,最好进行分门别类,这样更容易记忆。
可以分为:
DML:数据操作语言(凡是对表当中的数据进行增删改的都是DML)
insert 增
delete 删
update 改
DQL:数据查询语言(凡是带有select关键字的都是查询语句)
DDL:数据定义语言 (DDL主要操作的是表的结构。不是表中的数据)
凡是带有create、drop、alter的都是DDL;(这个增删改和DML不同,这个主要是对表结构进行操作)
DCL:数据控制语言 (例如:授权grant、撤销权限revoke....)
例如:授权grant、撤销权限revoke....
TCL:事务控制语言 (事务提交:commit;事务回滚:rollback)
mysql中存在4个控制权限的表,分别为user表,db表,tables_priv表,columns_priv表
- #查看用户权限信息
- SELECT USER,HOST FROM mysql.user; #查看mysql有哪些用户,对应的主机名是什么
- SHOW GRANTS FOR root@'localhost'; # 查看root这个用户在本机有哪些权限
- -----------------------------------------------------
-
- #创建用户 :CREATE USER
- CREATE USER test@localhost; #创建一个test的用户,这个用户只能在本机登录
- CREATE USER test@localhost IDENTIFIED BY '123456'; #指定密码
- -----------------------------------------------------------------
-
- #删除用户 :DROP USER
- DROP USER test@localhost;
-
- ----------------------------------------------------
- #添加权限 :GRANT 什么权限 ON 所有数据库.所有表 TO 用户名字 (WITH GRANT OPTION :可以把自己的权限赋给别的用户)
- GRANT ALL PRIVILEGES ON '*' TO test@localhost;
- GRANT ALL PRIVILEGES ON '*' TO test@localhost WITH GRANT OPTION;
- GRANT ALL PRIVILEGES ON '*' TO test@localhost IDENTIFIED BY'123456'WITH GRANT OPTION;
-
- #添加更新studentno字段的权限,在myschool.student表里,给test这个用户
- GRANT UPDATE(studentno) ON myschool.student TO test@localhost IDENTIFIED BY '123456' WITH GRANT OPTION;
-
- #添加查询权限,只能查询myschool数据库里面的student表,给zhangsan这个用户
- GRANT SELECT ON myschool.student TO zhangsan@localhost WITH GRANT OPTION;
-
-
- -------------------------------------------------------------
- #删除/收回权限
- 格式:REVOKE 要移除的权限名字 在哪个数据库哪个表 从哪个用户移除
- REVOKE ALL PRIVILEGES ON '*' FROM test@localhost;

- ps: sm是我创建的数据库名
- ---------------------
- 创建数据库
- CREATE DATABASE sm;
- 查看数据库
- SHOW DATABASE sm;
- 选择使用数据库
- USE sm;
- 删除数据库(删库跑路,谨慎操作)
- DROP DATABASE sm;
- CREATE TABLE `表名`(
- `字段名1` 列类型[字段属性|约束] [索引] [注释],
- `字段名2` 列类型[字段属性|约束] [索引] [注释],
- ... ...
- `字段名n` 列类型[字段属性|约束] [索引] [注释]
- ) [表类型] [表字符集] [注释] ;
-
- ps: [] 中的内容选择性添加 , 多个字段之间使用 逗号分隔 ,最后一个字段无需添加逗号
作用 : 规定数据库中该列存放的数据类型
数值类型,字符串类型,日期和时间型等
数值类型 | 说明 |
tinyint | 非常小的数据 |
smallint | 较小的数据 |
mediumint | 中等大小的数据 |
int | 标准整数 |
bigint | 较大的整数 |
float | 单精度浮点数 |
double | 双精度浮点数 |
decimal | 字符串形式的浮点数 |
字符串类型 | 说明 |
char | 固定长字符串,检索快但费空间 |
varchar | 可变字符串 |
tinytext | 微型文本串 |
text | 文本串 |
日期和时间类型 | 说明 |
date | YYYY-MM-DD,日期格式 |
time | Hh:mm:ss , 时间格式 |
datetime | YY-MM-DD hh:mm:ss |
timestamp | YYYYMMDDhhmmss格式表示的时间戳 |
year | YYYY格式的年份值 |
ps: 类型没有列举完,欢迎补充
字段属性 | 说明 |
UNSIGNED | 无符号的,声明该数据列不允许负数。 |
ZEROFILL | 1 . 自动填充的,不足位数的用0来填充,如 int(3),5则为 005; 2. 使用zerofill会默认加unsigned(不允许负值)。 |
AUTO_INCREMENT | 1. 自动增长的,每添加一条数据,自动在上一个记录数上加1; 2. 通常用于设置主键时,且为整数类型; 3. 可定义起始值和步长 4. 如果不用于主键,则必须设置唯一索引 |
NULL 和 NOT NULL | 1. 默认为NULL,即没有插入该列的数值; 2. 如果设置为NOT NULL,则非空; |
DEFAULT | 1. 默认的,用于设置默认值; 2. 例如,性别字段,默认为“男”,否则为“女”;若无指定该列的值,则默认为“男”的值 |
COMMENT '注释内容'
常用的存储引擎: MyISAM 和 InnoDB (MySQL5.5以上版本默认为InnoDB)
名称 | MyISAM | InnoDB |
事务处理 | 不支持 | 支持 |
数据行锁定 | 不支持 | 支持 |
外键约束 | 不支持 | 支持 |
全文索引 | 支持 | 不支持 |
表空间大小 | 较小 | 较大 |
ps: 使用场景
MyISAM : 节约空间以及响应速度,适合以访问为主的应用
InnoDB : 注重安全,事务处理以及多用户操作的应用
charset = utf8;
- CREATE TABLE `student`(
- studentno INT(4) UNSIGNED NOT NULL COMMENT '学号',
- loginpwd VARCHAR(20) NOT NULL COMMENT '密码',
- studentname VARCHAR(50) NOT NULL COMMENT '学生姓名',
- sex CHAR(1) NOT NULL DEFAULT '男' COMMENT'性别',
- gradeid INT(4) UNSIGNED COMMENT '年纪编号',
- phone VARCHAR(50) COMMENT '联系电话',
- address VARCHAR(255) DEFAULT '地址不详' COMMENT '家庭住址',
- borndate DATETIME COMMENT '出生日期',
- email VARCHAR(50) COMMENT '邮箱账号',
- identitycard VARCHAR(18) COMMENT '身份证号'
- );
作用:完全清空一个数据库表,表的结构和索引约束不会变!
TRUNCATE `student`
- CREATE TABLE emp2 AS SELECT * FROM emp;
- ps:把后面的 emp表 快速的再创建一份 (原理为: 将一个查询结果当作一张表, 新建一份!)
- 修改表名 : ALTER TABLE 旧表名 RENAME AS 新表名
- 添加字段 : ALTER TABLE 表名 ADD 字段名 列类型[属性]
- 修改字段 : ALTER TABLE 表名 MODIFY 字段名 列类型[属性] #修改列的数据类型
- ALTER TABLE 表名 CHANGE 旧字段名 新字段名 列类型[属性] # 修改列的数据类型以及名称
- 删除字段 : ALTER TABLE 表名 OROP 字段名
约束类型 | 关键字 | 说明 |
非空约束 | NOT NULL | 如果字段不允许为空,则需要设置此约束 |
默认约束 | DEFAULT | 如果该字段没有赋值,赋予该字段默认值 |
唯一约束 | UNIQUE KEY | 设置该字段的值是唯一的,允许为空 |
主键约束 | PRIMARY KEY | 设置该字段为表的主键,可以作为该表记录的唯一标识 |
外键约束 | FOREIGN KEY | 用在两表之间简历关系,需要引用主表的哪一个字段 |
插入单行数据:
INSERT INTO 表名 (字段1,字段2,字段3,...) VALUES (值1,值2,值3,...);
插入多行数据:
- INSERT INTO 表名 (字段1,字段2,字段3,...) VALUES
- (值1,值2,值3,...),
- (值1,值2,值3,...),
- (值1,值2,值3,...),
- ....;
UPDATE 表名 SET 列名 = '要修改成什么' WHERE 条件判断,达成某种条件后才会修改;
DELETE FROM 表名 [WHERE 条件]
- SELECT * FROM 表名 #查询全部 ,效率低下,不推荐使用
-
- SELECT 字段1,字段2 FROM 表名 #查询指定字段
ps : SELECT语法 记住: select语句永远都不会进行修改操作(因为只负责查询),
在查询中使用“AS”关键字可以给查询的字段起别名。
作用: 去掉select 查询返回的记录结果中,重复的记录
SELECT DISTINCT name FROM student; #去掉重复名字,保证每个名字仅返回一条
作用: 用于检索数据表中符合条件的记录(太过简单,不再演示)
作用: 根据一个范围值来检索
SELECT 字段1,字段2,... FROM 表名 WHERE 字段x BETWEEN 值1 AND 值2
作用: 可以在WHERE 子句中,使用LIKE关键字,进行模糊匹配查询
"%" ,表示匹配0或任意多个字符
"_" ,表示匹配单个字符
- 例1: 找出名字中含有 o 的英文名:
- SELECT name FROM student WHERE name LIKE '%o%' ;
-
- 例2: 找出名字以 T 结尾的英文名:
- SELECT name FROM student WHERE name LIKE '%T' ;
-
- 例3: 找出名字以 K 开始的英文名:
- SELECT name FROM student WHERE name LIKE 'K%' ;
-
- 例4: 找出第二个字母是 A 的英文名:
- SELECT name FROM student WHERE name LIKE '_A%' ;
-
- 例5: 找出第三个字母是 R 的英文名:
- SELECT name FROM student WHERE name LIKE '__R%' ; //两个下划线
作用: 查询的 字段x的值, 至少与括号中的一个值相同即可匹配
SELECT 字段1,字段2,... FROM 表名 WHERE 字段x IN (值1,值2,值3,...)
函数名 | 作用 |
AVG(某字段) | 返回某字段的平均值 |
COUNT(某字段) | 返回某字段的行数 |
MAX(某字段) | 返回某字段的最大值 |
MIN(某字段) | 返回某字段的最小值 |
SUM(某字段) | 返回某字段的和 |
- #查询学生的总数。
- SELECT COUNT(studentname) FROM student;
- #查询课程编号为1的平均分。
- SELECT AVG(studentresult) FROM result WHERE subjectno = 1;
- #查询课程编号为1的最高分。
- SELECT MAX(studentresult) FROM result WHERE subjectno = 1;
- #查询课程编号为1的最低分。
- SELECT MIN(studentresult) FROM result WHERE subjectno = 1;
- #查询课程编号为1的成绩总和。
- SELECT SUM(studentresult) FROM result WHERE subjectno = 1;
函数名 | 作 用 | 举 例 |
CEIL(x) | 返回大于或等于数值x的最小整数 | SELECT CEIL(2.3) 返回:3 |
FLOOR(x) | 返回小于或等于数值x的最大整数 | SELECT FLOOR(2.3) 返回:2 |
RAND() | 返回0~1间的随机数 | SELECT RAND() 返回:0.5525468583708134 |
函 数 名 | 作 用 | 举 例 |
CONCAT(str1, str1...strn) | 字符串连接 | SELECT CONCAT('My','S','QL'); 返回:MySQL |
INSERT(str,pos,len,newstr) | 字符串替换 | SELECT INSERT( '这是SQL Server数据库', 3, //从第三个开始 (S) (包括第三个) 10, //从上面选择的位置开始(S),往后几个位置(包括开始和结束) (r) 'MySQL' //替换选中部分 ); 返回:这是MySQL数据库 |
LOWER(str) | 将字符串转为小写 | SELECT LOWER('MySQL'); 返回:mysql |
UPPER(str) | 将字符串转为大写 | SELECT UPPER('MySQL'); 返回:MYSQL |
SUBSTRING (str,num,len) | 字符串截取 | SELECT SUBSTRING( 'JavaMySQLOracle',5,5); 返回:MySQL |
函数名 | 作用 | 举例(结果与当前时间有关) |
CURDATE() | 获取当前日期 | SELECT CURDATE(); 返回:2016-08-08 |
CURTIME() | 获取当前时间 | SELECT CURTIME(); 返回:19:19:26 |
NOW() | 获取当前日期和时间 | SELECT NOW(); 返回:2016-08-08 19:19:26 |
WEEK(date) | 返回日期date为一年中的第几周 | SELECT WEEK(NOW()); 返回:26 |
YEAR(date) | 返回日期date的年份 | SELECT YEAR(NOW()); 返回:2016 |
HOUR(time) | 返回时间time的小时值 | SELECT HOUR(NOW()); 返回:9 |
MINUTE(time) | 返回时间time的分钟值 | SELECT MINUTE(NOW()); 返回:43 |
DATEDIFF(date1,date2) | 返回日期参数date1和date2之间相隔的天数 | SELECT DATEDIFF(NOW(), '2008-8-8’); 返回:2881 |
ADDDATE(date,n) | 计算日期参数date加上n天后的日期 | SELECT ADDDATE(NOW(),5); 返回:2016-09-02 09:37:07 |
作用: 实现按一定顺序显示查询结果; 升序(ASC) 降序(DESC)
PS: 以ORDER BY 后面的第一个字段为主进行排序,只有第一个字段相等的时候,才会考虑逗号后的字段排序
作用: LIMIT,用于限制查询结果返回的数量
- select * from tableName limit [i] , n;
-
- 注:
- tableName : 数据表
- i : 为查询结果的索引值 (默认从0开始) //可以省略
- n : 为查询结果返回的数量
- 举例演示:找出每个工作岗位的工资和?
- SELECT job, sum(sal) FROM emp GROUP BY job;
- #GROUP BY job : 按照工作岗位的不同,分为不同的组,一组一组的求工资sal的和
>使用HAVING 可以对分完组之后的数据进行进一步过滤
>HAVING不能单独使用,HAVING不能代替WHERE,
>HAVING必须和GROUP BY 联合使用
>优化策略: WHERE 和 HAVING , 优先选择 WHERE , WHERE实在完成不了,再选择HAVING
- 一: 语法顺序
- 1. select
- ...
- 2. from
- ...
- 3. where
- ...
- 4. group by
- ...
- 5. having
- ...
- 6. order by
- ...
- 以上关键字只能按照这个顺序来, 不能颠倒
- 二: 执行顺序
- 1. from
- 2. where
- 3. group by //分组
- 4. having //过滤
- 5. select
- 6. order by //排序
- 声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/492404推荐阅读
相关标签
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。