《MySQL高效编程》学习笔记--基础篇

1、启动MySQL监视器创建数据库


–启动–

mysql -u yonghuming -p
mysql -u yonghuming -p密码 无密码可省略 -p

–设定root密码–

mysqladmin -u root PASSWORD 密码

退出 exit or quit

–创建数据库与表–

用途 语法
显示数据库一览 SHOW DATABASES; 不区分大小写
删除数据库 DROP DATABASE 数据库名;
创建数据库 CREATE DATABASE 数据库名;

注:库名、列名、表名 在windows中不区分大小写,在linux中区分

–创建新用户并赋予其对数据库的操作权限–

GRANT ALL PRIVILEGES ON 数据库名.* TO 用户名@localhost IDENTIFIED BY 密码
其中 all privileges 表示所有权限 可选权限有 CREATE(创建) SELECT (检索) UPDATE(更新)DALETE(删除)
数据库名.表名 *表示该数据库下的所有表

–创建表–

指定使用的数据库 use 数据库;
显示现在使用中的数据库 select database();

创建新表

create table 表名 (域名 数据类型 列选项[,…])
创建表时指定字符集
在 CREATE TABLE ~ 后加上 CHARSET=utf8;
显示所有的表 show tables;
显示表结构 desc 表名; or describe
《MySQL高效编程》学习笔记--基础篇_第1张图片
《MySQL高效编程》学习笔记--基础篇_第2张图片

–数据插入及显示–

插入数据 insert into 表名(列名1,列名2,…) values (数据1,数据2,…)
显示表中数据 select 列名1,列名2,… FROM 表名
显示全部 SELECT * FROM 表名

–定义自增序列–

数据类型必须为int等。 列的定义后附加AUTO_INCREMENT关键字 使用PRIMARY KEY设置其唯一性

mysql> create table good(id int auto_increment primary key , name varchar(30)) charset=utf8;

初始化自增序列

alter table 表名 auto_increment=0;

================================================

2、在MySQL中使用SQL


–导入sql数据库–

mysqladmin -u root -p create home //创建数据库home
mysqladmin -u root -p home < sampledb.sql //将数据导入到数据库home

–注释–

单行注释
– 注释
多行注释
/* 注释 */

==2.1、数据的插入、更新、删除==

—插入 insert 命令—-

INSERT INTO 表名 (列名1,列名2,。。。)VALUES (值1,值2,。。。);

—更新 UPDATE 命令—

UPDATA 表名 SET 列名1=值1,列名2=值2,。。。WHERE 条件表达式;
更新已经存在的记录 符合where的条件表达式

mysql> UPDATE customer SET nam='李玉芝', birth='1980-09-09' WHERE mid = 'G002'; --注意最后一个值后没有逗号

where条件表达式可以省略,此时将对所有数据更新

mysql> UPDATE customer SET birth=NULL;

—删除 DELETE 命令—

DELETE FROM 表名 WHERE 条件表达式;
限制条件省略时将删除表中所有数据
TRUNCATE TABLE 命令也能够删除表中所有数据

—数据检索 SELECT命令—

SELECT 列名1,列名2,。。。FROM 表名[条件表达式等];

1– 明确指定列名

mysql> SELECT nam,mid FROM customer;

2– 条件检索

mysql> SELECT nam,birth FROM customer WHERE birth>='1980/01/01';

比较运算符
大于 > <小于 =等于 >=大于等于 <= 小于等于 <>不相等
IS [NOT] NULL 为NULL nam is NULL
[NOT] LIKE 指定目标一致(不一致) nam LIKE ‘小%’
[NOT] BETWEEN 包含在指定范围内 (不包含) price BETWEEN 3000 AND 4000
[NOT] IN 包含在指定候补值内(不包含) mid IN (‘G0001’,’G0002’,’G0003’)

3– 模糊检索

