SQL语法
SQL语言的语法标准
SQL作为关系型数据库所使用的标准语言,最初是基于IBM的实现在1986年被批准的。1987年,SQL作为国际标准。
SQL的版本演变:
SQL-86, SQL-89, SQL-92, SQL-99, SQL-03
SQL语言的规范
1、在数据库系统中,SQL语句不区分大小写(建议用大写)
2、字符串常量区分大小写
3、SQL语句可单行或多行书写,以";"结尾
4、关键词不能跨多行或简写
5、用空格来和缩进提高语句的可读性
6、子句通常位于独立行,便于编辑,提高可读性
7、注释
SQL标准:/*注释内容*/ 多行注释 -- 注释内容 单行注释,注意有空格 MYSQL注释:#
数据库对象
1、数据库的组件(对象)
数据库、表、索引、视图、用户、存储过程、函数、触发器、事件调度器
2、命名规则
必须以字母开头
可包括数字和三个特殊字符(#_$)
不要使用MYSQL的保留字
同database(Schema)下的 对象不能同名
SQL语句构成
keyword组成clause
多条clause组成语句
示例
select * select子句 from products from子句 where price>400 where子句
说明:一组SQL语句,由三个自居构成,select,from和where是关键字
数据库操作
1、创建库:
create database [if not exists] db_name; 创建数据库
character set 'character set name' 设置字符集类型
collate 'collate name' 设置排序规则
2、删除数据库
drop database 需删除的表名;
3、查看支持所有字符集:
show character set;
4、查看支持所有排序规则:
show collation;
5、获取命令使用帮助:
MYSQL>help keyword;
6、查看数据库列表:
mysql>show databases;
创建数据库db1:create database db1;
指定当前数据库db1:use db1
mysql 客户的的命令结束不用加‘;’而SQL标准语句中的需加‘;’
查看表的列表:show tables;
表
1、表的关系:二位关系
2、设计表:遵循规范
3、定义:字段,索引
字段:字段名,字段数据类型,修饰符
约束,索引:应该创建在经常用作查询条件的字段上
创建表
直接创建
create table tb1_name(create_definition,...)
create table students ( id tinyint unsigned not null primary key,name char(10) not null,sex char(1),phone char(11) );
(第一项为创建的id,采用最小的整数,不为空,且为主键;第二项为姓名;给定十个字符;第四个为性别,给一个字符;第五项为电话号码,设定为11个字符)
create table emp ( id int unsigned auto_increment primary key,name char(4) not null ,sex char(1) default ‘m’,adress char(20) );
auto_increment:数字自动递增;unsigned 放在int定义数字的后面
注意:一个汉字,字母数字在char里都算一个字符。primary key放在最后;添加各种修饰符要注意前后顺序,如上例中,如果将修饰符的顺序更改则会报错不能生成此表;
通过查询现存表创建;新表会被直接插入查询而来的数据
CREATE TABLE [IF NOT EXISTS] tbl_name select_statement
MariaDB [db1]> CREATE TABLE user SELECT user,host,password FROM mysql.user;
如果只想模仿查询旧表创建一个无记录的表我们可以加入条件 WHERE 0=1;
MariaDB [db1]> CREATE TABLE user SELECT user,host,password FROM mysql.user WHERE 1=0 ;
通过复制现存的表的表结构创建,但不复制数据
CREATE TABLE [IF NOT EXISTS] tbl_name LIKE old_tbl_name
MariaDB [db1]> CREATE TABLE user3 LIKE mysql.user;
查看表
查看表结构:desc tbl_name; 查看创建表的命令:show create table tbl_name; 查看表状态:show table status like 'tbl_name'; 查看指定库中所有表状态:show table status from dbl_name; 查看库里的表;(首先进入到此库中然后查看):show tables; 查看单个表状态:show table status like ‘tbl_name’\G; (表名必须要加引号) 删除库里的某个表: (首先还是要进入到存放此表的库里,查看后删除):drop table tbl_name;
数据类型 :
选择正确的数据类型对于获得高性能至关重要
三大原则:
更小的通常更好,尽量使用可正确存储数据的最小数据类型 简单就好,简单数据类型的操作通常需要更少的CPU周期 尽量避免NULL,包含为NULL的列,对MySQL更难优化
1、整数的范围(找自己表合适的使用,使用越大的范围占用的内存空间越大)
tinyint 1个字节 范围(-128~127) smallint 2个字节 范围(-32768~32767) mediumint 3个字节 范围(-8388608~8388607) int 4个字节 范围(-2147483648~2147483647) (无论是几都要占用4个字节) bigint 8个字节 范围(+-9.22*10的18次方) (无论是几都要占用8个字节)
取值范围如果加了unsigned,则最大值翻倍,如tinyint unsigned的取值范围为(0~255) 取正整数。
2、浮点型(float和double),近似值
float(m,d) 单精度浮点型 8位精度(4字节) m总个数,d小数位 double(m,d) 双精度浮点型16位精度(8字节) m总个数,d小数位 设一个字段定义为float(6,3),如果插入一个数123.45678,实际数据库里存的是 123.457,但总个数还以实际为准,即6位
3、定点数
在数据库中存放的是精确值,存为十进制 decimal(m,d) 参数m<65 是总个数,d<30且 d<m 是小数位
4 .字符串(char,varchar,_text)
char(n) 固定长度,最多255个字符 (常用的定义表字符的长度最少时4个字符,与下面的比效率高) varchar(n)可变长度,最多65535个字符 (同上最少可以为一个字符减少空间的使用,但效率低) tinytext 可变长度,最多255个字符 text 可变长度,最多65535个字符 mediumtext 可变长度,最多2的24次方-1个字符 longtext 可变长度,最多2的32次方-1个字符 BINARY(M) 固定长度,可存二进制或字符,长度为0-M字节 VARBINARY(M) 可变长度,可存二进制或字符,允许长度为0-M字节
修饰符
• NULL 数据列可包含NULL值
• NOT NULL 数据列不允许包含NULL值
• DEFAULT 默认值 • PRIMARY KEY 主键
• UNIQUE KEY 唯一键
• CHARACTER SET name 指定一个字符集数值型
• AUTO_INCREMENT 自动递增,适用于整数类型 (数字自动增长不需要手动在添加了)
• UNSIGNED 无符号
DML: 数据操作语言
MariaDB [testdb]> DESC students; #示例表 +--------+---------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------+---------------------+------+-----+---------+----------------+ | id | tinyint(3) unsigned | NO | PRI | NULL | auto_increment | | name | varchar(30) | NO | | NULL | | | ages | tinyint(2) | NO | | NULL | | | gender | enum('M','F') | YES | | NULL | | +--------+---------------------+------+-----+---------+----------------+
1、INSERT 插入数据
- 单条记录插入
INSERT INTO tb_name (col1,col2,...) VALUES (val1,val2,...);
MariaDB [testdb]> INSERT students(id,name,ages,gender) VALUES (1,'tom',26,'M'); MariaDB [testdb]> INSERT students(name,ages,gender) VALUES ('jerry',19,'M'); MariaDB [testdb]> INSERT students(name,ages,gender) VALUES ('maria',19,'M'); MariaDB [testdb]> INSERT students SET name='ouyangfeng',ages=56,gender='M';
- 多条记录插入
INSERT INTO tb_name (col1,col2,...) VALUES (val1,val2,...)[,(val1,val2,...),...];
MariaDB [testdb]> INSERT students(name,ages,gender) VALUES ('xiaolongnv',18,'F'),('dongfangbubai',28,'F'); MariaDB [testdb]> SELECT * FROM students; +----+---------------+------+--------+ | id | name | ages | gender | +----+---------------+------+--------+ | 1 | tom | 26 | M | | 2 | jerry | 19 | M | | 3 | maria | 19 | M | | 4 | xiaolongnv | 18 | F | | 5 | dongfangbubai | 28 | F | | 6 | ouyangfeng | 56 | M | +----+---------------+------+--------+
- 从其他表查询数据保存到此表中
MariaDB [testdb]> ALTER TABLE students ADD address TEXT; #加个字段做测试用 MariaDB [testdb]> INSERT students(name,address) SELECT user,host FROM mysql.user; MariaDB [testdb]> SELECT * FROM students; +----+---------------+------+--------+-----------+ | id | name | ages | gender | address | +----+---------------+------+--------+-----------+ | 1 | tom | 26 | M | NULL | | 2 | jerry | 19 | M | NULL | | 3 | maria | 19 | M | NULL | | 4 | xiaolongnv | 18 | F | NULL | | 5 | dongfangbubai | 28 | F | NULL | | 6 | ouyangfeng | 56 | M | NULL | | 7 | root | 0 | NULL | 127.0.0.1 | | 8 | root | 0 | NULL | ::1 | | 9 | | 0 | NULL | centos7 | | 10 | root | 0 | NULL | centos7 | | 11 | | 0 | NULL | localhost | | 12 | root | 0 | NULL | localhost | +----+---------------+------+--------+-----------+
2、UPDATE 修改数据
UPDATE tbl_name SET col1=value1,col2=value2,... WHERE col=value;
MariaDB [testdb]> UPDATE students SET gender='F' WHERE id=3;
3、DELETE 删除数据
MariaDB [testdb]> DELETE FROM students WHERE name=''; #删除名字为空的记录 MariaDB [testdb]> TRUNCATE TABLE user; #快速删除整个表,且不可恢复
注意:
delete from students where id=4; (删除id=4的哪一行)
delete from students;如果不写where限定条件,默认会删除此表的所有内容,如果在配置文件里面添加
vim /etc/my.cnf.d/mysql-clients.cnf #当然加限制条件是要退出mysql
[mysql]
safe-updates
添加此行内容就不会删除所有的内容了。
SELECT:数据查询
- AS:别名
- WHERE:指明过滤条件以实现“选择”的功能
- +, -, *, /, %:算术操作符
- =, !=, <>, >, <, >=, <=:比较操作符
- between min_num AND max_num:在min_num和max_mun之间
- IN (element1,element2,...):在element...中的
- IS NULL:为空
- IS NOT NULL:不为空
- LIKE:做匹配,像。。。
- %:任意长度的任意字符
- _:单个任意字符
- RLIKE:正则表达式,不建议用
- REGEXP:同上
- NOT, AND, OR, XOR:逻辑操作符
- GROUP BY:根据指定的条件把查询结果进行“分组”以用于做“聚合”运算
- AVG() 平均数
- MAX() 最大数
- MIN() 最小数
- COUNT() 统计
- SUM() 求和
- HAVING :对分组聚合运算后的结果指定过滤条件。类似WHERE的作用,但只能在分组中使用
- ORDER BY:排序
- ASC:正序,默认
- DESC:倒序
- -KEYWORD:在排序时在关键字前加-可以避免把NULL排在前边
- LIMIT [[offset,]row_count]:对查询的结果进行输出行数数量限制
1、选择
MariaDB [testdb]> SELECT * FROM students WHERE name='maria'; #查询maria的信息 MariaDB [testdb]> SELECT * FROM students WHERE id BETWEEN 2 AND 5; #查询2到5号学生的信息 MariaDB [testdb]> SELECT * FROM students WHERE name IN ('jerry','xiaolongnv'); #查询jerry和xiaolongnv的信息 MariaDB [testdb]> SELECT * FROM students WHERE gender IS NOT NULL; #查询年龄不为空的信息 MariaDB [testdb]> SELECT * FROM students WHERE name LIKE '%o%'; #查询姓名中包含'o'的信息
2、投影
MariaDB [testdb]> SELECT user AS 用户,host AS 主机,password AS 密码 FROM mysql.user;
3、分组
MariaDB [testdb]> SELECT gender,AVG(ages) FROM students GROUP BY gender; #查询男生、女生年龄的平均值 MariaDB [testdb]> SELECT gender,AVG(ages) FROM students GROUP BY gender HAVING gender='M'; #只显示男生的平均年龄信息
4、排序
MariaDB [testdb]> SELECT * FROM students ORDER BY ages DESC; #按年龄排序,倒序显示 MariaDB [testdb]> SELECT * FROM students WHERE ages > 0 ORDER BY ages LIMIT 3; #按年龄排序,过滤年龄大于0的,正序排序,取前三条记录
多表查询
JOIN ON:交叉连接
INNER JOIN ON:内连接
LEFT OUTER JOIN ON:左外连接
RIGHT OUTER JOIN ON:右外连接
UNION ON:完全外连接