mysql> SELECT nam FROM customer WHERE nam LIKE '李%';
外卡[wildcard]符号 [%] 表示0个以上的字符 [ _ ] 表示一个字符

4– NULL条件

mysql> SELECT nam FROM customer WHERE birth is NULL;

5– 多个条件表达式的组合

mysql> SELECT nam,birth,sex FROM customer WHERE sex ='1' AND birth IS NOT NULL;

6– 结果排序

mysql> SELECT nam,birth,sex FROM customer ORDER BY sex ASC, birth DESC;
ORDER BY 排序表达式 [排序列名 排序方式] 升序 ASC; 降序 DESC
在MySQL和SQL Server中NULL为最小值,Oracle中为最大值

7– 取得指定件数(m到n)间记录

mysql> SELECT nam ,birth FROM customer ORDER BY birth DESC LIMIT 2;
[LIMIT 2] 表示从起始位置取2件 [LIMIT 起始位置,件数] 原则上与order by命令同时使用

8– 数据分组

mysql> SELECT sex, COUNT(mid) FROM customer GROUP BY sex;
GROUP BY通常与统计函数一起使用,取得列中只能使用分组化用的列以及统计列。

【主要统计函数】

AVG() 均值 COUNT 件数 MAX MIN SUM

9– 列的别名

mysql> SELECT sex , count(mid) AS cnt FROM customer group by sex;
使用AS 指定别名

==2.2、运算符与数据库函数==

–运算符—

算术运算符 + - * / DIV 取整 % 取余
比较运算符 > < =
布尔运算符 AND OR

–数据库函数–

《MySQL高效编程》学习笔记--基础篇_第3张图片
《MySQL高效编程》学习笔记--基础篇_第4张图片《MySQL高效编程》学习笔记--基础篇_第5张图片
举例介绍:

1– LENGTH 函数 返回字节数

mysql> SELECT LENGTH('理由'); -- 返回4或6 gbk一个汉字2字节 utf8一个汉字3字节
mysql> SELECT CHAR_LENGTH('理由'); --返回2
返回bit单位长度 BIT_LENGTH

2– FLOOR/CEILING/ROUND函数

小数处理
ceiling 返回比小数值大的最小整数,FLOOR返回比小数值小的最大整数,ROUND四舍五入

mysql> SELECT CEILING(2.5);--3
mysql> SELECT FLOOR(-2.5);--  -3
mysql> SELECT CEILING(-2.5);--  -2 
mysql> SELECT ROUND(114.566);--  115
mysql> SELECT ROUND(114.566,2);--  114.57
mysql> SELECT ROUND(114.566,-2);--  100
3– DATE_ADD函数

参数type表示加减算的单位,进行减法运算时参数var设为负值

mysql> SELECT DATE_ADD('2017-01-31 12:00:00',INTERVAL 1 MONTH) AS newtime;
+---------------------+
| newtime             |
+---------------------+
| 2017-02-28 12:00:00 |
+---------------------+
1 row in set (0.00 sec)
mysql> SELECT DATE_ADD('2017-01-31 12:00:00',INTERVAL -10 HOUR) AS newtime;
+---------------------+
| newtime             |
+---------------------+
| 2017-01-31 02:00:00 |
+---------------------+
1 row in set (0.00 sec)
mysql> SELECT DATE_ADD('2017-01-31 12:00:00',INTERVAL '10:50' MINUTE_SECOND) AS newtime;
+---------------------+
| newtime             |
+---------------------+
| 2017-01-31 12:10:50 |
+---------------------+
1 row in set (0.00 sec)

4– EXTRACT 函数

从日期中取得任意元素时使用

mysql> SELECT EXTRACT(YEAR_MONTH FROM '2017-01-28 12:00:00');
+------------------------------------------------+
| EXTRACT(YEAR_MONTH FROM '2017-01-28 12:00:00') |
+------------------------------------------------+
|                                         201701 |
+------------------------------------------------+
1 row in set (0.00 sec)

type有 YEAR\ QUARTER \ MONTH\ MONTHNAME\ DAYOFMONTH(日) \ DAYNAME(星期名) \ DAYFORWEEK(星期号码)\
HOUR \MINUTE\ SECOND \MICROSECOND等

5–CASE 函数

进行简单的条件判断
CASE 表达式
WHEN 比较值1 THEN 结果1
WHEN 比较值2 THEN 结果2

[ELSE 结果N]
END

mysql> SELECT nam,
    -> CASE sex
    ->   WHEN 0 THEN '男'
    ->   WHEN 1 THEN '女'
    ->   ELSE 'OTH'
    -> END AS sex
    -> FROM customer;
mysql> SELECT pname,
    -> CASE 
    ->   WHEN price <1000 THEN '低'
    ->   WHEN price <=3000 THEN '一般'
    ->   ELSE '高'
    -> END AS price
    -> FROM product;

==2.3、多个表的连接===

–内连接—

即表间主键与外键进行相连,只取得键值一致的数据 INNER JOIN…ON
SELECT 列名1… FROM 表1
INNER JOIN 表2
ON 表1.外键 =表2.主键
[WHERE /ORDER BY 语句等]

–外连接–

左外连接

SELECT 列名1… FROM 表1
LEFT OUTER JOIN 表2
ON 表1.外键 =表2.主键 [WHERE /ORDER BY 语句等]

右外连接

SELECT 列名1… FROM 表1
RIGHT OUTER JOIN 表2
ON 表1.外键 =表2.主键 [WHERE /ORDER BY 语句等]
《MySQL高效编程》学习笔记--基础篇_第6张图片

==2.4、在其他查询的基础上进行数据检索==

–基本子查询–

从产品表中查询超过平均价的商品
mysql> SELECT * FROM product WHERE price >(select AVG(price) FROM product);

–多个返回值的子查询–

检索在某日没有下单的用户
mysql> SELECT name, address FROM user WHERE uid not in (SELECT uid FROM order_basic WHERE odate ='2010-07024');

–子查询与EXISTS运算符–

抽出至少下过一单的用户信息
mysql> SELECT name,address FROM user WHERE EXISTS(SELECT * FROM order_basic WHERE user.uid = order_basic.uid);

=======================================================

3、表的维护和改造


==3.1、修改表的列结构==

ALTER TABLE命令
修改种类有 MODIFY \ CHANGE \ ADD \ DROP等

–改变列的类型–

ALTER TABLE 表名 MODIFY 列名 数据类型;

–追加新列–

ALTER TABLE 表名 ADD 列名 数据类型; – 在最后追加
ALTER TABLE 表名 ADD 列名 数据类型 FIRST; – 在开头追加
ALTER TABLE 表名 ADD 列名2 数据类型 AFTER 列名1; – 在任意位置追加,追加在列名1后

–改变列的位置–

ALTER TABLE 表名 MODIFY 列名1 数据类型 AFTER 列名2; –调整列1到列2后面

–改变列名与类型–

ALTER TABLE 表名 CHANGE 修改前列名 修改后列名 修改后数据类型;

–删除列–

ALTER TABLE 表名 DROP 列名;

==3.2、复制表和删除表==

–复制表的列构造以及数据来创建新表–

CREATE TABLE 新表名 SELECT * FROM 旧表名;
此方法可能发生列属性被改变的情况,复制完成后用DESC命令来确认表构造

–复制表的列构造创建新表–

CREATE TABLE 新表名 LIKE 旧表名;

–数据的复制–

INSERT INTO 表名 SELECT * FROM 含有数据的表;
INSERT INTO 表名(列名) SELECT 列名 FROM 含有数据的表; –将旧表的某列复制到新表上

与第一种方法相同,可以加入WHERE和LIMIT等限制语句来限制复制数据的量

–表的删除–

DROP TABLE 表名;
DROP TABLE IF EXISTS 表名; – 表存在时删除表

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